From 21be8f4eef6a4701e24acbee33938765e220dc7a Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Tue, 29 Mar 2016 09:44:03 +0200 Subject: [PATCH] Moved connection_handler to mysql->extension --- include/ma_common.h | 3 +++ include/mysql.h | 2 +- libmariadb/mariadb_lib.c | 41 ++++++++++++++++---------------- plugins/connection/aurora.c | 38 ++++++++++++++--------------- plugins/connection/replication.c | 10 ++++---- unittest/libmariadb/connection.c | 3 +-- unittest/libmariadb/misc.c | 3 ++- 7 files changed, 52 insertions(+), 48 deletions(-) diff --git a/include/ma_common.h b/include/ma_common.h index 6aed2c13..c52af5a1 100644 --- a/include/ma_common.h +++ b/include/ma_common.h @@ -73,6 +73,9 @@ typedef struct st_connection_handler struct st_mariadb_net_extension { unsigned char *mbuff, *mbuff_end, *mbuff_pos; +}; + +struct st_mariadb_extension { MA_CONNECTION_HANDLER *conn_hdlr; }; diff --git a/include/mysql.h b/include/mysql.h index 3068d13a..c8b3670f 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -353,7 +353,7 @@ struct st_mysql_options { void *thd; my_bool *unbuffered_fetch_owner; char *info_buffer; - void *extension; + struct st_mariadb_extension *extension; } MYSQL; typedef struct st_mysql_res { diff --git a/libmariadb/mariadb_lib.c b/libmariadb/mariadb_lib.c index 649b2f54..c7410926 100644 --- a/libmariadb/mariadb_lib.c +++ b/libmariadb/mariadb_lib.c @@ -140,7 +140,7 @@ struct st_mariadb_methods MARIADB_DEFAULT_METHODS; #define native_password_plugin_name "mysql_native_password" #define IS_CONNHDLR_ACTIVE(mysql)\ - (((mysql)->net.extension->conn_hdlr)) + (((mysql)->extension->conn_hdlr)) static void end_server(MYSQL *mysql); static void mysql_close_memory(MYSQL *mysql); @@ -182,7 +182,6 @@ void net_get_error(char *buf, size_t buf_len, } } - /***************************************************************************** ** read a packet from server. Give error message if socket was down ** or packet is an error message @@ -391,7 +390,7 @@ mthd_my_send_cmd(MYSQL *mysql,enum enum_server_command command, const char *arg, if (IS_CONNHDLR_ACTIVE(mysql)) { - result= mysql->net.extension->conn_hdlr->plugin->set_connection(mysql, command, arg, length, skipp_check, opt_arg); + result= mysql->extension->conn_hdlr->plugin->set_connection(mysql, command, arg, length, skipp_check, opt_arg); if (result== -1) return(result); } @@ -952,12 +951,10 @@ mysql_init(MYSQL *mysql) } if (!(mysql->net.extension= (struct st_mariadb_net_extension *) - calloc(1, sizeof(struct st_mariadb_net_extension)))) - { - if (mysql->free_me) - free(mysql); - return 0; - } + calloc(1, sizeof(struct st_mariadb_net_extension))) || + !(mysql->extension= (struct st_mariadb_extension *) + calloc(1, sizeof(struct st_mariadb_extension)))) + goto error; mysql->options.report_data_truncation= 1; mysql->options.connect_timeout=CONNECT_TIMEOUT; mysql->charset= ma_default_charset_info; @@ -974,6 +971,10 @@ mysql_init(MYSQL *mysql) #endif mysql->options.reconnect= 0; return mysql; +error: + if (mysql->free_me) + free(mysql); + return 0; } int STDCALL @@ -1109,7 +1110,7 @@ mysql_real_connect(MYSQL *mysql, const char *host, const char *user, if (!(plugin= (MARIADB_CONNECTION_PLUGIN *)mysql_client_find_plugin(mysql, plugin_name, MARIADB_CLIENT_CONNECTION_PLUGIN))) return NULL; - if (!(mysql->net.extension->conn_hdlr= (MA_CONNECTION_HANDLER *)calloc(1, sizeof(MA_CONNECTION_HANDLER)))) + if (!(mysql->extension->conn_hdlr= (MA_CONNECTION_HANDLER *)calloc(1, sizeof(MA_CONNECTION_HANDLER)))) { SET_CLIENT_ERROR(mysql, CR_OUT_OF_MEMORY, SQLSTATE_UNKNOWN, 0); return NULL; @@ -1118,15 +1119,15 @@ mysql_real_connect(MYSQL *mysql, const char *host, const char *user, /* save URL for reconnect */ OPT_SET_EXTENDED_VALUE_STR(&mysql->options, url, host); - mysql->net.extension->conn_hdlr->plugin= plugin; + mysql->extension->conn_hdlr->plugin= plugin; if (plugin && plugin->connect) { MYSQL *my= plugin->connect(mysql, end, user, passwd, db, port, unix_socket, client_flag); if (!my) { - free(mysql->net.extension->conn_hdlr); - mysql->net.extension->conn_hdlr= NULL; + free(mysql->extension->conn_hdlr); + mysql->extension->conn_hdlr= NULL; } return my; } @@ -1536,8 +1537,8 @@ my_bool STDCALL mariadb_reconnect(MYSQL *mysql) /* check if connection handler is active */ if (IS_CONNHDLR_ACTIVE(mysql)) { - if (mysql->net.extension->conn_hdlr->plugin && mysql->net.extension->conn_hdlr->plugin->reconnect) - return(mysql->net.extension->conn_hdlr->plugin->reconnect(mysql)); + if (mysql->extension->conn_hdlr->plugin && mysql->extension->conn_hdlr->plugin->reconnect) + return(mysql->extension->conn_hdlr->plugin->reconnect(mysql)); } if (!mysql->options.reconnect || @@ -1551,10 +1552,10 @@ my_bool STDCALL mariadb_reconnect(MYSQL *mysql) mysql_init(&tmp_mysql); tmp_mysql.options=mysql->options; - if (mysql->net.extension->conn_hdlr) + if (mysql->extension->conn_hdlr) { - tmp_mysql.net.extension->conn_hdlr= mysql->net.extension->conn_hdlr; - mysql->net.extension->conn_hdlr= 0; + tmp_mysql.extension->conn_hdlr= mysql->extension->conn_hdlr; + mysql->extension->conn_hdlr= 0; } /* don't reread options from configuration files */ @@ -1839,9 +1840,9 @@ mysql_close(MYSQL *mysql) { if (mysql) /* Some simple safety */ { - if (mysql->net.extension->conn_hdlr) + if (mysql->extension->conn_hdlr) { - MA_CONNECTION_HANDLER *p= mysql->net.extension->conn_hdlr; + MA_CONNECTION_HANDLER *p= mysql->extension->conn_hdlr; p->plugin->close(mysql); free(p); } diff --git a/plugins/connection/aurora.c b/plugins/connection/aurora.c index 93c142ed..effeecc6 100644 --- a/plugins/connection/aurora.c +++ b/plugins/connection/aurora.c @@ -245,21 +245,21 @@ my_bool aurora_parse_url(const char *url, AURORA *aurora) int aurora_get_instance_type(MYSQL *mysql) { int rc= -1; - MA_CONNECTION_HANDLER *save_hdlr= mysql->net.extension->conn_hdlr; + MA_CONNECTION_HANDLER *save_hdlr= mysql->extension->conn_hdlr; char *query= "select variable_value from information_schema.global_variables where variable_name='INNODB_READ_ONLY' AND variable_value='OFF'"; if (!mysql) return -1; - mysql->net.extension->conn_hdlr= 0; + mysql->extension->conn_hdlr= 0; if (!mariadb_api->mysql_query(mysql, query)) { MYSQL_RES *res= mariadb_api->mysql_store_result(mysql); rc= mariadb_api->mysql_num_rows(res) ? AURORA_PRIMARY : AURORA_REPLICA; mariadb_api->mysql_free_result(res); } - mysql->net.extension->conn_hdlr= save_hdlr; + mysql->extension->conn_hdlr= save_hdlr; return rc; } /* }}} */ @@ -280,9 +280,9 @@ int aurora_get_instance_type(MYSQL *mysql) my_bool aurora_get_primary_id(MYSQL *mysql, AURORA *aurora) { my_bool rc= 0; - MA_CONNECTION_HANDLER *save_hdlr= mysql->net.extension->conn_hdlr; + MA_CONNECTION_HANDLER *save_hdlr= mysql->extension->conn_hdlr; - mysql->net.extension->conn_hdlr= 0; + mysql->extension->conn_hdlr= 0; if (!mariadb_api->mysql_query(mysql, "select server_id from information_schema.replica_host_status " "where session_id = 'MASTER_SESSION_ID'")) { @@ -302,7 +302,7 @@ my_bool aurora_get_primary_id(MYSQL *mysql, AURORA *aurora) mariadb_api->mysql_free_result(res); } } - mysql->net.extension->conn_hdlr= save_hdlr; + mysql->extension->conn_hdlr= save_hdlr; return rc; } /* }}} */ @@ -393,7 +393,7 @@ void aurora_close_internal(MYSQL *mysql) { if (mysql) { - mysql->net.extension->conn_hdlr= 0; + mysql->extension->conn_hdlr= 0; memset(&mysql->options, 0, sizeof(struct st_mysql_options)); mariadb_api->mysql_close(mysql); } @@ -421,7 +421,7 @@ my_bool aurora_find_replica(AURORA *aurora) mysql->options= aurora->save_mysql.options; /* don't execute init_command on slave */ -// mysql->net.extension->conn_hdlr= aurora->save_mysql.net.extension->conn_hdlr; +// mysql->extension->conn_hdlr= aurora->save_mysql.extension->conn_hdlr; if ((aurora_connect_instance(aurora, instance[random_pick], mysql))) { switch (instance[random_pick]->type) { @@ -522,7 +522,7 @@ MYSQL *aurora_connect(MYSQL *mysql, const char *host, const char *user, const ch const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag) { AURORA *aurora= NULL; - MA_CONNECTION_HANDLER *save_hdlr= mysql->net.extension->conn_hdlr; + MA_CONNECTION_HANDLER *save_hdlr= mysql->extension->conn_hdlr; if (!mariadb_api) mariadb_api= mysql->methods->api; @@ -564,7 +564,7 @@ MYSQL *aurora_connect(MYSQL *mysql, const char *host, const char *user, const ch if (!aurora_find_replica(aurora)) aurora->mysql[AURORA_REPLICA]= NULL; else - aurora->mysql[AURORA_REPLICA]->net.extension->conn_hdlr= save_hdlr; + aurora->mysql[AURORA_REPLICA]->extension->conn_hdlr= save_hdlr; } if (!aurora->mysql[AURORA_PRIMARY]) @@ -572,7 +572,7 @@ MYSQL *aurora_connect(MYSQL *mysql, const char *host, const char *user, const ch if (!aurora_find_primary(aurora)) aurora->mysql[AURORA_PRIMARY]= NULL; else - aurora->mysql[AURORA_PRIMARY]->net.extension->conn_hdlr= save_hdlr; + aurora->mysql[AURORA_PRIMARY]->extension->conn_hdlr= save_hdlr; } if (!aurora->mysql[AURORA_PRIMARY] && !aurora->mysql[AURORA_REPLICA]) @@ -582,7 +582,7 @@ MYSQL *aurora_connect(MYSQL *mysql, const char *host, const char *user, const ch aurora_switch_connection(mysql, aurora, AURORA_PRIMARY); else aurora_switch_connection(mysql, aurora, AURORA_REPLICA); - mysql->net.extension->conn_hdlr= save_hdlr; + mysql->extension->conn_hdlr= save_hdlr; return mysql; error: aurora_close_memory(aurora); @@ -594,7 +594,7 @@ error: my_bool aurora_reconnect(MYSQL *mysql) { AURORA *aurora; - MA_CONNECTION_HANDLER *save_hdlr= mysql->net.extension->conn_hdlr; + MA_CONNECTION_HANDLER *save_hdlr= mysql->extension->conn_hdlr; int i; /* We can't determine if a new primary was promotoed, or if @@ -647,7 +647,7 @@ my_bool aurora_reconnect(MYSQL *mysql) /* {{{ void aurora_close */ void aurora_close(MYSQL *mysql) { - MA_CONNECTION_HANDLER *hdlr= mysql->net.extension->conn_hdlr; + MA_CONNECTION_HANDLER *hdlr= mysql->extension->conn_hdlr; AURORA *aurora; int i; @@ -675,7 +675,7 @@ void aurora_close(MYSQL *mysql) /* free information */ end: aurora_close_memory(aurora); - mysql->net.extension->conn_hdlr= hdlr; + mysql->extension->conn_hdlr= hdlr; } /* }}} */ @@ -718,7 +718,7 @@ my_bool is_replica_stmt(MYSQL *mysql, const char *buffer) int aurora_command(MYSQL *mysql,enum enum_server_command command, const char *arg, size_t length, my_bool skipp_check, void *opt_arg) { - MA_CONNECTION_HANDLER *save_hdlr= mysql->net.extension->conn_hdlr; + MA_CONNECTION_HANDLER *save_hdlr= mysql->extension->conn_hdlr; AURORA *aurora= (AURORA *)save_hdlr->data; /* if we don't have slave or slave became unavailable root traffic to master */ @@ -736,9 +736,9 @@ int aurora_command(MYSQL *mysql,enum enum_server_command command, const char *ar /* we need to change default database on primary and replica */ if (aurora->mysql[AURORA_REPLICA] && mysql->thread_id == aurora->mysql[AURORA_PRIMARY]->thread_id) { - aurora->mysql[AURORA_REPLICA]->net.extension->conn_hdlr= 0; + aurora->mysql[AURORA_REPLICA]->extension->conn_hdlr= 0; mariadb_api->mysql_select_db(aurora->mysql[AURORA_REPLICA], arg); - aurora->mysql[AURORA_REPLICA]->net.extension->conn_hdlr= mysql->net.extension->conn_hdlr; + aurora->mysql[AURORA_REPLICA]->extension->conn_hdlr= mysql->extension->conn_hdlr; } break; case COM_QUERY: @@ -763,7 +763,7 @@ int aurora_command(MYSQL *mysql,enum enum_server_command command, const char *ar break; } end: - mysql->net.extension->conn_hdlr= save_hdlr; + mysql->extension->conn_hdlr= save_hdlr; return 0; } /* }}} */ diff --git a/plugins/connection/replication.c b/plugins/connection/replication.c index d23ec271..a2b6d153 100644 --- a/plugins/connection/replication.c +++ b/plugins/connection/replication.c @@ -182,7 +182,7 @@ MYSQL *repl_connect(MYSQL *mysql, const char *host, const char *user, const char const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag) { REPL_DATA *data= NULL; - MA_CONNECTION_HANDLER *hdlr= mysql->net.extension->conn_hdlr; + MA_CONNECTION_HANDLER *hdlr= mysql->extension->conn_hdlr; if (!mariadb_api) mariadb_api= mysql->methods->api; @@ -243,7 +243,7 @@ error: void repl_close(MYSQL *mysql) { - MA_CONNECTION_HANDLER *hdlr= mysql->net.extension->conn_hdlr; + MA_CONNECTION_HANDLER *hdlr= mysql->extension->conn_hdlr; REPL_DATA *data= (REPL_DATA *)hdlr->data; /* restore master */ @@ -262,7 +262,7 @@ void repl_close(MYSQL *mysql) /* free masrwe information and close connection */ free(data->url); free(data); - mysql->net.extension->conn_hdlr->data= NULL; + mysql->extension->conn_hdlr->data= NULL; } static my_bool is_slave_command(const char *buffer, size_t buffer_len) @@ -300,7 +300,7 @@ static my_bool is_slave_stmt(MYSQL *mysql, const char *buffer) int repl_command(MYSQL *mysql,enum enum_server_command command, const char *arg, size_t length, my_bool skipp_check, void *opt_arg) { - REPL_DATA *data= (REPL_DATA *)mysql->net.extension->conn_hdlr->data; + REPL_DATA *data= (REPL_DATA *)mysql->extension->conn_hdlr->data; /* if we don't have slave or slave became unavailable root traffic to master */ if (!data->pvio[MARIADB_SLAVE] || !data->read_only) @@ -333,7 +333,7 @@ int repl_command(MYSQL *mysql,enum enum_server_command command, const char *arg, int repl_set_options(MYSQL *mysql, enum mysql_option option, void *arg) { - REPL_DATA *data= (REPL_DATA *)mysql->net.extension->conn_hdlr->data; + REPL_DATA *data= (REPL_DATA *)mysql->extension->conn_hdlr->data; switch(option) { case MARIADB_OPT_CONNECTION_READ_ONLY: diff --git a/unittest/libmariadb/connection.c b/unittest/libmariadb/connection.c index 1189ef53..3dffdd42 100644 --- a/unittest/libmariadb/connection.c +++ b/unittest/libmariadb/connection.c @@ -913,7 +913,6 @@ static int test_get_options(MYSQL *my) } struct my_tests_st my_tests[] = { - /* {"test_get_options", test_get_options, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, {"test_wrong_bind_address", test_wrong_bind_address, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, {"test_bind_address", test_bind_address, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, @@ -927,7 +926,7 @@ struct my_tests_st my_tests[] = { {"test_compress", test_compress, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_reconnect", test_reconnect, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, {"test_conc21", test_conc21, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, - {"test_conc26", test_conc26, TEST_CONNECTION_NONE, 0, NULL, NULL}, */ + {"test_conc26", test_conc26, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_connection_timeout", test_connection_timeout, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_connection_timeout2", test_connection_timeout2, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_connection_timeout3", test_connection_timeout3, TEST_CONNECTION_NONE, 0, NULL, NULL}, diff --git a/unittest/libmariadb/misc.c b/unittest/libmariadb/misc.c index 8e373b3a..32769e3b 100644 --- a/unittest/libmariadb/misc.c +++ b/unittest/libmariadb/misc.c @@ -1023,13 +1023,14 @@ static int test_remote1(MYSQL *mysql) static int test_remote2(MYSQL *my) { - MYSQL *mysql= mysql_init(NULL); + MYSQL *mysql; if (!remote_plugin) { diag("skip - no remote io plugin available"); return SKIP; } + mysql= mysql_init(NULL); mysql_options(mysql, MYSQL_READ_DEFAULT_FILE, "http://localhost/test.cnf"); mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "test");