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.
This commit is contained in:
Markus Makela
2016-10-19 15:40:50 +03:00
parent b50e794be7
commit f1acc1f451
4 changed files with 15 additions and 0 deletions

View File

@ -2612,6 +2612,11 @@ static bool check_server_permissions(SERVICE *service, SERVER* server,
return my_errno != ER_ACCESS_DENIED_ERROR; 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) if (server->server_string == NULL)
{ {
const char *server_string = mysql_get_server_info(mysql); const char *server_string = mysql_get_server_info(mysql);

View File

@ -44,6 +44,9 @@
#include <log_manager.h> #include <log_manager.h>
#include <gw_ssl.h> #include <gw_ssl.h>
/** The latin1 charset */
#define SERVER_DEFAULT_CHARSET 0x08
static SPINLOCK server_spin = SPINLOCK_INIT; static SPINLOCK server_spin = SPINLOCK_INIT;
static SERVER *allServers = NULL; static SERVER *allServers = NULL;
@ -89,6 +92,7 @@ server_alloc(char *servname, char *protocol, unsigned short port)
server->persistmaxtime = 0; server->persistmaxtime = 0;
server->persistpoolmax = 0; server->persistpoolmax = 0;
server->slave_configured = false; server->slave_configured = false;
server->charset = SERVER_DEFAULT_CHARSET;
spinlock_init(&server->persistlock); spinlock_init(&server->persistlock);
spinlock_acquire(&server_spin); spinlock_acquire(&server_spin);

View File

@ -109,6 +109,7 @@ typedef struct server
long persistpoolmax; /**< Maximum size of persistent connections pool */ long persistpoolmax; /**< Maximum size of persistent connections pool */
long persistmaxtime; /**< Maximum number of seconds connection can live */ long persistmaxtime; /**< Maximum number of seconds connection can live */
int persistmax; /**< Maximum pool size actually achieved since startup */ int persistmax; /**< Maximum pool size actually achieved since startup */
uint8_t charset; /**< Default server character set */
#if defined(SS_DEBUG) #if defined(SS_DEBUG)
skygw_chk_t server_chk_tail; skygw_chk_t server_chk_tail;
#endif #endif

View File

@ -277,6 +277,11 @@ int MySQLSendHandshake(DCB* dcb)
int len_version_string = 0; int len_version_string = 0;
int id_num; int id_num;
if (dcb->service->dbref)
{
mysql_server_language = dcb->service->dbref->server->charset;
}
MySQLProtocol *protocol = DCB_PROTOCOL(dcb, MySQLProtocol); MySQLProtocol *protocol = DCB_PROTOCOL(dcb, MySQLProtocol);
GWBUF *buf; GWBUF *buf;