diff --git a/include/PgSQL_Connection.h b/include/PgSQL_Connection.h index 97f9621e7..82c8127c7 100644 --- a/include/PgSQL_Connection.h +++ b/include/PgSQL_Connection.h @@ -326,17 +326,6 @@ class PgSQL_Connection_Placeholder { bool no_backslash_escapes; } options; - PgSQL_Conn_Param conn_params; - - PgSQL_Variable variables[PGSQL_NAME_LAST_HIGH_WM]; - uint32_t var_hash[PGSQL_NAME_LAST_HIGH_WM] = {0}; - // for now we store possibly missing variables in the lower range - // we may need to fix that, but this will cost performance - bool var_absent[PGSQL_NAME_LAST_HIGH_WM] = {false}; - - std::vector dynamic_variables_idx; - unsigned int reorder_dynamic_variables_idx(); - struct { unsigned long length; char *ptr; @@ -418,12 +407,10 @@ class PgSQL_Connection_Placeholder { void optimize(); void close_mysql(); - void reset(); + void reduce_auto_increment_delay_token() { if (auto_increment_delay_token) auto_increment_delay_token--; }; - - bool match_tracked_options(const PgSQL_Connection *c); - unsigned int number_of_matching_session_variables(const PgSQL_Connection *client_conn, unsigned int& not_matching); + unsigned long get_mysql_thread_id() { return pgsql ? pgsql->thread_id : 0; } }; @@ -595,7 +582,19 @@ public: return pg_valid_server_encoding_id(encoding); } - //PgSQL_Conn_Param conn_params; + unsigned int reorder_dynamic_variables_idx(); + unsigned int number_of_matching_session_variables(const PgSQL_Connection* client_conn, unsigned int& not_matching); + + void reset(); + + PgSQL_Variable variables[PGSQL_NAME_LAST_HIGH_WM]; + uint32_t var_hash[PGSQL_NAME_LAST_HIGH_WM]; + // for now we store possibly missing variables in the lower range + // we may need to fix that, but this will cost performance + bool var_absent[PGSQL_NAME_LAST_HIGH_WM] = { false }; + std::vector dynamic_variables_idx; + + PgSQL_Conn_Param conn_params; PgSQL_ErrorInfo error_info; PGconn* pgsql_conn; uint8_t result_type; diff --git a/lib/PgSQL_Connection.cpp b/lib/PgSQL_Connection.cpp index 8a143d0a7..0eefd907a 100644 --- a/lib/PgSQL_Connection.cpp +++ b/lib/PgSQL_Connection.cpp @@ -288,11 +288,6 @@ PgSQL_Connection_Placeholder::PgSQL_Connection_Placeholder() { status_flags=0; last_time_used=0; - for (auto i = 0; i < PGSQL_NAME_LAST_HIGH_WM; i++) { - variables[i].value = NULL; - var_hash[i] = 0; - } - options.client_flag = 0; options.server_capabilities = 0; options.compression_min_length=0; @@ -374,14 +369,6 @@ PgSQL_Connection_Placeholder::~PgSQL_Connection_Placeholder() { options.session_track_gtids=NULL; } - for (auto i = 0; i < PGSQL_NAME_LAST_HIGH_WM; i++) { - if (variables[i].value) { - free(variables[i].value); - variables[i].value = NULL; - var_hash[i] = 0; - } - } - if (connected_host_details.hostname) { free(connected_host_details.hostname); connected_host_details.hostname = NULL; @@ -448,52 +435,6 @@ bool PgSQL_Connection_Placeholder::get_status(uint32_t status_flag) { return this->status_flags & status_flag; } -unsigned int PgSQL_Connection_Placeholder::reorder_dynamic_variables_idx() { - dynamic_variables_idx.clear(); - // note that we are inserting the index already ordered - for (auto i = PGSQL_NAME_LAST_LOW_WM + 1 ; i < PGSQL_NAME_LAST_HIGH_WM ; i++) { - if (var_hash[i] != 0) { - dynamic_variables_idx.push_back(i); - } - } - unsigned int r = dynamic_variables_idx.size(); - return r; -} - -unsigned int PgSQL_Connection_Placeholder::number_of_matching_session_variables(const PgSQL_Connection *client_conn, unsigned int& not_matching) { - unsigned int ret=0; - for (auto i = 0; i < PGSQL_NAME_LAST_LOW_WM; i++) { - if (client_conn->var_hash[i]) { // client has a variable set - if (var_hash[i] == client_conn->var_hash[i]) { // server conection has the variable set to the same value - ret++; - } else { - not_matching++; - } - } - } - // increse not_matching y the sum of client and server variables - // when a match is found the counter will be reduced by 2 - not_matching += client_conn->dynamic_variables_idx.size(); - not_matching += dynamic_variables_idx.size(); - std::vector::const_iterator it_c = client_conn->dynamic_variables_idx.begin(); // client connection iterator - std::vector::const_iterator it_s = dynamic_variables_idx.begin(); // server connection iterator - for ( ; it_c != client_conn->dynamic_variables_idx.end() && it_s != dynamic_variables_idx.end() ; it_c++) { - while (it_s != dynamic_variables_idx.end() && *it_s < *it_c) { - it_s++; - } - if (it_s != dynamic_variables_idx.end()) { - if (*it_s == *it_c) { - if (var_hash[*it_s] == client_conn->var_hash[*it_c]) { // server conection has the variable set to the same value - // when a match is found the counter is reduced by 2 - not_matching-=2; - ret++; - } - } - } - } - return ret; -} - void PgSQL_Connection_Placeholder::set_query(char *stmt, unsigned long length) { query.length=length; query.ptr=stmt; @@ -690,52 +631,6 @@ void PgSQL_Connection_Placeholder::close_mysql() { mysql_close_no_command(pgsql); } -void PgSQL_Connection_Placeholder::reset() { - bool old_no_multiplex_hg = get_status(STATUS_MYSQL_CONNECTION_NO_MULTIPLEX_HG); - bool old_compress = get_status(STATUS_MYSQL_CONNECTION_COMPRESSION); - status_flags=0; - // reconfigure STATUS_MYSQL_CONNECTION_NO_MULTIPLEX_HG - set_status(old_no_multiplex_hg,STATUS_MYSQL_CONNECTION_NO_MULTIPLEX_HG); - // reconfigure STATUS_MYSQL_CONNECTION_COMPRESSION - set_status(old_compress,STATUS_MYSQL_CONNECTION_COMPRESSION); - reusable=true; - options.last_set_autocommit=-1; // never sent - warning_count=0; - delete local_stmts; - local_stmts=new MySQL_STMTs_local_v14(false); - creation_time = monotonic_time(); - - for (auto i = 0; i < PGSQL_NAME_LAST_HIGH_WM; i++) { - var_hash[i] = 0; - if (variables[i].value) { - free(variables[i].value); - variables[i].value = NULL; - var_hash[i] = 0; - } - } - dynamic_variables_idx.clear(); - - if (options.init_connect) { - free(options.init_connect); - options.init_connect = NULL; - options.init_connect_sent = false; - } - auto_increment_delay_token = 0; - if (options.ldap_user_variable) { - if (options.ldap_user_variable_value) { - free(options.ldap_user_variable_value); - options.ldap_user_variable_value = NULL; - } - options.ldap_user_variable = NULL; - options.ldap_user_variable_sent = false; - } - options.session_track_gtids_int = 0; - if (options.session_track_gtids) { - free (options.session_track_gtids); - options.session_track_gtids = NULL; - options.session_track_gtids_sent = false; - } -} PgSQL_Connection::PgSQL_Connection() { @@ -744,6 +639,12 @@ PgSQL_Connection::PgSQL_Connection() { pgsql_result = NULL; query_result = NULL; query_result_reuse = NULL; + + for (int i = 0; i < PGSQL_NAME_LAST_HIGH_WM; i++) { + variables[i].value = NULL; + var_hash[i] = 0; + } + new_result = true; is_copy_out = false; reset_error(); @@ -773,7 +674,7 @@ PgSQL_Connection::~PgSQL_Connection() { delete query_result_reuse; query_result_reuse = NULL; } - for (auto i = 0; i < PGSQL_NAME_LAST_HIGH_WM; i++) { + for (int i = 0; i < PGSQL_NAME_LAST_HIGH_WM; i++) { if (variables[i].value) { free(variables[i].value); variables[i].value = NULL; @@ -2478,3 +2379,98 @@ int PgSQL_Connection::async_send_simple_command(short event, char* stmt, unsigne return 1; } + +unsigned int PgSQL_Connection::reorder_dynamic_variables_idx() { + dynamic_variables_idx.clear(); + // note that we are inserting the index already ordered + for (auto i = PGSQL_NAME_LAST_LOW_WM + 1; i < PGSQL_NAME_LAST_HIGH_WM; i++) { + if (var_hash[i] != 0) { + dynamic_variables_idx.push_back(i); + } + } + unsigned int r = dynamic_variables_idx.size(); + return r; +} + +unsigned int PgSQL_Connection::number_of_matching_session_variables(const PgSQL_Connection* client_conn, unsigned int& not_matching) { + unsigned int ret = 0; + for (auto i = 0; i < PGSQL_NAME_LAST_LOW_WM; i++) { + if (client_conn->var_hash[i]) { // client has a variable set + if (var_hash[i] == client_conn->var_hash[i]) { // server conection has the variable set to the same value + ret++; + } + else { + not_matching++; + } + } + } + // increse not_matching y the sum of client and server variables + // when a match is found the counter will be reduced by 2 + not_matching += client_conn->dynamic_variables_idx.size(); + not_matching += dynamic_variables_idx.size(); + std::vector::const_iterator it_c = client_conn->dynamic_variables_idx.begin(); // client connection iterator + std::vector::const_iterator it_s = dynamic_variables_idx.begin(); // server connection iterator + for (; it_c != client_conn->dynamic_variables_idx.end() && it_s != dynamic_variables_idx.end(); it_c++) { + while (it_s != dynamic_variables_idx.end() && *it_s < *it_c) { + it_s++; + } + if (it_s != dynamic_variables_idx.end()) { + if (*it_s == *it_c) { + if (var_hash[*it_s] == client_conn->var_hash[*it_c]) { // server conection has the variable set to the same value + // when a match is found the counter is reduced by 2 + not_matching -= 2; + ret++; + } + } + } + } + return ret; +} + +void PgSQL_Connection::reset() { + bool old_no_multiplex_hg = get_status(STATUS_MYSQL_CONNECTION_NO_MULTIPLEX_HG); + bool old_compress = get_status(STATUS_MYSQL_CONNECTION_COMPRESSION); + status_flags = 0; + // reconfigure STATUS_MYSQL_CONNECTION_NO_MULTIPLEX_HG + set_status(old_no_multiplex_hg, STATUS_MYSQL_CONNECTION_NO_MULTIPLEX_HG); + // reconfigure STATUS_MYSQL_CONNECTION_COMPRESSION + set_status(old_compress, STATUS_MYSQL_CONNECTION_COMPRESSION); + reusable = true; + options.last_set_autocommit = -1; // never sent + warning_count = 0; + delete local_stmts; + local_stmts = new MySQL_STMTs_local_v14(false); + creation_time = monotonic_time(); + + for (int i = 0; i < PGSQL_NAME_LAST_HIGH_WM; i++) { + var_hash[i] = 0; + if (variables[i].value) { + free(variables[i].value); + variables[i].value = NULL; + var_hash[i] = 0; + } + } + dynamic_variables_idx.clear(); + + if (options.init_connect) { + free(options.init_connect); + options.init_connect = NULL; + options.init_connect_sent = false; + } + auto_increment_delay_token = 0; + if (options.ldap_user_variable) { + if (options.ldap_user_variable_value) { + free(options.ldap_user_variable_value); + options.ldap_user_variable_value = NULL; + } + options.ldap_user_variable = NULL; + options.ldap_user_variable_sent = false; + } + options.session_track_gtids_int = 0; + if (options.session_track_gtids) { + free(options.session_track_gtids); + options.session_track_gtids = NULL; + options.session_track_gtids_sent = false; + } +} +