diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h index c4d77d0fbf6..734001ed3f1 100644 --- a/ext/mysqlnd/mysqlnd.h +++ b/ext/mysqlnd/mysqlnd.h @@ -107,8 +107,8 @@ PHPAPI void mysqlnd_debug(const char *mode); #define mysqlnd_close(conn,is_forced) (conn)->m->close((conn), (is_forced)) #define mysqlnd_query(conn, query_str, query_len) ((conn)->data)->m->query((conn)->data, (query_str), (query_len)) -#define mysqlnd_async_query(conn, query_str, query_len) ((conn)->data)->m->send_query((conn)->data, (query_str), (query_len), MYSQLND_SEND_QUERY_EXPLICIT, NULL, NULL) -#define mysqlnd_reap_async_query(conn) ((conn)->data)->m->reap_query((conn)->data, MYSQLND_REAP_RESULT_EXPLICIT) +#define mysqlnd_async_query(conn, query_str, query_len) ((conn)->data)->m->send_query((conn)->data, (query_str), (query_len), NULL, NULL) +#define mysqlnd_reap_async_query(conn) ((conn)->data)->m->reap_query((conn)->data) #define mysqlnd_unbuffered_skip_result(result) (result)->m.skip_result((result)) PHPAPI enum_func_status mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQLND ***dont_poll, long sec, long usec, int * desc_num); diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c index 99365954f1b..171daea883a 100644 --- a/ext/mysqlnd/mysqlnd_connection.c +++ b/ext/mysqlnd/mysqlnd_connection.c @@ -377,14 +377,8 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_conn_data, dtor)(MYSQLND_CONN_DATA * conn) static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, set_server_option)(MYSQLND_CONN_DATA * const conn, enum_mysqlnd_server_option option) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), set_server_option); - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::set_server_option"); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - ret = conn->command->set_option(conn, option); - conn->m->local_tx_end(conn, this_func, ret); - } - DBG_RETURN(ret); + DBG_RETURN(conn->command->set_option(conn, option)); } /* }}} */ @@ -595,23 +589,16 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn, unsigned int mysql_flags ) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), connect); bool unix_socket = FALSE; bool named_pipe = FALSE; bool reconnect = FALSE; bool saved_compression = FALSE; - bool local_tx_started = FALSE; MYSQLND_PFC * pfc = conn->protocol_frame_codec; MYSQLND_STRING transport = { NULL, 0 }; DBG_ENTER("mysqlnd_conn_data::connect"); DBG_INF_FMT("conn=%p", conn); - if (PASS != conn->m->local_tx_start(conn, this_func)) { - goto err; - } - local_tx_started = TRUE; - SET_EMPTY_ERROR(conn->error_info); UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); @@ -767,7 +754,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn, DBG_INF_FMT("connection_id=%" PRIu64, conn->thread_id); - conn->m->local_tx_end(conn, this_func, PASS); DBG_RETURN(PASS); } err: @@ -786,10 +772,6 @@ err: conn->m->free_contents(conn); MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_CONNECT_FAILURE); - if (TRUE == local_tx_started) { - conn->m->local_tx_end(conn, this_func, FAIL); - } - DBG_RETURN(FAIL); } /* }}} */ @@ -806,22 +788,15 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND * conn_handle, const MYSQLND_CSTRING socket_or_pipe, unsigned int mysql_flags) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), connect); - enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = conn_handle->data; DBG_ENTER("mysqlnd_conn::connect"); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - mysqlnd_options4(conn_handle, MYSQL_OPT_CONNECT_ATTR_ADD, "_client_name", "mysqlnd"); - if (hostname.l > 0) { - mysqlnd_options4(conn_handle, MYSQL_OPT_CONNECT_ATTR_ADD, "_server_host", hostname.s); - } - ret = conn->m->connect(conn, hostname, username, password, database, port, socket_or_pipe, mysql_flags); - - conn->m->local_tx_end(conn, this_func, FAIL); + mysqlnd_options4(conn_handle, MYSQL_OPT_CONNECT_ATTR_ADD, "_client_name", "mysqlnd"); + if (hostname.l > 0) { + mysqlnd_options4(conn_handle, MYSQL_OPT_CONNECT_ATTR_ADD, "_server_host", hostname.s); } - DBG_RETURN(ret); + DBG_RETURN(conn->m->connect(conn, hostname, username, password, database, port, socket_or_pipe, mysql_flags)); } /* }}} */ @@ -834,21 +809,17 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND * conn_handle, static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, query)(MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), query); enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::query"); DBG_INF_FMT("conn=%p conn=%" PRIu64 " query=%s", conn, conn->thread_id, query); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - if (PASS == conn->m->send_query(conn, query, query_len, MYSQLND_SEND_QUERY_IMPLICIT, NULL, NULL) && - PASS == conn->m->reap_query(conn, MYSQLND_REAP_RESULT_IMPLICIT)) - { - ret = PASS; - if (conn->last_query_type == QUERY_UPSERT && UPSERT_STATUS_GET_AFFECTED_ROWS(conn->upsert_status)) { - MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, STAT_ROWS_AFFECTED_NORMAL, UPSERT_STATUS_GET_AFFECTED_ROWS(conn->upsert_status)); - } + if (PASS == conn->m->send_query(conn, query, query_len, NULL, NULL) && + PASS == conn->m->reap_query(conn)) + { + ret = PASS; + if (conn->last_query_type == QUERY_UPSERT && UPSERT_STATUS_GET_AFFECTED_ROWS(conn->upsert_status)) { + MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, STAT_ROWS_AFFECTED_NORMAL, UPSERT_STATUS_GET_AFFECTED_ROWS(conn->upsert_status)); } - conn->m->local_tx_end(conn, this_func, ret); } DBG_RETURN(ret); } @@ -857,25 +828,16 @@ MYSQLND_METHOD(mysqlnd_conn_data, query)(MYSQLND_CONN_DATA * conn, const char * /* {{{ mysqlnd_conn_data::send_query */ static enum_func_status -MYSQLND_METHOD(mysqlnd_conn_data, send_query)(MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len, - enum_mysqlnd_send_query_type type, zval *read_cb, zval *err_cb) +MYSQLND_METHOD(mysqlnd_conn_data, send_query)( + MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len, + zval *read_cb, zval *err_cb) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), send_query); - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::send_query"); DBG_INF_FMT("conn=%" PRIu64 " query=%s", conn->thread_id, query); DBG_INF_FMT("conn->server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status)); - if (type == MYSQLND_SEND_QUERY_IMPLICIT || PASS == conn->m->local_tx_start(conn, this_func)) - { - const MYSQLND_CSTRING query_string = {query, query_len}; - - ret = conn->command->query(conn, query_string); - - if (type == MYSQLND_SEND_QUERY_EXPLICIT) { - conn->m->local_tx_end(conn, this_func, ret); - } - } + const MYSQLND_CSTRING query_string = {query, query_len}; + enum_func_status ret = conn->command->query(conn, query_string); DBG_INF_FMT("conn->server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status)); DBG_RETURN(ret); } @@ -884,22 +846,13 @@ MYSQLND_METHOD(mysqlnd_conn_data, send_query)(MYSQLND_CONN_DATA * conn, const ch /* {{{ mysqlnd_conn_data::reap_query */ static enum_func_status -MYSQLND_METHOD(mysqlnd_conn_data, reap_query)(MYSQLND_CONN_DATA * conn, enum_mysqlnd_reap_result_type type) +MYSQLND_METHOD(mysqlnd_conn_data, reap_query)(MYSQLND_CONN_DATA * conn) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), reap_query); - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::reap_query"); DBG_INF_FMT("conn=%" PRIu64, conn->thread_id); DBG_INF_FMT("conn->server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status)); - if (type == MYSQLND_REAP_RESULT_IMPLICIT || PASS == conn->m->local_tx_start(conn, this_func)) - { - ret = conn->command->reap_result(conn); - - if (type == MYSQLND_REAP_RESULT_EXPLICIT) { - conn->m->local_tx_end(conn, this_func, ret); - } - } + enum_func_status ret = conn->command->reap_result(conn); DBG_INF_FMT("conn->server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status)); DBG_RETURN(ret); } @@ -910,7 +863,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, reap_query)(MYSQLND_CONN_DATA * conn, enum_mys MYSQLND_RES * MYSQLND_METHOD(mysqlnd_conn_data, list_method)(MYSQLND_CONN_DATA * conn, const char * const query, const char * const achtung_wild, const char * const par1) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), list_method); char * show_query = NULL; size_t show_query_len; MYSQLND_RES * result = NULL; @@ -918,28 +870,25 @@ MYSQLND_METHOD(mysqlnd_conn_data, list_method)(MYSQLND_CONN_DATA * conn, const c DBG_ENTER("mysqlnd_conn_data::list_method"); DBG_INF_FMT("conn=%" PRIu64 " query=%s wild=%p", conn->thread_id, query, achtung_wild); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - if (par1) { - if (achtung_wild) { - show_query_len = mnd_sprintf(&show_query, 0, query, par1, achtung_wild); - } else { - show_query_len = mnd_sprintf(&show_query, 0, query, par1); - } + if (par1) { + if (achtung_wild) { + show_query_len = mnd_sprintf(&show_query, 0, query, par1, achtung_wild); } else { - if (achtung_wild) { - show_query_len = mnd_sprintf(&show_query, 0, query, achtung_wild); - } else { - show_query_len = strlen(show_query = (char *)query); - } + show_query_len = mnd_sprintf(&show_query, 0, query, par1); } + } else { + if (achtung_wild) { + show_query_len = mnd_sprintf(&show_query, 0, query, achtung_wild); + } else { + show_query_len = strlen(show_query = (char *)query); + } + } - if (PASS == conn->m->query(conn, show_query, show_query_len)) { - result = conn->m->store_result(conn); - } - if (show_query != query) { - mnd_sprintf_free(show_query); - } - conn->m->local_tx_end(conn, this_func, result == NULL? FAIL:PASS); + if (PASS == conn->m->query(conn, show_query, show_query_len)) { + result = conn->m->store_result(conn); + } + if (show_query != query) { + mnd_sprintf_free(show_query); } DBG_RETURN(result); } @@ -988,20 +937,15 @@ static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, ssl_set)(MYSQLND_CONN_DATA * const conn, const char * key, const char * const cert, const char * const ca, const char * const capath, const char * const cipher) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), ssl_set); - enum_func_status ret = FAIL; MYSQLND_VIO * vio = conn->vio; DBG_ENTER("mysqlnd_conn_data::ssl_set"); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - ret = (PASS == vio->data->m.set_client_option(vio, MYSQLND_OPT_SSL_KEY, key) && - PASS == vio->data->m.set_client_option(vio, MYSQLND_OPT_SSL_CERT, cert) && - PASS == vio->data->m.set_client_option(vio, MYSQLND_OPT_SSL_CA, ca) && - PASS == vio->data->m.set_client_option(vio, MYSQLND_OPT_SSL_CAPATH, capath) && - PASS == vio->data->m.set_client_option(vio, MYSQLND_OPT_SSL_CIPHER, cipher)) ? PASS : FAIL; - - conn->m->local_tx_end(conn, this_func, ret); - } + enum_func_status ret = ( + PASS == vio->data->m.set_client_option(vio, MYSQLND_OPT_SSL_KEY, key) && + PASS == vio->data->m.set_client_option(vio, MYSQLND_OPT_SSL_CERT, cert) && + PASS == vio->data->m.set_client_option(vio, MYSQLND_OPT_SSL_CA, ca) && + PASS == vio->data->m.set_client_option(vio, MYSQLND_OPT_SSL_CAPATH, capath) && + PASS == vio->data->m.set_client_option(vio, MYSQLND_OPT_SSL_CIPHER, cipher)) ? PASS : FAIL; DBG_RETURN(ret); } /* }}} */ @@ -1011,19 +955,15 @@ MYSQLND_METHOD(mysqlnd_conn_data, ssl_set)(MYSQLND_CONN_DATA * const conn, const static zend_ulong MYSQLND_METHOD(mysqlnd_conn_data, escape_string)(MYSQLND_CONN_DATA * const conn, char * newstr, const char * escapestr, size_t escapestr_len) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), escape_string); zend_ulong ret = FAIL; DBG_ENTER("mysqlnd_conn_data::escape_string"); DBG_INF_FMT("conn=%" PRIu64, conn->thread_id); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - DBG_INF_FMT("server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status)); - if (UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status) & SERVER_STATUS_NO_BACKSLASH_ESCAPES) { - ret = mysqlnd_cset_escape_quotes(conn->charset, newstr, escapestr, escapestr_len); - } else { - ret = mysqlnd_cset_escape_slashes(conn->charset, newstr, escapestr, escapestr_len); - } - conn->m->local_tx_end(conn, this_func, PASS); + DBG_INF_FMT("server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status)); + if (UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status) & SERVER_STATUS_NO_BACKSLASH_ESCAPES) { + ret = mysqlnd_cset_escape_quotes(conn->charset, newstr, escapestr, escapestr_len); + } else { + ret = mysqlnd_cset_escape_slashes(conn->charset, newstr, escapestr, escapestr_len); } DBG_RETURN(ret); } @@ -1034,16 +974,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, escape_string)(MYSQLND_CONN_DATA * const conn, static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, dump_debug_info)(MYSQLND_CONN_DATA * const conn) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), server_dump_debug_information); - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::dump_debug_info"); DBG_INF_FMT("conn=%" PRIu64, conn->thread_id); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - ret = conn->command->debug(conn); - conn->m->local_tx_end(conn, this_func, ret); - } - - DBG_RETURN(ret); + DBG_RETURN(conn->command->debug(conn)); } /* }}} */ @@ -1052,19 +985,11 @@ MYSQLND_METHOD(mysqlnd_conn_data, dump_debug_info)(MYSQLND_CONN_DATA * const con static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, select_db)(MYSQLND_CONN_DATA * const conn, const char * const db, const size_t db_len) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), select_db); - enum_func_status ret = FAIL; - DBG_ENTER("mysqlnd_conn_data::select_db"); DBG_INF_FMT("conn=%" PRIu64 " db=%s", conn->thread_id, db); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - const MYSQLND_CSTRING database = {db, db_len}; - - ret = conn->command->init_db(conn, database); - conn->m->local_tx_end(conn, this_func, ret); - } - DBG_RETURN(ret); + const MYSQLND_CSTRING database = {db, db_len}; + DBG_RETURN(conn->command->init_db(conn, database)); } /* }}} */ @@ -1073,16 +998,10 @@ MYSQLND_METHOD(mysqlnd_conn_data, select_db)(MYSQLND_CONN_DATA * const conn, con static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, ping)(MYSQLND_CONN_DATA * const conn) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), ping); - enum_func_status ret = FAIL; - DBG_ENTER("mysqlnd_conn_data::ping"); DBG_INF_FMT("conn=%" PRIu64, conn->thread_id); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - ret = conn->command->ping(conn); - conn->m->local_tx_end(conn, this_func, ret); - } + enum_func_status ret = conn->command->ping(conn); DBG_INF_FMT("ret=%u", ret); DBG_RETURN(ret); } @@ -1093,17 +1012,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, ping)(MYSQLND_CONN_DATA * const conn) static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, statistic)(MYSQLND_CONN_DATA * conn, zend_string **message) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), get_server_statistics); - enum_func_status ret = FAIL; - DBG_ENTER("mysqlnd_conn_data::statistic"); DBG_INF_FMT("conn=%" PRIu64, conn->thread_id); - - if (PASS == conn->m->local_tx_start(conn, this_func)) { - ret = conn->command->statistics(conn, message); - conn->m->local_tx_end(conn, this_func, ret); - } - DBG_RETURN(ret); + DBG_RETURN(conn->command->statistics(conn, message)); } /* }}} */ @@ -1112,21 +1023,14 @@ MYSQLND_METHOD(mysqlnd_conn_data, statistic)(MYSQLND_CONN_DATA * conn, zend_stri static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, kill)(MYSQLND_CONN_DATA * conn, unsigned int pid) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), kill_connection); - enum_func_status ret = FAIL; - DBG_ENTER("mysqlnd_conn_data::kill"); DBG_INF_FMT("conn=%" PRIu64 " pid=%u", conn->thread_id, pid); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - const unsigned int process_id = pid; - /* 'unsigned char' is promoted to 'int' when passed through '...' */ - const unsigned int read_response = (pid != conn->thread_id); + const unsigned int process_id = pid; + /* 'unsigned char' is promoted to 'int' when passed through '...' */ + const unsigned int read_response = (pid != conn->thread_id); - ret = conn->command->process_kill(conn, process_id, read_response); - conn->m->local_tx_end(conn, this_func, ret); - } - DBG_RETURN(ret); + DBG_RETURN(conn->command->process_kill(conn, process_id, read_response)); } /* }}} */ @@ -1135,7 +1039,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, kill)(MYSQLND_CONN_DATA * conn, unsigned int p static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, set_charset)(MYSQLND_CONN_DATA * const conn, const char * const csname) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), set_charset); enum_func_status ret = FAIL; const MYSQLND_CHARSET * const charset = mysqlnd_find_charset_name(csname); @@ -1147,19 +1050,15 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_charset)(MYSQLND_CONN_DATA * const conn, c DBG_RETURN(ret); } - if (PASS == conn->m->local_tx_start(conn, this_func)) { - char * query; - size_t query_len = mnd_sprintf(&query, 0, "SET NAMES %s", csname); + char * query; + size_t query_len = mnd_sprintf(&query, 0, "SET NAMES %s", csname); - if (FAIL == (ret = conn->m->query(conn, query, query_len)) || conn->error_info->error_no) { - ret = FAIL; - } else { - conn->charset = charset; - } - mnd_sprintf_free(query); - - conn->m->local_tx_end(conn, this_func, ret); + if (FAIL == (ret = conn->m->query(conn, query, query_len)) || conn->error_info->error_no) { + ret = FAIL; + } else { + conn->charset = charset; } + mnd_sprintf_free(query); DBG_INF(ret == PASS? "PASS":"FAIL"); DBG_RETURN(ret); @@ -1171,16 +1070,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_charset)(MYSQLND_CONN_DATA * const conn, c static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, refresh)(MYSQLND_CONN_DATA * const conn, uint8_t options) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), refresh_server); - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::refresh"); DBG_INF_FMT("conn=%" PRIu64 " options=%u", conn->thread_id, options); - - if (PASS == conn->m->local_tx_start(conn, this_func)) { - ret = conn->command->refresh(conn, options); - conn->m->local_tx_end(conn, this_func, ret); - } - DBG_RETURN(ret); + DBG_RETURN(conn->command->refresh(conn, options)); } /* }}} */ @@ -1189,16 +1081,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, refresh)(MYSQLND_CONN_DATA * const conn, uint8 static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, shutdown)(MYSQLND_CONN_DATA * const conn, uint8_t level) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), shutdown_server); - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::shutdown"); DBG_INF_FMT("conn=%" PRIu64 " level=%u", conn->thread_id, level); - - if (PASS == conn->m->local_tx_start(conn, this_func)) { - ret = conn->command->shutdown(conn, level); - conn->m->local_tx_end(conn, this_func, ret); - } - DBG_RETURN(ret); + DBG_RETURN(conn->command->shutdown(conn, level)); } /* }}} */ @@ -1459,48 +1344,40 @@ MYSQLND_METHOD(mysqlnd_conn_data, more_results)(const MYSQLND_CONN_DATA * const static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, next_result)(MYSQLND_CONN_DATA * const conn) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), next_result); - enum_func_status ret = FAIL; - DBG_ENTER("mysqlnd_conn_data::next_result"); DBG_INF_FMT("conn=%" PRIu64 "", conn->thread_id); SET_EMPTY_ERROR(conn->error_info); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - do { - if (GET_CONNECTION_STATE(&conn->state) != CONN_NEXT_RESULT_PENDING) { - break; - } - - UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); - /* - We are sure that there is a result set, since conn->state is set accordingly - in mysqlnd_store_result() or mysqlnd_fetch_row_unbuffered() - */ - if (FAIL == (ret = conn->m->query_read_result_set_header(conn, NULL))) { - /* - There can be an error in the middle of a multi-statement, which will cancel the multi-statement. - So there are no more results and we should just return FALSE, error_no has been set - */ - if (!conn->error_info->error_no) { - DBG_ERR_FMT("Serious error. %s::%u", __FILE__, __LINE__); - php_error_docref(NULL, E_WARNING, "Serious error. PID=%d", getpid()); - SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); - conn->m->send_close(conn); - } else { - DBG_INF_FMT("Error from the server : (%u) %s", conn->error_info->error_no, conn->error_info->error); - } - break; - } - if (conn->last_query_type == QUERY_UPSERT && UPSERT_STATUS_GET_AFFECTED_ROWS(conn->upsert_status)) { - MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, STAT_ROWS_AFFECTED_NORMAL, UPSERT_STATUS_GET_AFFECTED_ROWS(conn->upsert_status)); - } - } while (0); - conn->m->local_tx_end(conn, this_func, ret); + if (GET_CONNECTION_STATE(&conn->state) != CONN_NEXT_RESULT_PENDING) { + DBG_RETURN(FAIL); } - DBG_RETURN(ret); + UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); + /* + We are sure that there is a result set, since conn->state is set accordingly + in mysqlnd_store_result() or mysqlnd_fetch_row_unbuffered() + */ + enum_func_status ret = conn->m->query_read_result_set_header(conn, NULL); + if (FAIL == ret) { + /* + There can be an error in the middle of a multi-statement, which will cancel the multi-statement. + So there are no more results and we should just return FALSE, error_no has been set + */ + if (!conn->error_info->error_no) { + DBG_ERR_FMT("Serious error. %s::%u", __FILE__, __LINE__); + php_error_docref(NULL, E_WARNING, "Serious error. PID=%d", getpid()); + SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); + conn->m->send_close(conn); + } else { + DBG_INF_FMT("Error from the server : (%u) %s", conn->error_info->error_no, conn->error_info->error); + } + DBG_RETURN(FAIL); + } + if (conn->last_query_type == QUERY_UPSERT && UPSERT_STATUS_GET_AFFECTED_ROWS(conn->upsert_status)) { + MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, STAT_ROWS_AFFECTED_NORMAL, UPSERT_STATUS_GET_AFFECTED_ROWS(conn->upsert_status)); + } + DBG_RETURN(PASS); } /* }}} */ @@ -1515,17 +1392,12 @@ MYSQLND_METHOD(mysqlnd_conn_data, change_user)(MYSQLND_CONN_DATA * const conn, size_t passwd_len ) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), change_user); enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::change_user"); DBG_INF_FMT("conn=%" PRIu64 " user=%s passwd=%s db=%s silent=%u", conn->thread_id, user?user:"", passwd?"***":"null", db?db:"", silent == TRUE); - if (PASS != conn->m->local_tx_start(conn, this_func)) { - goto end; - } - SET_EMPTY_ERROR(conn->error_info); UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); @@ -1549,8 +1421,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, change_user)(MYSQLND_CONN_DATA * const conn, Here we should close all statements. Unbuffered queries should not be a problem as we won't allow sending COM_CHANGE_USER. */ - conn->m->local_tx_end(conn, this_func, ret); -end: DBG_INF(ret == PASS? "PASS":"FAIL"); DBG_RETURN(ret); } @@ -1564,14 +1434,10 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c const char * const value ) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), set_client_option); enum_func_status ret = PASS; DBG_ENTER("mysqlnd_conn_data::set_client_option"); DBG_INF_FMT("conn=%" PRIu64 " option=%u", conn->thread_id, option); - if (PASS != conn->m->local_tx_start(conn, this_func)) { - goto end; - } switch (option) { case MYSQL_OPT_READ_TIMEOUT: case MYSQL_OPT_WRITE_TIMEOUT: @@ -1715,10 +1581,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c default: ret = FAIL; } - conn->m->local_tx_end(conn, this_func, ret); DBG_RETURN(ret); -end: - DBG_RETURN(FAIL); } /* }}} */ @@ -1731,14 +1594,10 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option_2d)(MYSQLND_CONN_DATA * cons const char * const value ) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), set_client_option_2d); enum_func_status ret = PASS; DBG_ENTER("mysqlnd_conn_data::set_client_option_2d"); DBG_INF_FMT("conn=%" PRIu64 " option=%u", conn->thread_id, option); - if (PASS != conn->m->local_tx_start(conn, this_func)) { - goto end; - } switch (option) { case MYSQL_OPT_CONNECT_ATTR_ADD: if (!conn->options->connect_attr) { @@ -1767,10 +1626,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option_2d)(MYSQLND_CONN_DATA * cons default: ret = FAIL; } - conn->m->local_tx_end(conn, this_func, ret); DBG_RETURN(ret); -end: - DBG_RETURN(FAIL); } /* }}} */ @@ -1779,39 +1635,29 @@ end: static MYSQLND_RES * MYSQLND_METHOD(mysqlnd_conn_data, use_result)(MYSQLND_CONN_DATA * const conn) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), use_result); - MYSQLND_RES * result = NULL; - DBG_ENTER("mysqlnd_conn_data::use_result"); DBG_INF_FMT("conn=%" PRIu64, conn->thread_id); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - do { - if (!conn->current_result) { - break; - } - - /* Nothing to store for UPSERT/LOAD DATA */ - if (conn->last_query_type != QUERY_SELECT || GET_CONNECTION_STATE(&conn->state) != CONN_FETCHING_DATA) { - SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); - DBG_ERR("Command out of sync"); - break; - } - - MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_UNBUFFERED_SETS); - - conn->current_result->conn = conn->m->get_reference(conn); - result = conn->current_result->m.use_result(conn->current_result, FALSE); - - if (!result) { - conn->current_result->m.free_result(conn->current_result, TRUE); - } - conn->current_result = NULL; - } while (0); - - conn->m->local_tx_end(conn, this_func, result == NULL? FAIL:PASS); + if (!conn->current_result) { + DBG_RETURN(NULL); } + /* Nothing to store for UPSERT/LOAD DATA */ + if (conn->last_query_type != QUERY_SELECT || GET_CONNECTION_STATE(&conn->state) != CONN_FETCHING_DATA) { + SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); + DBG_ERR("Command out of sync"); + DBG_RETURN(NULL); + } + + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_UNBUFFERED_SETS); + + conn->current_result->conn = conn->m->get_reference(conn); + + MYSQLND_RES *result = conn->current_result->m.use_result(conn->current_result, FALSE); + if (!result) { + conn->current_result->m.free_result(conn->current_result, TRUE); + } + conn->current_result = NULL; DBG_RETURN(result); } /* }}} */ @@ -1821,35 +1667,26 @@ MYSQLND_METHOD(mysqlnd_conn_data, use_result)(MYSQLND_CONN_DATA * const conn) static MYSQLND_RES * MYSQLND_METHOD(mysqlnd_conn_data, store_result)(MYSQLND_CONN_DATA * const conn) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), store_result); - MYSQLND_RES * result = NULL; - DBG_ENTER("mysqlnd_conn_data::store_result"); DBG_INF_FMT("conn=%" PRIu64 " conn=%p", conn->thread_id, conn); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - do { - if (!conn->current_result) { - break; - } - - /* Nothing to store for UPSERT/LOAD DATA*/ - if (conn->last_query_type != QUERY_SELECT || GET_CONNECTION_STATE(&conn->state) != CONN_FETCHING_DATA) { - SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); - DBG_ERR("Command out of sync"); - break; - } - - MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_BUFFERED_SETS); - result = conn->current_result->m.store_result(conn->current_result, conn, NULL); - if (!result) { - conn->current_result->m.free_result(conn->current_result, TRUE); - } - conn->current_result = NULL; - } while (0); - - conn->m->local_tx_end(conn, this_func, result == NULL? FAIL:PASS); + if (!conn->current_result) { + DBG_RETURN(NULL); } + + /* Nothing to store for UPSERT/LOAD DATA*/ + if (conn->last_query_type != QUERY_SELECT || GET_CONNECTION_STATE(&conn->state) != CONN_FETCHING_DATA) { + SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); + DBG_ERR("Command out of sync"); + DBG_RETURN(NULL); + } + + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_BUFFERED_SETS); + MYSQLND_RES *result = conn->current_result->m.store_result(conn->current_result, conn, NULL); + if (!result) { + conn->current_result->m.free_result(conn->current_result, TRUE); + } + conn->current_result = NULL; DBG_RETURN(result); } /* }}} */ @@ -1871,16 +1708,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, get_connection_stats)(const MYSQLND_CONN_DATA static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, set_autocommit)(MYSQLND_CONN_DATA * conn, unsigned int mode) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), set_autocommit); - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::set_autocommit"); - - if (PASS == conn->m->local_tx_start(conn, this_func)) { - ret = conn->m->query(conn, (mode) ? "SET AUTOCOMMIT=1":"SET AUTOCOMMIT=0", sizeof("SET AUTOCOMMIT=1") - 1); - conn->m->local_tx_end(conn, this_func, ret); - } - - DBG_RETURN(ret); + DBG_RETURN(conn->m->query(conn, (mode) ? "SET AUTOCOMMIT=1":"SET AUTOCOMMIT=0", sizeof("SET AUTOCOMMIT=1") - 1)); } /* }}} */ @@ -1982,41 +1811,30 @@ mysqlnd_escape_string_for_tx_name_in_comment(const char * const name) static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, tx_commit_or_rollback)(MYSQLND_CONN_DATA * conn, const bool commit, const unsigned int flags, const char * const name) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), tx_commit_or_rollback); - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::tx_commit_or_rollback"); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - do { - smart_str tmp_str = {0, 0}; - conn->m->tx_cor_options_to_string(conn, &tmp_str, flags); - smart_str_0(&tmp_str); + smart_str tmp_str = {0, 0}; + conn->m->tx_cor_options_to_string(conn, &tmp_str, flags); + smart_str_0(&tmp_str); + char * query; + size_t query_len; + char * name_esc = mysqlnd_escape_string_for_tx_name_in_comment(name); - { - char * query; - size_t query_len; - char * name_esc = mysqlnd_escape_string_for_tx_name_in_comment(name); - - query_len = mnd_sprintf(&query, 0, (commit? "COMMIT%s %s":"ROLLBACK%s %s"), - name_esc? name_esc:"", tmp_str.s? ZSTR_VAL(tmp_str.s):""); - smart_str_free(&tmp_str); - if (name_esc) { - mnd_efree(name_esc); - name_esc = NULL; - } - if (!query) { - SET_OOM_ERROR(conn->error_info); - break; - } - - ret = conn->m->query(conn, query, query_len); - mnd_sprintf_free(query); - } - } while (0); - conn->m->local_tx_end(conn, this_func, ret); + query_len = mnd_sprintf(&query, 0, (commit? "COMMIT%s %s":"ROLLBACK%s %s"), + name_esc? name_esc:"", tmp_str.s? ZSTR_VAL(tmp_str.s):""); + smart_str_free(&tmp_str); + if (name_esc) { + mnd_efree(name_esc); + name_esc = NULL; + } + if (!query) { + SET_OOM_ERROR(conn->error_info); + DBG_RETURN(FAIL); } + enum_func_status ret = conn->m->query(conn, query, query_len); + mnd_sprintf_free(query); DBG_RETURN(ret); } /* }}} */ @@ -2026,55 +1844,46 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_commit_or_rollback)(MYSQLND_CONN_DATA * con static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsigned int mode, const char * const name) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), tx_begin); - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::tx_begin"); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - do { - smart_str tmp_str = {0, 0}; - if (mode & TRANS_START_WITH_CONSISTENT_SNAPSHOT) { - if (tmp_str.s) { - smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); - } - smart_str_appendl(&tmp_str, "WITH CONSISTENT SNAPSHOT", sizeof("WITH CONSISTENT SNAPSHOT") - 1); - } - if (mode & TRANS_START_READ_WRITE) { - if (tmp_str.s && ZSTR_LEN(tmp_str.s)) { - smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); - } - smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1); - } else if (mode & TRANS_START_READ_ONLY) { - if (tmp_str.s && ZSTR_LEN(tmp_str.s)) { - smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); - } - smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1); - } - smart_str_0(&tmp_str); + smart_str tmp_str = {0, 0}; + if (mode & TRANS_START_WITH_CONSISTENT_SNAPSHOT) { + if (tmp_str.s) { + smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); + } + smart_str_appendl(&tmp_str, "WITH CONSISTENT SNAPSHOT", sizeof("WITH CONSISTENT SNAPSHOT") - 1); + } + if (mode & TRANS_START_READ_WRITE) { + if (tmp_str.s && ZSTR_LEN(tmp_str.s)) { + smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); + } + smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1); + } else if (mode & TRANS_START_READ_ONLY) { + if (tmp_str.s && ZSTR_LEN(tmp_str.s)) { + smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); + } + smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1); + } + smart_str_0(&tmp_str); - { - char * name_esc = mysqlnd_escape_string_for_tx_name_in_comment(name); - char * query; - unsigned int query_len = mnd_sprintf(&query, 0, "START TRANSACTION%s %s", name_esc? name_esc:"", tmp_str.s? ZSTR_VAL(tmp_str.s):""); - smart_str_free(&tmp_str); - if (name_esc) { - mnd_efree(name_esc); - name_esc = NULL; - } - if (!query) { - SET_OOM_ERROR(conn->error_info); - break; - } - ret = conn->m->query(conn, query, query_len); - mnd_sprintf_free(query); - if (ret && mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY) && mysqlnd_stmt_errno(conn) == 1064) { - SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, - "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required"); - break; - } - } - } while (0); - conn->m->local_tx_end(conn, this_func, ret); + char * name_esc = mysqlnd_escape_string_for_tx_name_in_comment(name); + char * query; + unsigned int query_len = mnd_sprintf(&query, 0, "START TRANSACTION%s %s", name_esc? name_esc:"", tmp_str.s? ZSTR_VAL(tmp_str.s):""); + smart_str_free(&tmp_str); + if (name_esc) { + mnd_efree(name_esc); + name_esc = NULL; + } + if (!query) { + SET_OOM_ERROR(conn->error_info); + DBG_RETURN(FAIL); + } + + enum_func_status ret = conn->m->query(conn, query, query_len); + mnd_sprintf_free(query); + if (ret && mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY) && mysqlnd_stmt_errno(conn) == 1064) { + SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, + "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required"); } DBG_RETURN(ret); @@ -2086,29 +1895,22 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsi static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, tx_savepoint)(MYSQLND_CONN_DATA * conn, const char * const name) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), tx_savepoint); - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::tx_savepoint"); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - do { - char * query; - unsigned int query_len; - if (!name) { - SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, "Savepoint name not provided"); - break; - } - query_len = mnd_sprintf(&query, 0, "SAVEPOINT `%s`", name); - if (!query) { - SET_OOM_ERROR(conn->error_info); - break; - } - ret = conn->m->query(conn, query, query_len); - mnd_sprintf_free(query); - } while (0); - conn->m->local_tx_end(conn, this_func, ret); + if (!name) { + SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, "Savepoint name not provided"); + DBG_RETURN(FAIL); } + char *query; + size_t query_len = mnd_sprintf(&query, 0, "SAVEPOINT `%s`", name); + if (!query) { + SET_OOM_ERROR(conn->error_info); + DBG_RETURN(FAIL); + } + + enum_func_status ret = conn->m->query(conn, query, query_len); + mnd_sprintf_free(query); DBG_RETURN(ret); } /* }}} */ @@ -2118,29 +1920,22 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_savepoint)(MYSQLND_CONN_DATA * conn, const static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, tx_savepoint_release)(MYSQLND_CONN_DATA * conn, const char * const name) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), tx_savepoint_release); - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::tx_savepoint_release"); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - do { - char * query; - unsigned int query_len; - if (!name) { - SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, "Savepoint name not provided"); - break; - } - query_len = mnd_sprintf(&query, 0, "RELEASE SAVEPOINT `%s`", name); - if (!query) { - SET_OOM_ERROR(conn->error_info); - break; - } - ret = conn->m->query(conn, query, query_len); - mnd_sprintf_free(query); - } while (0); - conn->m->local_tx_end(conn, this_func, ret); + if (!name) { + SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, "Savepoint name not provided"); + DBG_RETURN(FAIL); } + char *query; + size_t query_len = mnd_sprintf(&query, 0, "RELEASE SAVEPOINT `%s`", name); + if (!query) { + SET_OOM_ERROR(conn->error_info); + DBG_RETURN(FAIL); + } + + enum_func_status ret = conn->m->query(conn, query, query_len); + mnd_sprintf_free(query); DBG_RETURN(ret); } /* }}} */ @@ -2172,26 +1967,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, get_client_api_capabilities)(const MYSQLND_CON /* }}} */ -/* {{{ mysqlnd_conn_data::local_tx_start */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_conn_data, local_tx_start)(MYSQLND_CONN_DATA * conn, const size_t this_func) -{ - DBG_ENTER("mysqlnd_conn_data::local_tx_start"); - DBG_RETURN(PASS); -} -/* }}} */ - - -/* {{{ mysqlnd_conn_data::local_tx_end */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_conn_data, local_tx_end)(MYSQLND_CONN_DATA * conn, const size_t this_func, const enum_func_status status) -{ - DBG_ENTER("mysqlnd_conn_data::local_tx_end"); - DBG_RETURN(status); -} -/* }}} */ - - /* {{{ _mysqlnd_stmt_init */ MYSQLND_STMT * MYSQLND_METHOD(mysqlnd_conn_data, stmt_init)(MYSQLND_CONN_DATA * const conn) @@ -2278,8 +2053,6 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_conn_data) MYSQLND_METHOD(mysqlnd_conn_data, tx_savepoint), MYSQLND_METHOD(mysqlnd_conn_data, tx_savepoint_release), - MYSQLND_METHOD(mysqlnd_conn_data, local_tx_start), - MYSQLND_METHOD(mysqlnd_conn_data, local_tx_end), MYSQLND_METHOD(mysqlnd_conn_data, execute_init_commands), MYSQLND_METHOD(mysqlnd_conn_data, get_updated_connect_flags), MYSQLND_METHOD(mysqlnd_conn_data, connect_handshake), @@ -2326,34 +2099,27 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_conn, dtor)(MYSQLND * conn) static enum_func_status MYSQLND_METHOD(mysqlnd_conn, close)(MYSQLND * conn_handle, const enum_connection_close_type close_type) { - const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn), close); MYSQLND_CONN_DATA * conn = conn_handle->data; - enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn::close"); DBG_INF_FMT("conn=%" PRIu64, conn->thread_id); - if (PASS == conn->m->local_tx_start(conn, this_func)) { - if (GET_CONNECTION_STATE(&conn->state) >= CONN_READY) { - static enum_mysqlnd_collected_stats close_type_to_stat_map[MYSQLND_CLOSE_LAST] = { - STAT_CLOSE_EXPLICIT, - STAT_CLOSE_IMPLICIT, - STAT_CLOSE_DISCONNECT - }; - MYSQLND_INC_CONN_STATISTIC(conn->stats, close_type_to_stat_map[close_type]); - } - - /* - Close now, free_reference will try, - if we are last, but that's not a problem. - */ - ret = conn->m->send_close(conn); - - /* If we do it after free_reference/dtor then we might crash */ - conn->m->local_tx_end(conn, this_func, ret); - - conn_handle->m->dtor(conn_handle); + if (GET_CONNECTION_STATE(&conn->state) >= CONN_READY) { + static enum_mysqlnd_collected_stats close_type_to_stat_map[MYSQLND_CLOSE_LAST] = { + STAT_CLOSE_EXPLICIT, + STAT_CLOSE_IMPLICIT, + STAT_CLOSE_DISCONNECT + }; + MYSQLND_INC_CONN_STATISTIC(conn->stats, close_type_to_stat_map[close_type]); } + + /* + Close now, free_reference will try, + if we are last, but that's not a problem. + */ + enum_func_status ret = conn->m->send_close(conn); + + conn_handle->m->dtor(conn_handle); DBG_RETURN(ret); } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_enum_n_def.h b/ext/mysqlnd/mysqlnd_enum_n_def.h index 05154fffe31..110e62c71ba 100644 --- a/ext/mysqlnd/mysqlnd_enum_n_def.h +++ b/ext/mysqlnd/mysqlnd_enum_n_def.h @@ -177,18 +177,6 @@ typedef enum mysqlnd_res_type MYSQLND_RES_PS_UNBUF } enum_mysqlnd_res_type; -typedef enum mysqlnd_send_query_type -{ - MYSQLND_SEND_QUERY_IMPLICIT = 0, - MYSQLND_SEND_QUERY_EXPLICIT -} enum_mysqlnd_send_query_type; - -typedef enum mysqlnd_reap_result_type -{ - MYSQLND_REAP_RESULT_IMPLICIT = 0, - MYSQLND_REAP_RESULT_EXPLICIT -} enum_mysqlnd_reap_result_type; - typedef enum mysqlnd_send_execute_type { MYSQLND_SEND_EXECUTE_IMPLICIT = 0, diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 567ff0860b7..644204655f2 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -432,8 +432,8 @@ typedef enum_func_status (*func_mysqlnd_conn_data__connect)(MYSQLND_CONN_DATA * typedef zend_ulong (*func_mysqlnd_conn_data__escape_string)(MYSQLND_CONN_DATA * const conn, char *newstr, const char *escapestr, size_t escapestr_len); typedef enum_func_status (*func_mysqlnd_conn_data__set_charset)(MYSQLND_CONN_DATA * const conn, const char * const charset); typedef enum_func_status (*func_mysqlnd_conn_data__query)(MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len); -typedef enum_func_status (*func_mysqlnd_conn_data__send_query)(MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len, enum_mysqlnd_send_query_type type, zval *read_cb, zval *err_cb); -typedef enum_func_status (*func_mysqlnd_conn_data__reap_query)(MYSQLND_CONN_DATA * conn, enum_mysqlnd_reap_result_type type); +typedef enum_func_status (*func_mysqlnd_conn_data__send_query)(MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len, zval *read_cb, zval *err_cb); +typedef enum_func_status (*func_mysqlnd_conn_data__reap_query)(MYSQLND_CONN_DATA * conn); typedef MYSQLND_RES * (*func_mysqlnd_conn_data__use_result)(MYSQLND_CONN_DATA * const conn); typedef MYSQLND_RES * (*func_mysqlnd_conn_data__store_result)(MYSQLND_CONN_DATA * const conn); typedef enum_func_status (*func_mysqlnd_conn_data__next_result)(MYSQLND_CONN_DATA * const conn); @@ -503,8 +503,6 @@ typedef void (*func_mysqlnd_conn_data__tx_cor_options_to_string)(const MYSQLN typedef enum_func_status (*func_mysqlnd_conn_data__tx_savepoint)(MYSQLND_CONN_DATA * conn, const char * const name); typedef enum_func_status (*func_mysqlnd_conn_data__tx_savepoint_release)(MYSQLND_CONN_DATA * conn, const char * const name); -typedef enum_func_status (*func_mysqlnd_conn_data__local_tx_start)(MYSQLND_CONN_DATA * conn, const size_t this_func); -typedef enum_func_status (*func_mysqlnd_conn_data__local_tx_end)(MYSQLND_CONN_DATA * conn, const size_t this_func, const enum_func_status status); typedef enum_func_status (*func_mysqlnd_conn_data__execute_init_commands)(MYSQLND_CONN_DATA * conn); typedef unsigned int (*func_mysqlnd_conn_data__get_updated_connect_flags)(MYSQLND_CONN_DATA * conn, unsigned int mysql_flags); typedef enum_func_status (*func_mysqlnd_conn_data__connect_handshake)(MYSQLND_CONN_DATA * conn, const MYSQLND_CSTRING * const scheme, const MYSQLND_CSTRING * const username, const MYSQLND_CSTRING * const password, const MYSQLND_CSTRING * const database, const unsigned int mysql_flags); @@ -594,9 +592,6 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data) func_mysqlnd_conn_data__tx_savepoint tx_savepoint; func_mysqlnd_conn_data__tx_savepoint_release tx_savepoint_release; - func_mysqlnd_conn_data__local_tx_start local_tx_start; - func_mysqlnd_conn_data__local_tx_end local_tx_end; - func_mysqlnd_conn_data__execute_init_commands execute_init_commands; func_mysqlnd_conn_data__get_updated_connect_flags get_updated_connect_flags; func_mysqlnd_conn_data__connect_handshake connect_handshake;