diff --git a/include/mysql_thread.h b/include/mysql_thread.h index d5fe0ba85..e85ec6e53 100644 --- a/include/mysql_thread.h +++ b/include/mysql_thread.h @@ -280,6 +280,7 @@ class Standard_MySQL_Threads_Handler: public MySQL_Threads_Handler char *connect_timeout_server_error; char *default_schema; char *server_version; + uint8_t default_charset; bool servers_stats; #ifdef DEBUG bool session_debug; @@ -297,6 +298,7 @@ class Standard_MySQL_Threads_Handler: public MySQL_Threads_Handler virtual void commit(); char *get_variable_string(char *name); + uint8_t get_variable_uint8(char *name); uint16_t get_variable_uint16(char *name); int get_variable_int(char *name); virtual char * get_variable(char *name); // this is the public function, accessible from admin diff --git a/include/proxysql_structs.h b/include/proxysql_structs.h index d3a4c728a..7a62ea429 100644 --- a/include/proxysql_structs.h +++ b/include/proxysql_structs.h @@ -617,6 +617,7 @@ __thread int mysql_thread___ping_timeout_server; __thread int mysql_thread___connect_timeout_server; __thread char *mysql_thread___connect_timeout_server_error; __thread uint16_t mysql_thread___server_capabilities; +__thread uint8_t mysql_thread___default_charset; __thread int mysql_thread___poll_timeout; __thread bool mysql_thread___servers_stats; #ifdef DEBUG @@ -635,6 +636,7 @@ extern __thread int mysql_thread___ping_timeout_server; extern __thread int mysql_thread___connect_timeout_server; extern __thread char *mysql_thread___connect_timeout_server_error; extern __thread uint16_t mysql_thread___server_capabilities; +extern __thread uint8_t mysql_thread___default_charset; extern __thread int mysql_thread___poll_timeout; extern __thread bool mysql_thread___servers_stats; #ifdef DEBUG diff --git a/lib/MySQL_Protocol.cpp b/lib/MySQL_Protocol.cpp index 9fd9a5663..19ebeddd2 100644 --- a/lib/MySQL_Protocol.cpp +++ b/lib/MySQL_Protocol.cpp @@ -603,7 +603,7 @@ int MySQL_Protocol::parse_mysql_pkt(PtrSize_t *PS_entry, MySQL_Data_Stream *__my static unsigned char protocol_version=10; //static uint16_t server_capabilities=CLIENT_FOUND_ROWS | CLIENT_PROTOCOL_41 | CLIENT_IGNORE_SIGPIPE | CLIENT_TRANSACTIONS | CLIENT_SECURE_CONNECTION | CLIENT_CONNECT_WITH_DB | CLIENT_SSL; -static uint8_t server_language=33; +//static uint8_t server_language=33; static uint16_t server_status=1; //static char *mysql_server_version = (char *)"5.1.30"; @@ -1234,7 +1234,7 @@ bool MySQL_Protocol::generate_pkt_initial_handshake(bool send, void **ptr, unsig //+ sizeof(glovars.server_language) //+ sizeof(glovars.server_status) + sizeof(mysql_thread___server_capabilities) - + sizeof(server_language) + + sizeof(mysql_thread___default_charset) + sizeof(server_status) + 3 // unknown stuff + 10 // filler @@ -1281,7 +1281,7 @@ bool MySQL_Protocol::generate_pkt_initial_handshake(bool send, void **ptr, unsig memcpy(_ptr+l, (*myds)->myconn->scramble_buff+0, 8); l+=8; _ptr[l]=0x00; l+=1; //0x00 memcpy(_ptr+l,&mysql_thread___server_capabilities, sizeof(mysql_thread___server_capabilities)); l+=sizeof(mysql_thread___server_capabilities); - memcpy(_ptr+l,&server_language, sizeof(server_language)); l+=sizeof(server_language); + memcpy(_ptr+l,&mysql_thread___default_charset, sizeof(mysql_thread___default_charset)); l+=sizeof(mysql_thread___default_charset); memcpy(_ptr+l,&server_status, sizeof(server_status)); l+=sizeof(server_status); memcpy(_ptr+l,"\x0f\x80\x15",3); l+=3; for (i=0;i<10; i++) { _ptr[l]=0x00; l++; } //filler diff --git a/lib/Standard_MySQL_Thread.cpp b/lib/Standard_MySQL_Thread.cpp index 77a7a4aef..69dabbc1d 100644 --- a/lib/Standard_MySQL_Thread.cpp +++ b/lib/Standard_MySQL_Thread.cpp @@ -188,6 +188,7 @@ volatile static unsigned int __global_MySQL_Thread_Variables_version; static char * mysql_thread_variables_names[]= { (char *)"connect_timeout_server", (char *)"connect_timeout_server_error", + (char *)"default_charset", (char *)"ping_interval_server", (char *)"ping_timeout_server", (char *)"default_schema", @@ -274,6 +275,7 @@ Standard_MySQL_Threads_Handler::Standard_MySQL_Threads_Handler() { variables.ping_timeout_server=100; variables.connect_timeout_server_error=strdup((char *)"#2003:Can't connect to MySQL server"); variables.default_schema=strdup((char *)"information_schema"); + variables.default_charset=33; variables.server_version=strdup((char *)"5.1.30"); variables.server_capabilities=CLIENT_FOUND_ROWS | CLIENT_PROTOCOL_41 | CLIENT_IGNORE_SIGPIPE | CLIENT_TRANSACTIONS | CLIENT_SECURE_CONNECTION | CLIENT_CONNECT_WITH_DB | CLIENT_SSL; variables.poll_timeout=2000; @@ -311,6 +313,12 @@ uint16_t Standard_MySQL_Threads_Handler::get_variable_uint16(char *name) { return 0; } +uint8_t Standard_MySQL_Threads_Handler::get_variable_uint8(char *name) { + if (!strcmp(name,"default_charset")) return variables.default_charset; + proxy_error("Not existing variable: %s\n", name); assert(0); + return 0; +} + int Standard_MySQL_Threads_Handler::get_variable_int(char *name) { #ifdef DEBUG if (!strcmp(name,"session_debug")) return (int)variables.session_debug; @@ -336,6 +344,10 @@ char * Standard_MySQL_Threads_Handler::get_variable(char *name) { // this is the sprintf(intbuf,"%d",variables.server_capabilities); return strdup(intbuf); } + if (!strcmp(name,"default_charset")) { + sprintf(intbuf,"%d",variables.default_charset); + return strdup(intbuf); + } if (!strcasecmp(name,"connect_timeout_server")) { sprintf(intbuf,"%d",variables.connect_timeout_server); return strdup(intbuf); @@ -447,10 +459,19 @@ bool Standard_MySQL_Threads_Handler::set_variable(char *name, char *value) { // return false; } } - if (!strcmp(name,"server_capabilities")) { + if (!strcmp(name,"poll_timeout")) { + int intv=atoi(value); + if (intv > 10 && intv < 20000) { + variables.poll_timeout=intv; + return true; + } else { + return false; + } + } + if (!strcmp(name,"default_charset")) { int intv=atoi(value); - if (intv > 0) { - variables.server_capabilities=intv; + if (intv > 0 && intv < 256) { + variables.default_charset=intv; return true; } else { return false; @@ -1005,6 +1026,7 @@ void Standard_MySQL_Thread::refresh_variables() { if (mysql_thread___default_schema) free(mysql_thread___default_schema); mysql_thread___default_schema=GloMTH->get_variable_string((char *)"default_schema"); mysql_thread___server_capabilities=GloMTH->get_variable_uint16((char *)"server_capabilities"); + mysql_thread___default_charset=GloMTH->get_variable_uint8((char *)"default_charset"); mysql_thread___poll_timeout=GloMTH->get_variable_int((char *)"poll_timeout"); mysql_thread___servers_stats=(bool)GloMTH->get_variable_int((char *)"servers_stats"); #ifdef DEBUG @@ -1154,7 +1176,7 @@ SQLite3_result * Standard_MySQL_Thread::SQL3_Thread_status(MySQL_Session *sess) status_str+="\ndefault_schema : "; status_str.append(mysql_thread___default_schema); status_str+="\nserver_version : "; status_str.append(mysql_thread___server_version); - sprintf(buf,"\ncapabilities : %d\npoll_timeout : %d\n", mysql_thread___server_capabilities, mysql_thread___poll_timeout); + sprintf(buf,"\ncapabilities : %d\npoll_timeout : %d\ncharset : %d\n", mysql_thread___server_capabilities, mysql_thread___poll_timeout, mysql_thread___default_charset); status_str.append(buf); status_str+= "\n";