From f1acc1f4512f67943b1ccdd7284dd5fc64fdc76d Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Wed, 19 Oct 2016 15:40:50 +0300 Subject: [PATCH] Use the backend server charset The default character set should be copied from the server so that MaxScale appears to be the same. This fixes problems where utf8mb4 couldn't be taken into use because MaxScale would always send latin1 as the server charset. --- server/core/dbusers.c | 5 +++++ server/core/server.c | 4 ++++ server/include/server.h | 1 + server/modules/protocol/mysql_client.c | 5 +++++ 4 files changed, 15 insertions(+) diff --git a/server/core/dbusers.c b/server/core/dbusers.c index 0ebd8f8cd..04d4b8f04 100644 --- a/server/core/dbusers.c +++ b/server/core/dbusers.c @@ -2612,6 +2612,11 @@ static bool check_server_permissions(SERVICE *service, SERVER* server, return my_errno != ER_ACCESS_DENIED_ERROR; } + /** Copy the server charset */ + MY_CHARSET_INFO cs_info; + mysql_get_character_set_info(mysql, &cs_info); + server->charset = cs_info.number; + if (server->server_string == NULL) { const char *server_string = mysql_get_server_info(mysql); diff --git a/server/core/server.c b/server/core/server.c index a29198791..8de58eb5d 100644 --- a/server/core/server.c +++ b/server/core/server.c @@ -44,6 +44,9 @@ #include #include +/** The latin1 charset */ +#define SERVER_DEFAULT_CHARSET 0x08 + static SPINLOCK server_spin = SPINLOCK_INIT; static SERVER *allServers = NULL; @@ -89,6 +92,7 @@ server_alloc(char *servname, char *protocol, unsigned short port) server->persistmaxtime = 0; server->persistpoolmax = 0; server->slave_configured = false; + server->charset = SERVER_DEFAULT_CHARSET; spinlock_init(&server->persistlock); spinlock_acquire(&server_spin); diff --git a/server/include/server.h b/server/include/server.h index 5dfe79cfc..674a19370 100644 --- a/server/include/server.h +++ b/server/include/server.h @@ -109,6 +109,7 @@ typedef struct server long persistpoolmax; /**< Maximum size of persistent connections pool */ long persistmaxtime; /**< Maximum number of seconds connection can live */ int persistmax; /**< Maximum pool size actually achieved since startup */ + uint8_t charset; /**< Default server character set */ #if defined(SS_DEBUG) skygw_chk_t server_chk_tail; #endif diff --git a/server/modules/protocol/mysql_client.c b/server/modules/protocol/mysql_client.c index e7663308d..0146e819e 100644 --- a/server/modules/protocol/mysql_client.c +++ b/server/modules/protocol/mysql_client.c @@ -277,6 +277,11 @@ int MySQLSendHandshake(DCB* dcb) int len_version_string = 0; int id_num; + if (dcb->service->dbref) + { + mysql_server_language = dcb->service->dbref->server->charset; + } + MySQLProtocol *protocol = DCB_PROTOCOL(dcb, MySQLProtocol); GWBUF *buf;