From e07e4f4bb3dca81010e4ae956dfd7de5376fdb8c Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Wed, 23 Sep 2015 17:27:18 +0200 Subject: Fix for Bug #70384 mysqli_real_query(): Unknown type 245 sent by the server --- ext/mysqlnd/mysqlnd_wireprotocol.c | 1 + 1 file changed, 1 insertion(+) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 0923a988ed..b464aab821 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1653,6 +1653,7 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, case MYSQL_TYPE_NEWDECIMAL: statistic = STAT_TEXT_TYPE_FETCHED_DECIMAL; break; case MYSQL_TYPE_ENUM: statistic = STAT_TEXT_TYPE_FETCHED_ENUM; break; case MYSQL_TYPE_SET: statistic = STAT_TEXT_TYPE_FETCHED_SET; break; + case MYSQL_TYPE_JSON: statistic = STAT_TEXT_TYPE_FETCHED_JSON; break; case MYSQL_TYPE_TINY_BLOB: statistic = STAT_TEXT_TYPE_FETCHED_BLOB; break; case MYSQL_TYPE_MEDIUM_BLOB:statistic = STAT_TEXT_TYPE_FETCHED_BLOB; break; case MYSQL_TYPE_LONG_BLOB: statistic = STAT_TEXT_TYPE_FETCHED_BLOB; break; -- cgit v1.2.1 From 6051a477762c030dfdc7f2bf4cfecd2a54d0ab2a Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Fri, 2 Oct 2015 14:23:15 +0200 Subject: MNDR - Rename simple_command* to send_command --- ext/mysqlnd/mysqlnd_wireprotocol.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index b464aab821..2e8daa4a4a 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -643,9 +643,9 @@ size_t php_mysqlnd_auth_write(void * _packet, MYSQLND_CONN_DATA * conn) } } if (packet->is_change_user_packet) { - if (PASS != conn->m->simple_command(conn, COM_CHANGE_USER, buffer + MYSQLND_HEADER_SIZE, p - buffer - MYSQLND_HEADER_SIZE, - PROT_LAST /* the caller will handle the OK packet */, - packet->silent, TRUE)) { + if (PASS != conn->m->send_command(conn, COM_CHANGE_USER, buffer + MYSQLND_HEADER_SIZE, p - buffer - MYSQLND_HEADER_SIZE, + PROT_LAST /* the caller will handle the OK packet */, + packet->silent, TRUE)) { DBG_RETURN(0); } DBG_RETURN(p - buffer - MYSQLND_HEADER_SIZE); -- cgit v1.2.1 From 34a33928d649c69859c6b368f5fa35a8d37d7b2c Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Fri, 2 Oct 2015 15:30:53 +0200 Subject: MNDR: - Rename MYSQLND_PROTOCOL to MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY - Rename other symbols related to MYSQLND_PROTOCOL accordingly --- ext/mysqlnd/mysqlnd_wireprotocol.c | 56 +++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 2e8daa4a4a..29d55437d7 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -2304,7 +2304,7 @@ mysqlnd_packet_methods packet_methods[PROT_LAST] = /* {{{ mysqlnd_protocol::get_greet_packet */ static struct st_mysqlnd_packet_greet * -MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_greet * packet = mnd_pecalloc(1, packet_methods[PROT_GREET_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_greet_packet"); @@ -2319,7 +2319,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL * const prot /* {{{ mysqlnd_protocol::get_auth_packet */ static struct st_mysqlnd_packet_auth * -MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_auth * packet = mnd_pecalloc(1, packet_methods[PROT_AUTH_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_auth_packet"); @@ -2334,7 +2334,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL * const proto /* {{{ mysqlnd_protocol::get_auth_response_packet */ static struct st_mysqlnd_packet_auth_response * -MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_auth_response * packet = mnd_pecalloc(1, packet_methods[PROT_AUTH_RESP_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_auth_response_packet"); @@ -2349,7 +2349,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet)(MYSQLND_PROTOCOL * co /* {{{ mysqlnd_protocol::get_change_auth_response_packet */ static struct st_mysqlnd_packet_change_auth_response * -MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_change_auth_response * packet = mnd_pecalloc(1, packet_methods[PROT_CHANGE_AUTH_RESP_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_change_auth_response_packet"); @@ -2364,7 +2364,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet)(MYSQLND_PROTOC /* {{{ mysqlnd_protocol::get_ok_packet */ static struct st_mysqlnd_packet_ok * -MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_ok * packet = mnd_pecalloc(1, packet_methods[PROT_OK_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_ok_packet"); @@ -2379,7 +2379,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL * const protoco /* {{{ mysqlnd_protocol::get_eof_packet */ static struct st_mysqlnd_packet_eof * -MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_eof * packet = mnd_pecalloc(1, packet_methods[PROT_EOF_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_eof_packet"); @@ -2394,7 +2394,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL * const protoc /* {{{ mysqlnd_protocol::get_command_packet */ static struct st_mysqlnd_packet_command * -MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_command * packet = mnd_pecalloc(1, packet_methods[PROT_CMD_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_command_packet"); @@ -2409,7 +2409,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL * const pr /* {{{ mysqlnd_protocol::get_rset_packet */ static struct st_mysqlnd_packet_rset_header * -MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_rset_header * packet = mnd_pecalloc(1, packet_methods[PROT_RSET_HEADER_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_rset_header_packet"); @@ -2424,7 +2424,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL * cons /* {{{ mysqlnd_protocol::get_result_field_packet */ static struct st_mysqlnd_packet_res_field * -MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_res_field * packet = mnd_pecalloc(1, packet_methods[PROT_RSET_FLD_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_result_field_packet"); @@ -2439,7 +2439,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL * con /* {{{ mysqlnd_protocol::get_row_packet */ static struct st_mysqlnd_packet_row * -MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_row * packet = mnd_pecalloc(1, packet_methods[PROT_ROW_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_row_packet"); @@ -2454,7 +2454,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL * const protoc /* {{{ mysqlnd_protocol::get_stats_packet */ static struct st_mysqlnd_packet_stats * -MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_stats * packet = mnd_pecalloc(1, packet_methods[PROT_STATS_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_stats_packet"); @@ -2469,7 +2469,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL * const prot /* {{{ mysqlnd_protocol::get_prepare_response_packet */ static struct st_mysqlnd_packet_prepare_response * -MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_prepare_response * packet = mnd_pecalloc(1, packet_methods[PROT_PREPARE_RESP_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_prepare_response_packet"); @@ -2484,7 +2484,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL * /* {{{ mysqlnd_protocol::get_change_user_response_packet */ static struct st_mysqlnd_packet_chg_user_resp* -MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_chg_user_resp * packet = mnd_pecalloc(1, packet_methods[PROT_CHG_USER_RESP_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_change_user_response_packet"); @@ -2499,7 +2499,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOC /* {{{ mysqlnd_protocol::get_sha256_pk_request_packet */ static struct st_mysqlnd_packet_sha256_pk_request * -MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_sha256_pk_request * packet = mnd_pecalloc(1, packet_methods[PROT_SHA256_PK_REQUEST_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_sha256_pk_request_packet"); @@ -2514,7 +2514,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet)(MYSQLND_PROTOCOL /* {{{ mysqlnd_protocol::get_sha256_pk_request_response_packet */ static struct st_mysqlnd_packet_sha256_pk_request_response * -MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) { struct st_mysqlnd_packet_sha256_pk_request_response * packet = mnd_pecalloc(1, packet_methods[PROT_SHA256_PK_REQUEST_RESPONSE_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_sha256_pk_request_response_packet"); @@ -2528,7 +2528,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_ -MYSQLND_CLASS_METHODS_START(mysqlnd_protocol) +MYSQLND_CLASS_METHODS_START(mysqlnd_protocol_payload_decoder_factory) MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet), MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet), MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet), @@ -2547,27 +2547,27 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_protocol) MYSQLND_CLASS_METHODS_END; -/* {{{ mysqlnd_protocol_init */ -PHPAPI MYSQLND_PROTOCOL * -mysqlnd_protocol_init(zend_bool persistent) +/* {{{ mysqlnd_protocol_payload_decoder_factory_init */ +PHPAPI MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * +mysqlnd_protocol_payload_decoder_factory_init(zend_bool persistent) { - MYSQLND_PROTOCOL * ret; - DBG_ENTER("mysqlnd_protocol_init"); - ret = MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory).get_protocol_decoder(persistent); + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * ret; + DBG_ENTER("mysqlnd_protocol_payload_decoder_factory_init"); + ret = MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory).get_protocol_payload_decoder_factory(persistent); DBG_RETURN(ret); } /* }}} */ -/* {{{ mysqlnd_protocol_free */ +/* {{{ mysqlnd_protocol_payload_decoder_factory_free */ PHPAPI void -mysqlnd_protocol_free(MYSQLND_PROTOCOL * const protocol) +mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory) { - DBG_ENTER("mysqlnd_protocol_free"); + DBG_ENTER("mysqlnd_protocol_payload_decoder_factory_free"); - if (protocol) { - zend_bool pers = protocol->persistent; - mnd_pefree(protocol, pers); + if (factory) { + zend_bool pers = factory->persistent; + mnd_pefree(factory, pers); } DBG_VOID_RETURN; } -- cgit v1.2.1 From 75dc67c6ae620f1262d8233594dae2f7ed77a19a Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Wed, 7 Oct 2015 14:59:55 +0200 Subject: MNDR: - move macro to a function --- ext/mysqlnd/mysqlnd_wireprotocol.c | 106 +++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 40 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 29d55437d7..0d515e8fa4 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -29,38 +29,8 @@ #include "zend_ini.h" #define MYSQLND_SILENT 1 - #define MYSQLND_DUMP_HEADER_N_BODY -#define PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_size, packet_type_as_text, packet_type) \ - { \ - DBG_INF_FMT("buf=%p size=%u", (buf), (buf_size)); \ - if (FAIL == mysqlnd_read_header((conn)->net, &((packet)->header), (conn)->stats, ((conn)->error_info))) {\ - CONN_SET_STATE(conn, CONN_QUIT_SENT); \ - SET_CLIENT_ERROR(*conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);\ - php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); \ - DBG_ERR_FMT("Can't read %s's header", (packet_type_as_text)); \ - DBG_RETURN(FAIL);\ - }\ - if ((buf_size) < (packet)->header.size) { \ - DBG_ERR_FMT("Packet buffer %u wasn't big enough %u, %u bytes will be unread", \ - (buf_size), (packet)->header.size, (packet)->header.size - (buf_size)); \ - DBG_RETURN(FAIL); \ - }\ - if (FAIL == conn->net->data->m.receive_ex((conn)->net, (buf), (packet)->header.size, (conn)->stats, ((conn)->error_info))) { \ - CONN_SET_STATE(conn, CONN_QUIT_SENT); \ - SET_CLIENT_ERROR(*conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);\ - php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); \ - DBG_ERR_FMT("Empty '%s' packet body", (packet_type_as_text)); \ - DBG_RETURN(FAIL);\ - } \ - MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, packet_type_to_statistic_byte_count[packet_type], \ - MYSQLND_HEADER_SIZE + (packet)->header.size, \ - packet_type_to_statistic_packet_count[packet_type], \ - 1); \ - } - - #define BAIL_IF_NO_MORE_DATA \ if ((size_t)(p - begin) > packet->header.size) { \ php_error_docref(NULL, E_WARNING, "Premature end of data (mysqlnd_wireprotocol.c:%u)", __LINE__); \ @@ -316,6 +286,42 @@ mysqlnd_read_header(MYSQLND_NET * net, MYSQLND_PACKET_HEADER * header, /* }}} */ +/* {{{ mysqlnd_read_packet_header_and_body */ +static enum_func_status +mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, MYSQLND_CONN_DATA * conn, + zend_uchar * buf, size_t buf_size, const char * const packet_type_as_text, + enum mysqlnd_packet_type packet_type) +{ + DBG_ENTER("mysqlnd_read_packet_header_and_body"); + DBG_INF_FMT("buf=%p size=%u", buf, buf_size); + if (FAIL == mysqlnd_read_header(conn->net, packet_header, conn->stats, conn->error_info)) { + CONN_SET_STATE(conn, CONN_QUIT_SENT); + SET_CLIENT_ERROR(*conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); + DBG_ERR_FMT("Can't read %s's header", packet_type_as_text); + DBG_RETURN(FAIL); + } + if (buf_size < packet_header->size) { + DBG_ERR_FMT("Packet buffer %u wasn't big enough %u, %u bytes will be unread", + buf_size, packet_header->size, packet_header->size - buf_size); + DBG_RETURN(FAIL); + } + if (FAIL == conn->net->data->m.receive_ex(conn->net, buf, packet_header->size, conn->stats, conn->error_info)) { + CONN_SET_STATE(conn, CONN_QUIT_SENT); + SET_CLIENT_ERROR(*conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); + DBG_ERR_FMT("Empty '%s' packet body", packet_type_as_text); + DBG_RETURN(FAIL); + } + MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, packet_type_to_statistic_byte_count[packet_type], + MYSQLND_HEADER_SIZE + packet_header->size, + packet_type_to_statistic_packet_count[packet_type], + 1); + DBG_RETURN(PASS); +} +/* }}} */ + + /* {{{ php_mysqlnd_greet_read */ static enum_func_status php_mysqlnd_greet_read(void * _packet, MYSQLND_CONN_DATA * conn) @@ -328,7 +334,9 @@ php_mysqlnd_greet_read(void * _packet, MYSQLND_CONN_DATA * conn) DBG_ENTER("php_mysqlnd_greet_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, sizeof(buf), "greeting", PROT_GREET_PACKET); + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, sizeof(buf), "greeting", PROT_GREET_PACKET)) { + DBG_RETURN(FAIL); + } BAIL_IF_NO_MORE_DATA; packet->auth_plugin_data = packet->intern_auth_plugin_data; @@ -690,7 +698,9 @@ php_mysqlnd_auth_response_read(void * _packet, MYSQLND_CONN_DATA * conn) /* leave space for terminating safety \0 */ buf_len--; - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "OK", PROT_OK_PACKET); + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "OK", PROT_OK_PACKET)) { + DBG_RETURN(FAIL); + } BAIL_IF_NO_MORE_DATA; /* @@ -851,7 +861,9 @@ php_mysqlnd_ok_read(void * _packet, MYSQLND_CONN_DATA * conn) DBG_ENTER("php_mysqlnd_ok_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "OK", PROT_OK_PACKET); + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "OK", PROT_OK_PACKET)) { + DBG_RETURN(FAIL); + } BAIL_IF_NO_MORE_DATA; /* Should be always 0x0 or ERROR_MARKER for error */ @@ -941,7 +953,9 @@ php_mysqlnd_eof_read(void * _packet, MYSQLND_CONN_DATA * conn) DBG_ENTER("php_mysqlnd_eof_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "EOF", PROT_EOF_PACKET); + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "EOF", PROT_EOF_PACKET)) { + DBG_RETURN(FAIL); + } BAIL_IF_NO_MORE_DATA; /* Should be always EODATA_MARKER */ @@ -1092,7 +1106,9 @@ php_mysqlnd_rset_header_read(void * _packet, MYSQLND_CONN_DATA * conn) DBG_ENTER("php_mysqlnd_rset_header_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "resultset header", PROT_RSET_HEADER_PACKET); + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "resultset header", PROT_RSET_HEADER_PACKET)) { + DBG_RETURN(FAIL); + } BAIL_IF_NO_MORE_DATA; /* @@ -1234,7 +1250,9 @@ php_mysqlnd_rset_field_read(void * _packet, MYSQLND_CONN_DATA * conn) DBG_ENTER("php_mysqlnd_rset_field_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "field", PROT_RSET_FLD_PACKET); + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "field", PROT_RSET_FLD_PACKET)) { + DBG_RETURN(FAIL); + } if (packet->skip_parsing) { DBG_RETURN(PASS); @@ -1913,7 +1931,9 @@ php_mysqlnd_stats_read(void * _packet, MYSQLND_CONN_DATA * conn) DBG_ENTER("php_mysqlnd_stats_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "statistics", PROT_STATS_PACKET); + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "statistics", PROT_STATS_PACKET)) { + DBG_RETURN(FAIL); + } packet->message = mnd_emalloc(packet->header.size + 1); memcpy(packet->message, buf, packet->header.size); @@ -1959,7 +1979,9 @@ php_mysqlnd_prepare_read(void * _packet, MYSQLND_CONN_DATA * conn) DBG_ENTER("php_mysqlnd_prepare_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "prepare", PROT_PREPARE_RESP_PACKET); + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "prepare", PROT_PREPARE_RESP_PACKET)) { + DBG_RETURN(FAIL); + } BAIL_IF_NO_MORE_DATA; data_size = packet->header.size; @@ -2046,7 +2068,9 @@ php_mysqlnd_chg_user_read(void * _packet, MYSQLND_CONN_DATA * conn) DBG_ENTER("php_mysqlnd_chg_user_read"); - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "change user response", PROT_CHG_USER_RESP_PACKET); + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "change user response", PROT_CHG_USER_RESP_PACKET)) { + DBG_RETURN(FAIL); + } BAIL_IF_NO_MORE_DATA; /* @@ -2164,7 +2188,9 @@ php_mysqlnd_sha256_pk_request_response_read(void * _packet, MYSQLND_CONN_DATA * DBG_ENTER("php_mysqlnd_sha256_pk_request_response_read"); /* leave space for terminating safety \0 */ - PACKET_READ_HEADER_AND_BODY(packet, conn, buf, sizeof(buf), "SHA256_PK_REQUEST_RESPONSE", PROT_SHA256_PK_REQUEST_RESPONSE_PACKET); + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, sizeof(buf), "SHA256_PK_REQUEST_RESPONSE", PROT_SHA256_PK_REQUEST_RESPONSE_PACKET)) { + DBG_RETURN(FAIL); + } BAIL_IF_NO_MORE_DATA; p++; -- cgit v1.2.1 From cfd868651a321fbfd84ed98e33669c5f94a7098a Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 12 Oct 2015 14:57:48 +0200 Subject: MDNR: - removed init() method from mysqlnd_conn_data and moved the initialization to the object factory->get_connection(). Now it is unified as with the prepared statement which doesn't have any init() method - the protocol decoder factory now takes connection as parameter at creation and thus there is no need to pass the connection as parameter when calling the read or the write method of a packet. - saved the protocol payload decoder factory as pointer in every packet (read/write) so the connection doesn't need to be passed on every call of read/write (dependency has been already injected at creation). This will alow to move protocol specific code from MYSQLND_NET (send_ex()) to make MYSQLND_NET leaner and free from protocol stuff. --- ext/mysqlnd/mysqlnd_wireprotocol.c | 107 ++++++++++++++++++++++++++++--------- 1 file changed, 81 insertions(+), 26 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 0d515e8fa4..a67e583d05 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -324,13 +324,15 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, MYSQL /* {{{ php_mysqlnd_greet_read */ static enum_func_status -php_mysqlnd_greet_read(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_greet_read(void * _packet) { zend_uchar buf[2048]; zend_uchar *p = buf; zend_uchar *begin = buf; zend_uchar *pad_start = NULL; MYSQLND_PACKET_GREET *packet= (MYSQLND_PACKET_GREET *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); DBG_ENTER("php_mysqlnd_greet_read"); @@ -488,12 +490,14 @@ void php_mysqlnd_greet_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_auth_write */ static -size_t php_mysqlnd_auth_write(void * _packet, MYSQLND_CONN_DATA * conn) +size_t php_mysqlnd_auth_write(void * _packet) { zend_uchar buffer[AUTH_WRITE_BUFFER_LEN]; zend_uchar *p = buffer + MYSQLND_HEADER_SIZE; /* start after the header */ int len; MYSQLND_PACKET_AUTH * packet= (MYSQLND_PACKET_AUTH *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); DBG_ENTER("php_mysqlnd_auth_write"); @@ -684,15 +688,17 @@ void php_mysqlnd_auth_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_auth_response_read */ static enum_func_status -php_mysqlnd_auth_response_read(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_auth_response_read(void * _packet) { + register MYSQLND_PACKET_AUTH_RESPONSE * packet= (MYSQLND_PACKET_AUTH_RESPONSE *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); zend_uchar local_buf[AUTH_RESP_BUFFER_SIZE]; size_t buf_len = conn->net->cmd_buffer.buffer? conn->net->cmd_buffer.length: AUTH_RESP_BUFFER_SIZE; zend_uchar *buf = conn->net->cmd_buffer.buffer? (zend_uchar *) conn->net->cmd_buffer.buffer : local_buf; zend_uchar *p = buf; zend_uchar *begin = buf; zend_ulong i; - register MYSQLND_PACKET_AUTH_RESPONSE * packet= (MYSQLND_PACKET_AUTH_RESPONSE *) _packet; DBG_ENTER("php_mysqlnd_auth_response_read"); @@ -806,9 +812,11 @@ php_mysqlnd_auth_response_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_change_auth_response_write */ static size_t -php_mysqlnd_change_auth_response_write(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_change_auth_response_write(void * _packet) { MYSQLND_PACKET_CHANGE_AUTH_RESPONSE *packet= (MYSQLND_PACKET_CHANGE_AUTH_RESPONSE *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); zend_uchar * buffer = conn->net->cmd_buffer.length >= packet->auth_data_len? conn->net->cmd_buffer.buffer : mnd_emalloc(packet->auth_data_len); zend_uchar *p = buffer + MYSQLND_HEADER_SIZE; /* start after the header */ @@ -849,15 +857,17 @@ php_mysqlnd_change_auth_response_free_mem(void * _packet, zend_bool stack_alloca /* {{{ php_mysqlnd_ok_read */ static enum_func_status -php_mysqlnd_ok_read(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_ok_read(void * _packet) { + register MYSQLND_PACKET_OK *packet= (MYSQLND_PACKET_OK *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); zend_uchar local_buf[OK_BUFFER_SIZE]; size_t buf_len = conn->net->cmd_buffer.buffer? conn->net->cmd_buffer.length : OK_BUFFER_SIZE; zend_uchar *buf = conn->net->cmd_buffer.buffer? (zend_uchar *) conn->net->cmd_buffer.buffer : local_buf; zend_uchar *p = buf; zend_uchar *begin = buf; zend_ulong i; - register MYSQLND_PACKET_OK *packet= (MYSQLND_PACKET_OK *) _packet; DBG_ENTER("php_mysqlnd_ok_read"); @@ -937,7 +947,7 @@ php_mysqlnd_ok_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_eof_read */ static enum_func_status -php_mysqlnd_eof_read(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_eof_read(void * _packet) { /* EOF packet is since 4.1 five bytes long, @@ -946,6 +956,8 @@ php_mysqlnd_eof_read(void * _packet, MYSQLND_CONN_DATA * conn) Error : error_code + '#' + sqlstate + MYSQLND_ERRMSG_SIZE */ MYSQLND_PACKET_EOF *packet= (MYSQLND_PACKET_EOF *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); size_t buf_len = conn->net->cmd_buffer.length; zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; zend_uchar *p = buf; @@ -1016,10 +1028,12 @@ void php_mysqlnd_eof_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_cmd_write */ -size_t php_mysqlnd_cmd_write(void * _packet, MYSQLND_CONN_DATA * conn) +size_t php_mysqlnd_cmd_write(void * _packet) { /* Let's have some space, which we can use, if not enough, we will allocate new buffer */ MYSQLND_PACKET_COMMAND * packet= (MYSQLND_PACKET_COMMAND *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); MYSQLND_NET * net = conn->net; unsigned int error_reporting = EG(error_reporting); size_t sent = 0; @@ -1094,15 +1108,17 @@ void php_mysqlnd_cmd_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_rset_header_read */ static enum_func_status -php_mysqlnd_rset_header_read(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_rset_header_read(void * _packet) { + MYSQLND_PACKET_RSET_HEADER * packet= (MYSQLND_PACKET_RSET_HEADER *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); enum_func_status ret = PASS; size_t buf_len = conn->net->cmd_buffer.length; zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; size_t len; - MYSQLND_PACKET_RSET_HEADER *packet= (MYSQLND_PACKET_RSET_HEADER *) _packet; DBG_ENTER("php_mysqlnd_rset_header_read"); @@ -1235,10 +1251,12 @@ static size_t rset_field_offsets[] = /* {{{ php_mysqlnd_rset_field_read */ static enum_func_status -php_mysqlnd_rset_field_read(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_rset_field_read(void * _packet) { /* Should be enough for the metadata of a single row */ MYSQLND_PACKET_RES_FIELD *packet = (MYSQLND_PACKET_RES_FIELD *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); size_t buf_len = conn->net->cmd_buffer.length, total_len = 0; zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; zend_uchar *p = buf; @@ -1803,11 +1821,13 @@ php_mysqlnd_rowp_read_text_protocol_c(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zv if PS => packet->fields is passed from outside */ static enum_func_status -php_mysqlnd_rowp_read(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_rowp_read(void * _packet) { + MYSQLND_PACKET_ROW *packet= (MYSQLND_PACKET_ROW *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); zend_uchar *p; enum_func_status ret = PASS; - MYSQLND_PACKET_ROW *packet= (MYSQLND_PACKET_ROW *) _packet; size_t post_alloc_for_bit_fields = 0; size_t data_size = 0; @@ -1923,9 +1943,11 @@ php_mysqlnd_rowp_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_stats_read */ static enum_func_status -php_mysqlnd_stats_read(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_stats_read(void * _packet) { MYSQLND_PACKET_STATS *packet= (MYSQLND_PACKET_STATS *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); size_t buf_len = conn->net->cmd_buffer.length; zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; @@ -1967,15 +1989,17 @@ void php_mysqlnd_stats_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_prepare_read */ static enum_func_status -php_mysqlnd_prepare_read(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_prepare_read(void * _packet) { + MYSQLND_PACKET_PREPARE_RESPONSE *packet= (MYSQLND_PACKET_PREPARE_RESPONSE *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); /* In case of an error, we should have place to put it */ size_t buf_len = conn->net->cmd_buffer.length; zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; unsigned int data_size; - MYSQLND_PACKET_PREPARE_RESPONSE *packet= (MYSQLND_PACKET_PREPARE_RESPONSE *) _packet; DBG_ENTER("php_mysqlnd_prepare_read"); @@ -2057,14 +2081,16 @@ php_mysqlnd_prepare_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_chg_user_read */ static enum_func_status -php_mysqlnd_chg_user_read(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_chg_user_read(void * _packet) { + MYSQLND_PACKET_CHG_USER_RESPONSE *packet= (MYSQLND_PACKET_CHG_USER_RESPONSE *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); /* There could be an error message */ size_t buf_len = conn->net->cmd_buffer.length; zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; - MYSQLND_PACKET_CHG_USER_RESPONSE *packet= (MYSQLND_PACKET_CHG_USER_RESPONSE *) _packet; DBG_ENTER("php_mysqlnd_chg_user_read"); @@ -2147,8 +2173,11 @@ php_mysqlnd_chg_user_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_sha256_pk_request_write */ static -size_t php_mysqlnd_sha256_pk_request_write(void * _packet, MYSQLND_CONN_DATA * conn) +size_t php_mysqlnd_sha256_pk_request_write(void * _packet) { + MYSQLND_PACKET_HEADER *packet_header= (MYSQLND_PACKET_HEADER *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet_header->factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); zend_uchar buffer[MYSQLND_HEADER_SIZE + 1]; size_t sent; @@ -2178,12 +2207,14 @@ void php_mysqlnd_sha256_pk_request_free_mem(void * _packet, zend_bool stack_allo /* {{{ php_mysqlnd_sha256_pk_request_response_read */ static enum_func_status -php_mysqlnd_sha256_pk_request_response_read(void * _packet, MYSQLND_CONN_DATA * conn) +php_mysqlnd_sha256_pk_request_response_read(void * _packet) { + MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE * packet= (MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE *) _packet; + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; + MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); zend_uchar buf[SHA256_PK_REQUEST_RESP_BUFFER_SIZE]; zend_uchar *p = buf; zend_uchar *begin = buf; - MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE * packet= (MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE *) _packet; DBG_ENTER("php_mysqlnd_sha256_pk_request_response_read"); @@ -2328,6 +2359,16 @@ mysqlnd_packet_methods packet_methods[PROT_LAST] = /* }}} */ +/* {{{ mysqlnd_protocol::get_mysqlnd_conn_data */ +MYSQLND_CONN_DATA * +MYSQLND_METHOD(mysqlnd_protocol, get_mysqlnd_conn_data)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory) +{ + DBG_ENTER("mysqlnd_protocol::get_mysqlnd_conn_data"); + DBG_RETURN(factory->conn); +} +/* }}} */ + + /* {{{ mysqlnd_protocol::get_greet_packet */ static struct st_mysqlnd_packet_greet * MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) @@ -2336,6 +2377,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECO DBG_ENTER("mysqlnd_protocol::get_greet_packet"); if (packet) { packet->header.m = &packet_methods[PROT_GREET_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2351,6 +2393,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECOD DBG_ENTER("mysqlnd_protocol::get_auth_packet"); if (packet) { packet->header.m = &packet_methods[PROT_AUTH_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2366,6 +2409,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet)(MYSQLND_PROTOCOL_PAYL DBG_ENTER("mysqlnd_protocol::get_auth_response_packet"); if (packet) { packet->header.m = &packet_methods[PROT_AUTH_RESP_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2381,6 +2425,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet)(MYSQLND_PROTOC DBG_ENTER("mysqlnd_protocol::get_change_auth_response_packet"); if (packet) { packet->header.m = &packet_methods[PROT_CHANGE_AUTH_RESP_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2396,6 +2441,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER DBG_ENTER("mysqlnd_protocol::get_ok_packet"); if (packet) { packet->header.m = &packet_methods[PROT_OK_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2411,6 +2457,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODE DBG_ENTER("mysqlnd_protocol::get_eof_packet"); if (packet) { packet->header.m = &packet_methods[PROT_EOF_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2426,6 +2473,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL_PAYLOAD_DE DBG_ENTER("mysqlnd_protocol::get_command_packet"); if (packet) { packet->header.m = &packet_methods[PROT_CMD_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2441,6 +2489,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL_PAYLOA DBG_ENTER("mysqlnd_protocol::get_rset_header_packet"); if (packet) { packet->header.m = &packet_methods[PROT_RSET_HEADER_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2456,6 +2505,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL_PAYLO DBG_ENTER("mysqlnd_protocol::get_result_field_packet"); if (packet) { packet->header.m = &packet_methods[PROT_RSET_FLD_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2471,6 +2521,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODE DBG_ENTER("mysqlnd_protocol::get_row_packet"); if (packet) { packet->header.m = &packet_methods[PROT_ROW_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2486,6 +2537,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECO DBG_ENTER("mysqlnd_protocol::get_stats_packet"); if (packet) { packet->header.m = &packet_methods[PROT_STATS_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2501,6 +2553,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL_P DBG_ENTER("mysqlnd_protocol::get_prepare_response_packet"); if (packet) { packet->header.m = &packet_methods[PROT_PREPARE_RESP_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2516,6 +2569,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOC DBG_ENTER("mysqlnd_protocol::get_change_user_response_packet"); if (packet) { packet->header.m = &packet_methods[PROT_CHG_USER_RESP_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2531,6 +2585,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet)(MYSQLND_PROTOCOL_ DBG_ENTER("mysqlnd_protocol::get_sha256_pk_request_packet"); if (packet) { packet->header.m = &packet_methods[PROT_SHA256_PK_REQUEST_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2546,15 +2601,15 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_ DBG_ENTER("mysqlnd_protocol::get_sha256_pk_request_response_packet"); if (packet) { packet->header.m = &packet_methods[PROT_SHA256_PK_REQUEST_RESPONSE_PACKET]; + packet->header.factory = factory; packet->header.persistent = persistent; } DBG_RETURN(packet); } /* }}} */ - - MYSQLND_CLASS_METHODS_START(mysqlnd_protocol_payload_decoder_factory) + MYSQLND_METHOD(mysqlnd_protocol, get_mysqlnd_conn_data), MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet), MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet), MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet), @@ -2575,11 +2630,11 @@ MYSQLND_CLASS_METHODS_END; /* {{{ mysqlnd_protocol_payload_decoder_factory_init */ PHPAPI MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * -mysqlnd_protocol_payload_decoder_factory_init(zend_bool persistent) +mysqlnd_protocol_payload_decoder_factory_init(MYSQLND_CONN_DATA * conn, zend_bool persistent) { MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * ret; DBG_ENTER("mysqlnd_protocol_payload_decoder_factory_init"); - ret = MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory).get_protocol_payload_decoder_factory(persistent); + ret = MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory).get_protocol_payload_decoder_factory(conn, persistent); DBG_RETURN(ret); } /* }}} */ -- cgit v1.2.1 From 7d7ff67b8280db3781450a1b35d8ab80b378e6d5 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 19 Oct 2015 17:05:52 +0200 Subject: MDNR: - send_command() is no more, thus we need commands for all COM_STMT_* + CHANGE_USER --- ext/mysqlnd/mysqlnd_wireprotocol.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index a67e583d05..b37ffe8dbb 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -655,12 +655,16 @@ size_t php_mysqlnd_auth_write(void * _packet) } } if (packet->is_change_user_packet) { - if (PASS != conn->m->send_command(conn, COM_CHANGE_USER, buffer + MYSQLND_HEADER_SIZE, p - buffer - MYSQLND_HEADER_SIZE, - PROT_LAST /* the caller will handle the OK packet */, - packet->silent, TRUE)) { - DBG_RETURN(0); + enum_func_status ret = FAIL; + const MYSQLND_CSTRING payload = {buffer + MYSQLND_HEADER_SIZE, p - (buffer + MYSQLND_HEADER_SIZE)}; + const unsigned int silent = packet->silent; + struct st_mysqlnd_protocol_command * command = mysqlnd_get_command(COM_CHANGE_USER, conn, payload, silent); + if (command) { + ret = command->run(command); + command->free_command(command); } - DBG_RETURN(p - buffer - MYSQLND_HEADER_SIZE); + + DBG_RETURN(ret == PASS? (p - buffer - MYSQLND_HEADER_SIZE) : 0); } else { size_t sent = conn->net->data->m.send_ex(conn->net, buffer, p - buffer - MYSQLND_HEADER_SIZE, conn->stats, conn->error_info); if (!sent) { -- cgit v1.2.1 From 10d4fb8a9428d2b84ac6093bb3987ef667916fd4 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 19 Oct 2015 18:20:28 +0200 Subject: MDNR: - Refactor the command factory. Let the factory be exchangeable. --- ext/mysqlnd/mysqlnd_wireprotocol.c | 1054 +++++++++++++++++++++++++++++++++++- 1 file changed, 1053 insertions(+), 1 deletion(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index b37ffe8dbb..d686677a58 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -658,7 +658,7 @@ size_t php_mysqlnd_auth_write(void * _packet) enum_func_status ret = FAIL; const MYSQLND_CSTRING payload = {buffer + MYSQLND_HEADER_SIZE, p - (buffer + MYSQLND_HEADER_SIZE)}; const unsigned int silent = packet->silent; - struct st_mysqlnd_protocol_command * command = mysqlnd_get_command(COM_CHANGE_USER, conn, payload, silent); + struct st_mysqlnd_protocol_command * command = conn->command_factory(COM_CHANGE_USER, conn, payload, silent); if (command) { ret = command->run(command); command->free_command(command); @@ -2659,6 +2659,1058 @@ mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_F /* }}} */ + + +struct st_mysqlnd_protocol_no_params_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_protocol_no_params_command_context + { + MYSQLND_CONN_DATA * conn; + } context; +}; + +/* {{{ mysqlnd_com_no_params_free_command */ +static void +mysqlnd_com_no_params_free_command(void * command) +{ + DBG_ENTER("mysqlnd_com_no_params_free_command"); + mnd_efree(command); + DBG_VOID_RETURN; +} +/* }}} */ + + +/************************** COM_SET_OPTION ******************************************/ +struct st_mysqlnd_protocol_com_set_option_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_set_option_context + { + MYSQLND_CONN_DATA * conn; + enum_mysqlnd_server_option option; + } context; +}; + + +/* {{{ mysqlnd_com_set_option_run */ +enum_func_status +mysqlnd_com_set_option_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_set_option_command * command = (struct st_mysqlnd_protocol_com_set_option_command *) cmd; + zend_uchar buffer[2]; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + enum_mysqlnd_server_option option = command->context.option; + + DBG_ENTER("mysqlnd_com_set_option_run"); + int2store(buffer, (unsigned int) option); + + ret = conn->m->send_command_do_request(conn, COM_SET_OPTION, buffer, sizeof(buffer), FALSE, TRUE); + if (PASS == ret) { + ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, FALSE, COM_SET_OPTION, TRUE); + } + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_set_option_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_set_option_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_set_option_command * command; + DBG_ENTER("mysqlnd_com_set_option_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_set_option_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.option = va_arg(args, enum_mysqlnd_server_option); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_set_option_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_DEBUG ******************************************/ +/* {{{ mysqlnd_com_debug_run */ +static enum_func_status +mysqlnd_com_debug_run(void *cmd) +{ + struct st_mysqlnd_protocol_no_params_command * command = (struct st_mysqlnd_protocol_no_params_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_debug_run"); + + ret = conn->m->send_command_do_request(conn, COM_DEBUG, NULL, 0, FALSE, TRUE); + if (PASS == ret) { + ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, COM_DEBUG, COM_DEBUG, TRUE); + } + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_debug_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_debug_create_command(va_list args) +{ + struct st_mysqlnd_protocol_no_params_command * command; + DBG_ENTER("mysqlnd_com_debug_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_no_params_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->parent.free_command = mysqlnd_com_no_params_free_command; + + command->parent.run = mysqlnd_com_debug_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_INIT_DB ******************************************/ +struct st_mysqlnd_protocol_com_init_db_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_init_db_context + { + MYSQLND_CONN_DATA * conn; + MYSQLND_CSTRING db; + } context; +}; + + +/* {{{ mysqlnd_com_init_db_run */ +static enum_func_status +mysqlnd_com_init_db_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_init_db_command * command = (struct st_mysqlnd_protocol_com_init_db_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_init_db_run"); + + ret = conn->m->send_command_do_request(conn, COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, TRUE); + if (PASS == ret) { + ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_INIT_DB, TRUE); + } + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_init_db_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_init_db_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_init_db_command * command; + DBG_ENTER("mysqlnd_com_init_db_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_init_db_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.db = va_arg(args, MYSQLND_CSTRING); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_init_db_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_PING ******************************************/ +/* {{{ mysqlnd_com_ping_run */ +static enum_func_status +mysqlnd_com_ping_run(void *cmd) +{ + struct st_mysqlnd_protocol_no_params_command * command = (struct st_mysqlnd_protocol_no_params_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_ping_run"); + + ret = conn->m->send_command_do_request(conn, COM_PING, NULL, 0, TRUE, TRUE); + if (PASS == ret) { + ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, TRUE, COM_PING, TRUE); + } + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_ping_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_ping_create_command(va_list args) +{ + struct st_mysqlnd_protocol_no_params_command * command; + DBG_ENTER("mysqlnd_com_ping_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_no_params_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->parent.free_command = mysqlnd_com_no_params_free_command; + + command->parent.run = mysqlnd_com_ping_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + +/************************** COM_FIELD_LIST ******************************************/ +struct st_mysqlnd_protocol_com_field_list_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_field_list_context + { + MYSQLND_CONN_DATA * conn; + MYSQLND_CSTRING table; + MYSQLND_CSTRING achtung_wild; + } context; +}; + + +/* {{{ mysqlnd_com_field_list_run */ +static enum_func_status +mysqlnd_com_field_list_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_field_list_command * command = (struct st_mysqlnd_protocol_com_field_list_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + /* db + \0 + wild + \0 (for wild) */ + zend_uchar buff[MYSQLND_MAX_ALLOWED_DB_LEN * 2 + 1 + 1], *p; + size_t table_len, wild_len; + + DBG_ENTER("mysqlnd_com_field_list_run"); + + if (command->context.table.s && command->context.table.l) { + size_t to_copy = MIN(command->context.table.l, MYSQLND_MAX_ALLOWED_DB_LEN); + memcpy(p, command->context.table.s, to_copy); + p += to_copy; + *p++ = '\0'; + } + + if (command->context.achtung_wild.s && command->context.achtung_wild.l) { + size_t to_copy = MIN(command->context.achtung_wild.l, MYSQLND_MAX_ALLOWED_DB_LEN); + memcpy(p, command->context.achtung_wild.s, to_copy); + p += to_copy; + *p++ = '\0'; + } + + ret = conn->m->send_command_do_request(conn, COM_FIELD_LIST, buff, p - buff, FALSE, TRUE); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_field_list_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_field_list_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_field_list_command * command; + DBG_ENTER("mysqlnd_com_field_list_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_field_list_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.table = va_arg(args, MYSQLND_CSTRING); + command->context.achtung_wild = va_arg(args, MYSQLND_CSTRING); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_field_list_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_STATISTICS ******************************************/ +/* {{{ mysqlnd_com_statistics_run */ +static enum_func_status +mysqlnd_com_statistics_run(void *cmd) +{ + struct st_mysqlnd_protocol_no_params_command * command = (struct st_mysqlnd_protocol_no_params_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_statistics_run"); + + ret = conn->m->send_command_do_request(conn, COM_STATISTICS, NULL, 0, FALSE, TRUE); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_statistics_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_statistics_create_command(va_list args) +{ + struct st_mysqlnd_protocol_no_params_command * command; + DBG_ENTER("mysqlnd_com_statistics_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_no_params_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->parent.free_command = mysqlnd_com_no_params_free_command; + + command->parent.run = mysqlnd_com_statistics_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + +/************************** COM_PROCESS_KILL ******************************************/ +struct st_mysqlnd_protocol_com_process_kill_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_process_kill_context + { + MYSQLND_CONN_DATA * conn; + unsigned int process_id; + zend_bool read_response; + } context; +}; + + +/* {{{ mysqlnd_com_process_kill_run */ +enum_func_status +mysqlnd_com_process_kill_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_process_kill_command * command = (struct st_mysqlnd_protocol_com_process_kill_command *) cmd; + zend_uchar buff[4]; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_process_kill_run"); + int4store(buff, command->context.process_id); + + ret = conn->m->send_command_do_request(conn, COM_PROCESS_KILL, buff, 4, FALSE, TRUE); + if (PASS == ret && command->context.read_response) { + ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE); + } + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_process_kill_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_process_kill_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_process_kill_command * command; + DBG_ENTER("mysqlnd_com_process_kill_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_process_kill_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.process_id = va_arg(args, unsigned int); + command->context.read_response = va_arg(args, unsigned int)? TRUE:FALSE; + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_process_kill_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + +/************************** COM_REFRESH ******************************************/ +struct st_mysqlnd_protocol_com_refresh_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_refresh_context + { + MYSQLND_CONN_DATA * conn; + uint8_t options; + } context; +}; + + +/* {{{ mysqlnd_com_refresh_run */ +enum_func_status +mysqlnd_com_refresh_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_refresh_command * command = (struct st_mysqlnd_protocol_com_refresh_command *) cmd; + zend_uchar bits[1]; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_refresh_run"); + int1store(bits, command->context.options); + + ret = conn->m->send_command_do_request(conn, COM_REFRESH, bits, 1, FALSE, TRUE); + if (PASS == ret) { + ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_REFRESH, TRUE); + } + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_refresh_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_refresh_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_refresh_command * command; + DBG_ENTER("mysqlnd_com_refresh_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_refresh_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.options = va_arg(args, unsigned int); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_refresh_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_SHUTDOWN ******************************************/ +struct st_mysqlnd_protocol_com_shutdown_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_shutdown_context + { + MYSQLND_CONN_DATA * conn; + uint8_t level; + } context; +}; + + +/* {{{ mysqlnd_com_shutdown_run */ +enum_func_status +mysqlnd_com_shutdown_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_shutdown_command * command = (struct st_mysqlnd_protocol_com_shutdown_command *) cmd; + zend_uchar bits[1]; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_shutdown_run"); + int1store(bits, command->context.level); + + ret = conn->m->send_command_do_request(conn, COM_SHUTDOWN, bits, 1, FALSE, TRUE); + if (PASS == ret) { + ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_SHUTDOWN, TRUE); + } + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_shutdown_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_shutdown_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_shutdown_command * command; + DBG_ENTER("mysqlnd_com_shutdown_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_shutdown_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.level = va_arg(args, unsigned int); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_shutdown_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_QUIT ******************************************/ +struct st_mysqlnd_protocol_com_quit_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_quit_context + { + MYSQLND_CONN_DATA * conn; + } context; +}; + + +/* {{{ mysqlnd_com_quit_run */ +enum_func_status +mysqlnd_com_quit_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_quit_command * command = (struct st_mysqlnd_protocol_com_quit_command *) cmd; + zend_uchar bits[1]; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_quit_run"); + + ret = conn->m->send_command_do_request(conn, COM_QUIT, NULL, 0, TRUE, TRUE); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_quit_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_quit_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_quit_command * command; + DBG_ENTER("mysqlnd_com_quit_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_quit_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_quit_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + +/************************** COM_QUERY ******************************************/ +struct st_mysqlnd_protocol_com_query_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_query_context + { + MYSQLND_CONN_DATA * conn; + MYSQLND_CSTRING query; + } context; +}; + + +/* {{{ mysqlnd_com_query_run */ +static enum_func_status +mysqlnd_com_query_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_query_command * command = (struct st_mysqlnd_protocol_com_query_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_query_run"); + + ret = conn->m->send_command_do_request(conn, COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, FALSE); + + if (PASS == ret) { + CONN_SET_STATE(conn, CONN_QUERY_SENT); + } + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_query_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_query_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_query_command * command; + DBG_ENTER("mysqlnd_com_query_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_query_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.query = va_arg(args, MYSQLND_CSTRING); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_query_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + +/************************** COM_CHANGE_USER ******************************************/ +struct st_mysqlnd_protocol_com_change_user_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_change_user_context + { + MYSQLND_CONN_DATA * conn; + MYSQLND_CSTRING payload; + zend_bool silent; + } context; +}; + + +/* {{{ mysqlnd_com_change_user_run */ +static enum_func_status +mysqlnd_com_change_user_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_change_user_command * command = (struct st_mysqlnd_protocol_com_change_user_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_change_user_run"); + + ret = conn->m->send_command_do_request(conn, COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, TRUE); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_change_user_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_change_user_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_change_user_command * command; + DBG_ENTER("mysqlnd_com_change_user_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_change_user_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.payload = va_arg(args, MYSQLND_CSTRING); + command->context.silent = va_arg(args, unsigned int); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_change_user_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_REAP_RESULT ******************************************/ +struct st_mysqlnd_protocol_com_reap_result_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_reap_result_context + { + MYSQLND_CONN_DATA * conn; + } context; +}; + + +/* {{{ mysqlnd_com_reap_result_run */ +static enum_func_status +mysqlnd_com_reap_result_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_reap_result_command * command = (struct st_mysqlnd_protocol_com_reap_result_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + enum_mysqlnd_connection_state state = CONN_GET_STATE(conn); + + DBG_ENTER("mysqlnd_com_reap_result_run"); + if (state <= CONN_READY || state == CONN_QUIT_SENT) { + php_error_docref(NULL, E_WARNING, "Connection not opened, clear or has been closed"); + DBG_ERR_FMT("Connection not opened, clear or has been closed. State=%u", state); + DBG_RETURN(ret); + } + ret = conn->m->query_read_result_set_header(conn, NULL); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_reap_result_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_reap_result_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_reap_result_command * command; + DBG_ENTER("mysqlnd_com_reap_result_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_reap_result_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_reap_result_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_STMT_PREPARE ******************************************/ +struct st_mysqlnd_protocol_com_stmt_prepare_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_stmt_prepare_context + { + MYSQLND_CONN_DATA * conn; + MYSQLND_CSTRING query; + } context; +}; + + +/* {{{ mysqlnd_com_stmt_prepare_run */ +static enum_func_status +mysqlnd_com_stmt_prepare_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_stmt_prepare_command * command = (struct st_mysqlnd_protocol_com_stmt_prepare_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_stmt_prepare_run"); + + ret = conn->m->send_command_do_request(conn, COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, TRUE); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_stmt_prepare_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_stmt_prepare_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_stmt_prepare_command * command; + DBG_ENTER("mysqlnd_com_stmt_prepare_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_prepare_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.query = va_arg(args, MYSQLND_CSTRING); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_stmt_prepare_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_STMT_EXECUTE ******************************************/ +struct st_mysqlnd_protocol_com_stmt_execute_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_stmt_execute_context + { + MYSQLND_CONN_DATA * conn; + MYSQLND_CSTRING payload; + } context; +}; + + +/* {{{ mysqlnd_com_stmt_execute_run */ +static enum_func_status +mysqlnd_com_stmt_execute_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_stmt_execute_command * command = (struct st_mysqlnd_protocol_com_stmt_execute_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_stmt_execute_run"); + + ret = conn->m->send_command_do_request(conn, COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, FALSE); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_stmt_execute_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_stmt_execute_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_stmt_execute_command * command; + DBG_ENTER("mysqlnd_com_stmt_execute_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_execute_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.payload = va_arg(args, MYSQLND_CSTRING); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_stmt_execute_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_STMT_FETCH ******************************************/ +struct st_mysqlnd_protocol_com_stmt_fetch_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_stmt_fetch_context + { + MYSQLND_CONN_DATA * conn; + MYSQLND_CSTRING payload; + } context; +}; + + +/* {{{ mysqlnd_com_stmt_fetch_run */ +static enum_func_status +mysqlnd_com_stmt_fetch_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_stmt_fetch_command * command = (struct st_mysqlnd_protocol_com_stmt_fetch_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_stmt_fetch_run"); + + ret = conn->m->send_command_do_request(conn, COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_stmt_fetch_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_stmt_fetch_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_stmt_fetch_command * command; + DBG_ENTER("mysqlnd_com_stmt_fetch_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_fetch_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.payload = va_arg(args, MYSQLND_CSTRING); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_stmt_fetch_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_STMT_RESET ******************************************/ +struct st_mysqlnd_protocol_com_stmt_reset_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_stmt_reset_context + { + MYSQLND_CONN_DATA * conn; + zend_ulong stmt_id; + } context; +}; + + +/* {{{ mysqlnd_com_stmt_reset_run */ +static enum_func_status +mysqlnd_com_stmt_reset_run(void *cmd) +{ + zend_uchar cmd_buf[MYSQLND_STMT_ID_LENGTH /* statement id */]; + struct st_mysqlnd_protocol_com_stmt_reset_command * command = (struct st_mysqlnd_protocol_com_stmt_reset_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_stmt_reset_run"); + + int4store(cmd_buf, command->context.stmt_id); + ret = conn->m->send_command_do_request(conn, COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, TRUE); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_stmt_reset_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_stmt_reset_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_stmt_reset_command * command; + DBG_ENTER("mysqlnd_com_stmt_reset_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_reset_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.stmt_id = va_arg(args, size_t); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_stmt_reset_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_STMT_SEND_LONG_DATA ******************************************/ +struct st_mysqlnd_protocol_com_stmt_send_long_data_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_stmt_send_long_data_context + { + MYSQLND_CONN_DATA * conn; + MYSQLND_CSTRING payload; + } context; +}; + + +/* {{{ mysqlnd_com_stmt_send_long_data_run */ +static enum_func_status +mysqlnd_com_stmt_send_long_data_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_stmt_send_long_data_command * command = (struct st_mysqlnd_protocol_com_stmt_send_long_data_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_stmt_send_long_data_run"); + + ret = conn->m->send_command_do_request(conn, COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_stmt_send_long_data_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_stmt_send_long_data_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_stmt_send_long_data_command * command; + DBG_ENTER("mysqlnd_com_stmt_send_long_data_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_send_long_data_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.payload = va_arg(args, MYSQLND_CSTRING); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_stmt_send_long_data_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/************************** COM_STMT_CLOSE ******************************************/ +struct st_mysqlnd_protocol_com_stmt_close_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_stmt_close_context + { + MYSQLND_CONN_DATA * conn; + zend_ulong stmt_id; + } context; +}; + + +/* {{{ mysqlnd_com_stmt_close_run */ +static enum_func_status +mysqlnd_com_stmt_close_run(void *cmd) +{ + zend_uchar cmd_buf[MYSQLND_STMT_ID_LENGTH /* statement id */]; + struct st_mysqlnd_protocol_com_stmt_close_command * command = (struct st_mysqlnd_protocol_com_stmt_close_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + + DBG_ENTER("mysqlnd_com_stmt_close_run"); + + int4store(cmd_buf, command->context.stmt_id); + ret = conn->m->send_command_do_request(conn, COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, TRUE); + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_stmt_close_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_stmt_close_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_stmt_close_command * command; + DBG_ENTER("mysqlnd_com_stmt_close_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_close_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.stmt_id = va_arg(args, size_t); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_stmt_close_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + +/* {{{ mysqlnd_get_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_get_command(enum php_mysqlnd_server_command command, ...) +{ + struct st_mysqlnd_protocol_command * ret; + va_list args; + DBG_ENTER("mysqlnd_get_command"); + + va_start(args, command); + switch (command) { + case COM_SET_OPTION: + ret = mysqlnd_com_set_option_create_command(args); + break; + case COM_DEBUG: + ret = mysqlnd_com_debug_create_command(args); + break; + case COM_INIT_DB: + ret = mysqlnd_com_init_db_create_command(args); + break; + case COM_PING: + ret = mysqlnd_com_ping_create_command(args); + break; + case COM_FIELD_LIST: + ret = mysqlnd_com_field_list_create_command(args); + break; + case COM_STATISTICS: + ret = mysqlnd_com_statistics_create_command(args); + break; + case COM_PROCESS_KILL: + ret = mysqlnd_com_process_kill_create_command(args); + break; + case COM_REFRESH: + ret = mysqlnd_com_refresh_create_command(args); + break; + case COM_SHUTDOWN: + ret = mysqlnd_com_shutdown_create_command(args); + break; + case COM_QUIT: + ret = mysqlnd_com_quit_create_command(args); + break; + case COM_QUERY: + ret = mysqlnd_com_query_create_command(args); + break; + case COM_REAP_RESULT: + ret = mysqlnd_com_reap_result_create_command(args); + break; + case COM_CHANGE_USER: + ret = mysqlnd_com_change_user_create_command(args); + break; + case COM_STMT_PREPARE: + ret = mysqlnd_com_stmt_prepare_create_command(args); + break; + case COM_STMT_EXECUTE: + ret = mysqlnd_com_stmt_execute_create_command(args); + break; + case COM_STMT_FETCH: + ret = mysqlnd_com_stmt_fetch_create_command(args); + break; + case COM_STMT_RESET: + ret = mysqlnd_com_stmt_reset_create_command(args); + break; + case COM_STMT_SEND_LONG_DATA: + ret = mysqlnd_com_stmt_send_long_data_create_command(args); + break; + case COM_STMT_CLOSE: + ret = mysqlnd_com_stmt_close_create_command(args); + break; + default: + break; + } + va_end(args); + DBG_RETURN(ret); +} +/* }}} */ + +func_mysqlnd__command_factory mysqlnd_command_factory = mysqlnd_get_command; + /* * Local variables: * tab-width: 4 -- cgit v1.2.1 From 092afe7212c65f4eb26f4f180280746f90352851 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Thu, 29 Oct 2015 14:12:02 +0100 Subject: MNDR: - abstract SSL enabling into COM_ENABLE_SSL --- ext/mysqlnd/mysqlnd_wireprotocol.c | 140 +++++++++++++++++++++++++++++++++++-- 1 file changed, 135 insertions(+), 5 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index d686677a58..25ed39fd4f 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -656,7 +656,7 @@ size_t php_mysqlnd_auth_write(void * _packet) } if (packet->is_change_user_packet) { enum_func_status ret = FAIL; - const MYSQLND_CSTRING payload = {buffer + MYSQLND_HEADER_SIZE, p - (buffer + MYSQLND_HEADER_SIZE)}; + const MYSQLND_CSTRING payload = {(char*) buffer + MYSQLND_HEADER_SIZE, p - (buffer + MYSQLND_HEADER_SIZE)}; const unsigned int silent = packet->silent; struct st_mysqlnd_protocol_command * command = conn->command_factory(COM_CHANGE_USER, conn, payload, silent); if (command) { @@ -2888,8 +2888,7 @@ mysqlnd_com_field_list_run(void *cmd) enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; /* db + \0 + wild + \0 (for wild) */ - zend_uchar buff[MYSQLND_MAX_ALLOWED_DB_LEN * 2 + 1 + 1], *p; - size_t table_len, wild_len; + zend_uchar buff[MYSQLND_MAX_ALLOWED_DB_LEN * 2 + 1 + 1], *p = buff; DBG_ENTER("mysqlnd_com_field_list_run"); @@ -3150,7 +3149,6 @@ enum_func_status mysqlnd_com_quit_run(void *cmd) { struct st_mysqlnd_protocol_com_quit_command * command = (struct st_mysqlnd_protocol_com_quit_command *) cmd; - zend_uchar bits[1]; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; @@ -3302,7 +3300,7 @@ mysqlnd_com_reap_result_run(void *cmd) struct st_mysqlnd_protocol_com_reap_result_command * command = (struct st_mysqlnd_protocol_com_reap_result_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; - enum_mysqlnd_connection_state state = CONN_GET_STATE(conn); + const enum_mysqlnd_connection_state state = CONN_GET_STATE(conn); DBG_ENTER("mysqlnd_com_reap_result_run"); if (state <= CONN_READY || state == CONN_QUIT_SENT) { @@ -3634,6 +3632,135 @@ mysqlnd_com_stmt_close_create_command(va_list args) /* }}} */ + +/************************** COM_ENABLE_SSL ******************************************/ +struct st_mysqlnd_protocol_com_enable_ssl_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_enable_ssl_context + { + MYSQLND_CONN_DATA * conn; + size_t client_capabilities; + size_t server_capabilities; + unsigned int charset_no; + } context; +}; + + +/* {{{ mysqlnd_com_enable_ssl_run */ +static enum_func_status +mysqlnd_com_enable_ssl_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_enable_ssl_command * command = (struct st_mysqlnd_protocol_com_enable_ssl_command *) cmd; + enum_func_status ret = FAIL; + MYSQLND_CONN_DATA * conn = command->context.conn; + MYSQLND_PACKET_AUTH * auth_packet; + size_t client_capabilities = command->context.client_capabilities; + size_t server_capabilities = command->context.server_capabilities; + + DBG_ENTER("mysqlnd_com_enable_ssl_run"); + DBG_INF_FMT("client_capability_flags=%lu", client_capabilities); + DBG_INF_FMT("CLIENT_LONG_PASSWORD= %d", client_capabilities & CLIENT_LONG_PASSWORD? 1:0); + DBG_INF_FMT("CLIENT_FOUND_ROWS= %d", client_capabilities & CLIENT_FOUND_ROWS? 1:0); + DBG_INF_FMT("CLIENT_LONG_FLAG= %d", client_capabilities & CLIENT_LONG_FLAG? 1:0); + DBG_INF_FMT("CLIENT_NO_SCHEMA= %d", client_capabilities & CLIENT_NO_SCHEMA? 1:0); + DBG_INF_FMT("CLIENT_COMPRESS= %d", client_capabilities & CLIENT_COMPRESS? 1:0); + DBG_INF_FMT("CLIENT_ODBC= %d", client_capabilities & CLIENT_ODBC? 1:0); + DBG_INF_FMT("CLIENT_LOCAL_FILES= %d", client_capabilities & CLIENT_LOCAL_FILES? 1:0); + DBG_INF_FMT("CLIENT_IGNORE_SPACE= %d", client_capabilities & CLIENT_IGNORE_SPACE? 1:0); + DBG_INF_FMT("CLIENT_PROTOCOL_41= %d", client_capabilities & CLIENT_PROTOCOL_41? 1:0); + DBG_INF_FMT("CLIENT_INTERACTIVE= %d", client_capabilities & CLIENT_INTERACTIVE? 1:0); + DBG_INF_FMT("CLIENT_SSL= %d", client_capabilities & CLIENT_SSL? 1:0); + DBG_INF_FMT("CLIENT_IGNORE_SIGPIPE= %d", client_capabilities & CLIENT_IGNORE_SIGPIPE? 1:0); + DBG_INF_FMT("CLIENT_TRANSACTIONS= %d", client_capabilities & CLIENT_TRANSACTIONS? 1:0); + DBG_INF_FMT("CLIENT_RESERVED= %d", client_capabilities & CLIENT_RESERVED? 1:0); + DBG_INF_FMT("CLIENT_SECURE_CONNECTION=%d", client_capabilities & CLIENT_SECURE_CONNECTION? 1:0); + DBG_INF_FMT("CLIENT_MULTI_STATEMENTS=%d", client_capabilities & CLIENT_MULTI_STATEMENTS? 1:0); + DBG_INF_FMT("CLIENT_MULTI_RESULTS= %d", client_capabilities & CLIENT_MULTI_RESULTS? 1:0); + DBG_INF_FMT("CLIENT_PS_MULTI_RESULTS=%d", client_capabilities & CLIENT_PS_MULTI_RESULTS? 1:0); + DBG_INF_FMT("CLIENT_CONNECT_ATTRS= %d", client_capabilities & CLIENT_PLUGIN_AUTH? 1:0); + DBG_INF_FMT("CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA= %d", client_capabilities & CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA? 1:0); + DBG_INF_FMT("CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS= %d", client_capabilities & CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS? 1:0); + DBG_INF_FMT("CLIENT_SESSION_TRACK= %d", client_capabilities & CLIENT_SESSION_TRACK? 1:0); + DBG_INF_FMT("CLIENT_SSL_VERIFY_SERVER_CERT= %d", client_capabilities & CLIENT_SSL_VERIFY_SERVER_CERT? 1:0); + DBG_INF_FMT("CLIENT_REMEMBER_OPTIONS= %d", client_capabilities & CLIENT_REMEMBER_OPTIONS? 1:0); + + auth_packet = conn->payload_decoder_factory->m.get_auth_packet(conn->payload_decoder_factory, FALSE); + if (!auth_packet) { + SET_OOM_ERROR(*conn->error_info); + goto end; + } + auth_packet->client_flags = client_capabilities; + auth_packet->max_packet_size = MYSQLND_ASSEMBLED_PACKET_MAX_SIZE; + + auth_packet->charset_no = command->context.charset_no; + +#ifdef MYSQLND_SSL_SUPPORTED + if (client_capabilities & CLIENT_SSL) { + const zend_bool server_has_ssl = (server_capabilities & CLIENT_SSL)? TRUE:FALSE; + if (server_has_ssl == FALSE) { + goto close_conn; + } else { + enum mysqlnd_ssl_peer verify = client_capabilities & CLIENT_SSL_VERIFY_SERVER_CERT? + MYSQLND_SSL_PEER_VERIFY: + (client_capabilities & CLIENT_SSL_DONT_VERIFY_SERVER_CERT? + MYSQLND_SSL_PEER_DONT_VERIFY: + MYSQLND_SSL_PEER_DEFAULT); + DBG_INF("Switching to SSL"); + if (!PACKET_WRITE(auth_packet, conn)) { + goto close_conn; + } + + conn->net->data->m.set_client_option(conn->net, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, (const char *) &verify); + + if (FAIL == conn->net->data->m.enable_ssl(conn->net)) { + goto end; + } + } + } +#else + auth_packet->client_flags &= ~CLIENT_SSL; + if (!PACKET_WRITE(auth_packet, conn)) { + goto close_conn; + } +#endif + ret = PASS; +end: + PACKET_FREE(auth_packet); + DBG_RETURN(ret); + +close_conn: + CONN_SET_STATE(conn, CONN_QUIT_SENT); + conn->m->send_close(conn); + SET_CLIENT_ERROR(*conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + PACKET_FREE(auth_packet); + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_com_enable_ssl_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_enable_ssl_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_enable_ssl_command * command; + DBG_ENTER("mysqlnd_com_enable_ssl_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_enable_ssl_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.client_capabilities = va_arg(args, size_t); + command->context.server_capabilities = va_arg(args, size_t); + command->context.charset_no = va_arg(args, unsigned int); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_enable_ssl_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + /* {{{ mysqlnd_get_command */ static struct st_mysqlnd_protocol_command * mysqlnd_get_command(enum php_mysqlnd_server_command command, ...) @@ -3701,6 +3828,9 @@ mysqlnd_get_command(enum php_mysqlnd_server_command command, ...) case COM_STMT_CLOSE: ret = mysqlnd_com_stmt_close_create_command(args); break; + case COM_ENABLE_SSL: + ret = mysqlnd_com_enable_ssl_create_command(args); + break; default: break; } -- cgit v1.2.1 From 5609eabc6f1ee7592fcc0185cb61eaf34a67024d Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Thu, 29 Oct 2015 17:52:10 +0100 Subject: MDNR: - make MYSQLND_UPSERT_STATUS more like an object that a simple structure Still use macros to make updates simple --- ext/mysqlnd/mysqlnd_wireprotocol.c | 102 ++++++++++++++++++++++++++++++------- 1 file changed, 84 insertions(+), 18 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 25ed39fd4f..da4bde11ce 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -2660,6 +2660,72 @@ mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_F +/* {{{ mysqlnd_conn_data::send_command_do_request */ +static enum_func_status +send_command_do_request( + MYSQLND_CONN_DATA * const conn, + const enum php_mysqlnd_server_command command, + const zend_uchar * const arg, const size_t arg_len, + const zend_bool silent, + const zend_bool ignore_upsert_status) +{ + enum_func_status ret = PASS; + MYSQLND_PACKET_COMMAND * cmd_packet = NULL; + enum mysqlnd_connection_state conn_state = CONN_GET_STATE(conn); + MYSQLND_ERROR_INFO * error_info = conn->error_info; + DBG_ENTER("mysqlnd_conn_data::send_command_do_request"); + DBG_INF_FMT("command=%s silent=%u", mysqlnd_command_to_text[command], silent); + DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status); + DBG_INF_FMT("sending %u bytes", arg_len + 1); /* + 1 is for the command */ + + switch (conn_state) { + case CONN_READY: + break; + case CONN_QUIT_SENT: + SET_CLIENT_ERROR(*error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + DBG_ERR("Server is gone"); + DBG_RETURN(FAIL); + default: + SET_CLIENT_ERROR(*error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); + DBG_ERR_FMT("Command out of sync. State=%u", conn_state); + DBG_RETURN(FAIL); + } + + UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); + SET_EMPTY_ERROR(*conn->error_info); + + cmd_packet = conn->payload_decoder_factory->m.get_command_packet(conn->payload_decoder_factory, FALSE); + if (!cmd_packet) { + SET_OOM_ERROR(*conn->error_info); + DBG_RETURN(FAIL); + } + + cmd_packet->command = command; + if (arg && arg_len) { + cmd_packet->argument = arg; + cmd_packet->arg_len = arg_len; + } + + MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_COM_QUIT + command - 1 /* because of COM_SLEEP */ ); + + if (! PACKET_WRITE(cmd_packet, conn)) { + if (!silent) { + DBG_ERR_FMT("Error while sending %s packet", mysqlnd_command_to_text[command]); + php_error(E_WARNING, "Error while sending %s packet. PID=%d", mysqlnd_command_to_text[command], getpid()); + } + CONN_SET_STATE(conn, CONN_QUIT_SENT); + conn->m->send_close(conn); + DBG_ERR("Server is gone"); + ret = FAIL; + } + PACKET_FREE(cmd_packet); + DBG_RETURN(ret); +} +/* }}} */ + + + + struct st_mysqlnd_protocol_no_params_command { @@ -2706,7 +2772,7 @@ mysqlnd_com_set_option_run(void *cmd) DBG_ENTER("mysqlnd_com_set_option_run"); int2store(buffer, (unsigned int) option); - ret = conn->m->send_command_do_request(conn, COM_SET_OPTION, buffer, sizeof(buffer), FALSE, TRUE); + ret = send_command_do_request(conn, COM_SET_OPTION, buffer, sizeof(buffer), FALSE, TRUE); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, FALSE, COM_SET_OPTION, TRUE); } @@ -2747,7 +2813,7 @@ mysqlnd_com_debug_run(void *cmd) DBG_ENTER("mysqlnd_com_debug_run"); - ret = conn->m->send_command_do_request(conn, COM_DEBUG, NULL, 0, FALSE, TRUE); + ret = send_command_do_request(conn, COM_DEBUG, NULL, 0, FALSE, TRUE); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, COM_DEBUG, COM_DEBUG, TRUE); } @@ -2798,7 +2864,7 @@ mysqlnd_com_init_db_run(void *cmd) DBG_ENTER("mysqlnd_com_init_db_run"); - ret = conn->m->send_command_do_request(conn, COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, TRUE); + ret = send_command_do_request(conn, COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, TRUE); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_INIT_DB, TRUE); } @@ -2839,7 +2905,7 @@ mysqlnd_com_ping_run(void *cmd) DBG_ENTER("mysqlnd_com_ping_run"); - ret = conn->m->send_command_do_request(conn, COM_PING, NULL, 0, TRUE, TRUE); + ret = send_command_do_request(conn, COM_PING, NULL, 0, TRUE, TRUE); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, TRUE, COM_PING, TRUE); } @@ -2906,7 +2972,7 @@ mysqlnd_com_field_list_run(void *cmd) *p++ = '\0'; } - ret = conn->m->send_command_do_request(conn, COM_FIELD_LIST, buff, p - buff, FALSE, TRUE); + ret = send_command_do_request(conn, COM_FIELD_LIST, buff, p - buff, FALSE, TRUE); DBG_RETURN(ret); } @@ -2945,7 +3011,7 @@ mysqlnd_com_statistics_run(void *cmd) DBG_ENTER("mysqlnd_com_statistics_run"); - ret = conn->m->send_command_do_request(conn, COM_STATISTICS, NULL, 0, FALSE, TRUE); + ret = send_command_do_request(conn, COM_STATISTICS, NULL, 0, FALSE, TRUE); DBG_RETURN(ret); } @@ -2995,7 +3061,7 @@ mysqlnd_com_process_kill_run(void *cmd) DBG_ENTER("mysqlnd_com_process_kill_run"); int4store(buff, command->context.process_id); - ret = conn->m->send_command_do_request(conn, COM_PROCESS_KILL, buff, 4, FALSE, TRUE); + ret = send_command_do_request(conn, COM_PROCESS_KILL, buff, 4, FALSE, TRUE); if (PASS == ret && command->context.read_response) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE); } @@ -3049,7 +3115,7 @@ mysqlnd_com_refresh_run(void *cmd) DBG_ENTER("mysqlnd_com_refresh_run"); int1store(bits, command->context.options); - ret = conn->m->send_command_do_request(conn, COM_REFRESH, bits, 1, FALSE, TRUE); + ret = send_command_do_request(conn, COM_REFRESH, bits, 1, FALSE, TRUE); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_REFRESH, TRUE); } @@ -3103,7 +3169,7 @@ mysqlnd_com_shutdown_run(void *cmd) DBG_ENTER("mysqlnd_com_shutdown_run"); int1store(bits, command->context.level); - ret = conn->m->send_command_do_request(conn, COM_SHUTDOWN, bits, 1, FALSE, TRUE); + ret = send_command_do_request(conn, COM_SHUTDOWN, bits, 1, FALSE, TRUE); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_SHUTDOWN, TRUE); } @@ -3154,7 +3220,7 @@ mysqlnd_com_quit_run(void *cmd) DBG_ENTER("mysqlnd_com_quit_run"); - ret = conn->m->send_command_do_request(conn, COM_QUIT, NULL, 0, TRUE, TRUE); + ret = send_command_do_request(conn, COM_QUIT, NULL, 0, TRUE, TRUE); DBG_RETURN(ret); } @@ -3201,7 +3267,7 @@ mysqlnd_com_query_run(void *cmd) DBG_ENTER("mysqlnd_com_query_run"); - ret = conn->m->send_command_do_request(conn, COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, FALSE); + ret = send_command_do_request(conn, COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, FALSE); if (PASS == ret) { CONN_SET_STATE(conn, CONN_QUERY_SENT); @@ -3254,7 +3320,7 @@ mysqlnd_com_change_user_run(void *cmd) DBG_ENTER("mysqlnd_com_change_user_run"); - ret = conn->m->send_command_do_request(conn, COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, TRUE); + ret = send_command_do_request(conn, COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, TRUE); DBG_RETURN(ret); } @@ -3356,7 +3422,7 @@ mysqlnd_com_stmt_prepare_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_prepare_run"); - ret = conn->m->send_command_do_request(conn, COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, TRUE); + ret = send_command_do_request(conn, COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, TRUE); DBG_RETURN(ret); } @@ -3405,7 +3471,7 @@ mysqlnd_com_stmt_execute_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_execute_run"); - ret = conn->m->send_command_do_request(conn, COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, FALSE); + ret = send_command_do_request(conn, COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, FALSE); DBG_RETURN(ret); } @@ -3454,7 +3520,7 @@ mysqlnd_com_stmt_fetch_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_fetch_run"); - ret = conn->m->send_command_do_request(conn, COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE); + ret = send_command_do_request(conn, COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE); DBG_RETURN(ret); } @@ -3505,7 +3571,7 @@ mysqlnd_com_stmt_reset_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_reset_run"); int4store(cmd_buf, command->context.stmt_id); - ret = conn->m->send_command_do_request(conn, COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, TRUE); + ret = send_command_do_request(conn, COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, TRUE); DBG_RETURN(ret); } @@ -3554,7 +3620,7 @@ mysqlnd_com_stmt_send_long_data_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_send_long_data_run"); - ret = conn->m->send_command_do_request(conn, COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE); + ret = send_command_do_request(conn, COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE); DBG_RETURN(ret); } @@ -3605,7 +3671,7 @@ mysqlnd_com_stmt_close_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_close_run"); int4store(cmd_buf, command->context.stmt_id); - ret = conn->m->send_command_do_request(conn, COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, TRUE); + ret = send_command_do_request(conn, COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, TRUE); DBG_RETURN(ret); } -- cgit v1.2.1 From 4bb784cd0d80c330364cdfebc824a434cc27f05a Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Fri, 30 Oct 2015 11:35:58 +0100 Subject: MNDR: - make MYSQLND_ERROR_INFO a class --- ext/mysqlnd/mysqlnd_wireprotocol.c | 109 ++++++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 43 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index da4bde11ce..eb4b4fa459 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -296,7 +296,7 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, MYSQL DBG_INF_FMT("buf=%p size=%u", buf, buf_size); if (FAIL == mysqlnd_read_header(conn->net, packet_header, conn->stats, conn->error_info)) { CONN_SET_STATE(conn, CONN_QUIT_SENT); - SET_CLIENT_ERROR(*conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); DBG_ERR_FMT("Can't read %s's header", packet_type_as_text); DBG_RETURN(FAIL); @@ -308,7 +308,7 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, MYSQL } if (FAIL == conn->net->data->m.receive_ex(conn->net, buf, packet_header->size, conn->stats, conn->error_info)) { CONN_SET_STATE(conn, CONN_QUIT_SENT); - SET_CLIENT_ERROR(*conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); DBG_ERR_FMT("Empty '%s' packet body", packet_type_as_text); DBG_RETURN(FAIL); @@ -528,7 +528,7 @@ size_t php_mysqlnd_auth_write(void * _packet) if (packet->auth_data_len > 0xFF) { const char * const msg = "Authentication data too long. " "Won't fit into the buffer and will be truncated. Authentication will thus fail"; - SET_CLIENT_ERROR(*conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, msg); + SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, msg); php_error_docref(NULL, E_WARNING, "%s", msg); DBG_RETURN(0); } @@ -1167,7 +1167,7 @@ php_mysqlnd_rset_header_read(void * _packet) packet->info_or_local_file[len] = '\0'; packet->info_or_local_file_len = len; } else { - SET_OOM_ERROR(*conn->error_info); + SET_OOM_ERROR(conn->error_info); ret = FAIL; } break; @@ -1194,7 +1194,7 @@ php_mysqlnd_rset_header_read(void * _packet) packet->info_or_local_file[len] = '\0'; packet->info_or_local_file_len = len; } else { - SET_OOM_ERROR(*conn->error_info); + SET_OOM_ERROR(conn->error_info); ret = FAIL; } } @@ -1376,7 +1376,7 @@ php_mysqlnd_rset_field_read(void * _packet) DBG_INF_FMT("Def found, length %lu, persistent=%u", len, packet->persistent_alloc); meta->def = mnd_pemalloc(len + 1, packet->persistent_alloc); if (!meta->def) { - SET_OOM_ERROR(*conn->error_info); + SET_OOM_ERROR(conn->error_info); DBG_RETURN(FAIL); } memcpy(meta->def, p, len); @@ -1387,7 +1387,7 @@ php_mysqlnd_rset_field_read(void * _packet) root_ptr = meta->root = mnd_pemalloc(total_len, packet->persistent_alloc); if (!root_ptr) { - SET_OOM_ERROR(*conn->error_info); + SET_OOM_ERROR(conn->error_info); DBG_RETURN(FAIL); } @@ -1520,7 +1520,7 @@ php_mysqlnd_read_row_ex(MYSQLND_CONN_DATA * conn, MYSQLND_MEMORY_POOL * result_s We have to realloc the buffer. */ if (FAIL == (*buffer)->resize_chunk((*buffer), *data_size)) { - SET_OOM_ERROR(*conn->error_info); + SET_OOM_ERROR(conn->error_info); ret = FAIL; break; } @@ -2667,36 +2667,41 @@ send_command_do_request( const enum php_mysqlnd_server_command command, const zend_uchar * const arg, const size_t arg_len, const zend_bool silent, - const zend_bool ignore_upsert_status) + const zend_bool ignore_upsert_status, + + enum mysqlnd_connection_state conn_state, + MYSQLND_ERROR_INFO * error_info, + MYSQLND_UPSERT_STATUS * upsert_status, + MYSQLND_STATS * stats, + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory + ) { enum_func_status ret = PASS; MYSQLND_PACKET_COMMAND * cmd_packet = NULL; - enum mysqlnd_connection_state conn_state = CONN_GET_STATE(conn); - MYSQLND_ERROR_INFO * error_info = conn->error_info; - DBG_ENTER("mysqlnd_conn_data::send_command_do_request"); + DBG_ENTER("send_command_do_request"); DBG_INF_FMT("command=%s silent=%u", mysqlnd_command_to_text[command], silent); - DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status); + DBG_INF_FMT("server_status=%u", upsert_status->server_status); DBG_INF_FMT("sending %u bytes", arg_len + 1); /* + 1 is for the command */ switch (conn_state) { case CONN_READY: break; case CONN_QUIT_SENT: - SET_CLIENT_ERROR(*error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); DBG_ERR("Server is gone"); DBG_RETURN(FAIL); default: - SET_CLIENT_ERROR(*error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); + SET_CLIENT_ERROR(error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); DBG_ERR_FMT("Command out of sync. State=%u", conn_state); DBG_RETURN(FAIL); } - UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); - SET_EMPTY_ERROR(*conn->error_info); + UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(upsert_status); + SET_EMPTY_ERROR(error_info); - cmd_packet = conn->payload_decoder_factory->m.get_command_packet(conn->payload_decoder_factory, FALSE); + cmd_packet = payload_decoder_factory->m.get_command_packet(payload_decoder_factory, FALSE); if (!cmd_packet) { - SET_OOM_ERROR(*conn->error_info); + SET_OOM_ERROR(error_info); DBG_RETURN(FAIL); } @@ -2706,9 +2711,9 @@ send_command_do_request( cmd_packet->arg_len = arg_len; } - MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_COM_QUIT + command - 1 /* because of COM_SLEEP */ ); + MYSQLND_INC_CONN_STATISTIC(stats, STAT_COM_QUIT + command - 1 /* because of COM_SLEEP */ ); - if (! PACKET_WRITE(cmd_packet, conn)) { + if (! PACKET_WRITE(cmd_packet)) { if (!silent) { DBG_ERR_FMT("Error while sending %s packet", mysqlnd_command_to_text[command]); php_error(E_WARNING, "Error while sending %s packet. PID=%d", mysqlnd_command_to_text[command], getpid()); @@ -2772,7 +2777,8 @@ mysqlnd_com_set_option_run(void *cmd) DBG_ENTER("mysqlnd_com_set_option_run"); int2store(buffer, (unsigned int) option); - ret = send_command_do_request(conn, COM_SET_OPTION, buffer, sizeof(buffer), FALSE, TRUE); + ret = send_command_do_request(conn, COM_SET_OPTION, buffer, sizeof(buffer), FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, FALSE, COM_SET_OPTION, TRUE); } @@ -2813,7 +2819,8 @@ mysqlnd_com_debug_run(void *cmd) DBG_ENTER("mysqlnd_com_debug_run"); - ret = send_command_do_request(conn, COM_DEBUG, NULL, 0, FALSE, TRUE); + ret = send_command_do_request(conn, COM_DEBUG, NULL, 0, FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, COM_DEBUG, COM_DEBUG, TRUE); } @@ -2864,7 +2871,8 @@ mysqlnd_com_init_db_run(void *cmd) DBG_ENTER("mysqlnd_com_init_db_run"); - ret = send_command_do_request(conn, COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, TRUE); + ret = send_command_do_request(conn, COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_INIT_DB, TRUE); } @@ -2905,7 +2913,8 @@ mysqlnd_com_ping_run(void *cmd) DBG_ENTER("mysqlnd_com_ping_run"); - ret = send_command_do_request(conn, COM_PING, NULL, 0, TRUE, TRUE); + ret = send_command_do_request(conn, COM_PING, NULL, 0, TRUE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, TRUE, COM_PING, TRUE); } @@ -2972,7 +2981,8 @@ mysqlnd_com_field_list_run(void *cmd) *p++ = '\0'; } - ret = send_command_do_request(conn, COM_FIELD_LIST, buff, p - buff, FALSE, TRUE); + ret = send_command_do_request(conn, COM_FIELD_LIST, buff, p - buff, FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3011,7 +3021,8 @@ mysqlnd_com_statistics_run(void *cmd) DBG_ENTER("mysqlnd_com_statistics_run"); - ret = send_command_do_request(conn, COM_STATISTICS, NULL, 0, FALSE, TRUE); + ret = send_command_do_request(conn, COM_STATISTICS, NULL, 0, FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3061,7 +3072,8 @@ mysqlnd_com_process_kill_run(void *cmd) DBG_ENTER("mysqlnd_com_process_kill_run"); int4store(buff, command->context.process_id); - ret = send_command_do_request(conn, COM_PROCESS_KILL, buff, 4, FALSE, TRUE); + ret = send_command_do_request(conn, COM_PROCESS_KILL, buff, 4, FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret && command->context.read_response) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE); } @@ -3115,7 +3127,8 @@ mysqlnd_com_refresh_run(void *cmd) DBG_ENTER("mysqlnd_com_refresh_run"); int1store(bits, command->context.options); - ret = send_command_do_request(conn, COM_REFRESH, bits, 1, FALSE, TRUE); + ret = send_command_do_request(conn, COM_REFRESH, bits, 1, FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_REFRESH, TRUE); } @@ -3169,7 +3182,8 @@ mysqlnd_com_shutdown_run(void *cmd) DBG_ENTER("mysqlnd_com_shutdown_run"); int1store(bits, command->context.level); - ret = send_command_do_request(conn, COM_SHUTDOWN, bits, 1, FALSE, TRUE); + ret = send_command_do_request(conn, COM_SHUTDOWN, bits, 1, FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_SHUTDOWN, TRUE); } @@ -3220,7 +3234,8 @@ mysqlnd_com_quit_run(void *cmd) DBG_ENTER("mysqlnd_com_quit_run"); - ret = send_command_do_request(conn, COM_QUIT, NULL, 0, TRUE, TRUE); + ret = send_command_do_request(conn, COM_QUIT, NULL, 0, TRUE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3267,7 +3282,8 @@ mysqlnd_com_query_run(void *cmd) DBG_ENTER("mysqlnd_com_query_run"); - ret = send_command_do_request(conn, COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, FALSE); + ret = send_command_do_request(conn, COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, FALSE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { CONN_SET_STATE(conn, CONN_QUERY_SENT); @@ -3320,7 +3336,8 @@ mysqlnd_com_change_user_run(void *cmd) DBG_ENTER("mysqlnd_com_change_user_run"); - ret = send_command_do_request(conn, COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, TRUE); + ret = send_command_do_request(conn, COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3422,7 +3439,8 @@ mysqlnd_com_stmt_prepare_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_prepare_run"); - ret = send_command_do_request(conn, COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, TRUE); + ret = send_command_do_request(conn, COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3471,7 +3489,8 @@ mysqlnd_com_stmt_execute_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_execute_run"); - ret = send_command_do_request(conn, COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, FALSE); + ret = send_command_do_request(conn, COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, FALSE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3520,7 +3539,8 @@ mysqlnd_com_stmt_fetch_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_fetch_run"); - ret = send_command_do_request(conn, COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE); + ret = send_command_do_request(conn, COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3571,7 +3591,8 @@ mysqlnd_com_stmt_reset_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_reset_run"); int4store(cmd_buf, command->context.stmt_id); - ret = send_command_do_request(conn, COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, TRUE); + ret = send_command_do_request(conn, COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3620,7 +3641,8 @@ mysqlnd_com_stmt_send_long_data_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_send_long_data_run"); - ret = send_command_do_request(conn, COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE); + ret = send_command_do_request(conn, COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3671,7 +3693,8 @@ mysqlnd_com_stmt_close_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_close_run"); int4store(cmd_buf, command->context.stmt_id); - ret = send_command_do_request(conn, COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, TRUE); + ret = send_command_do_request(conn, COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, TRUE, + CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3753,7 +3776,7 @@ mysqlnd_com_enable_ssl_run(void *cmd) auth_packet = conn->payload_decoder_factory->m.get_auth_packet(conn->payload_decoder_factory, FALSE); if (!auth_packet) { - SET_OOM_ERROR(*conn->error_info); + SET_OOM_ERROR(conn->error_info); goto end; } auth_packet->client_flags = client_capabilities; @@ -3773,7 +3796,7 @@ mysqlnd_com_enable_ssl_run(void *cmd) MYSQLND_SSL_PEER_DONT_VERIFY: MYSQLND_SSL_PEER_DEFAULT); DBG_INF("Switching to SSL"); - if (!PACKET_WRITE(auth_packet, conn)) { + if (!PACKET_WRITE(auth_packet)) { goto close_conn; } @@ -3786,7 +3809,7 @@ mysqlnd_com_enable_ssl_run(void *cmd) } #else auth_packet->client_flags &= ~CLIENT_SSL; - if (!PACKET_WRITE(auth_packet, conn)) { + if (!PACKET_WRITE(auth_packet)) { goto close_conn; } #endif @@ -3798,7 +3821,7 @@ end: close_conn: CONN_SET_STATE(conn, CONN_QUIT_SENT); conn->m->send_close(conn); - SET_CLIENT_ERROR(*conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); PACKET_FREE(auth_packet); DBG_RETURN(ret); } -- cgit v1.2.1 From 280c834c49284eb0e5f284e1f24453dbeb0c8a79 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Fri, 30 Oct 2015 14:06:16 +0100 Subject: MNDR: - rename the macro for updating the connection state --- ext/mysqlnd/mysqlnd_wireprotocol.c | 63 +++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 31 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index eb4b4fa459..4cce44742e 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -295,7 +295,7 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, MYSQL DBG_ENTER("mysqlnd_read_packet_header_and_body"); DBG_INF_FMT("buf=%p size=%u", buf, buf_size); if (FAIL == mysqlnd_read_header(conn->net, packet_header, conn->stats, conn->error_info)) { - CONN_SET_STATE(conn, CONN_QUIT_SENT); + SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); DBG_ERR_FMT("Can't read %s's header", packet_type_as_text); @@ -307,7 +307,7 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, MYSQL DBG_RETURN(FAIL); } if (FAIL == conn->net->data->m.receive_ex(conn->net, buf, packet_header->size, conn->stats, conn->error_info)) { - CONN_SET_STATE(conn, CONN_QUIT_SENT); + SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); DBG_ERR_FMT("Empty '%s' packet body", packet_type_as_text); @@ -668,7 +668,7 @@ size_t php_mysqlnd_auth_write(void * _packet) } else { size_t sent = conn->net->data->m.send_ex(conn->net, buffer, p - buffer - MYSQLND_HEADER_SIZE, conn->stats, conn->error_info); if (!sent) { - CONN_SET_STATE(conn, CONN_QUIT_SENT); + SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); } DBG_RETURN(sent); } @@ -837,7 +837,7 @@ php_mysqlnd_change_auth_response_write(void * _packet) mnd_efree(buffer); } if (!sent) { - CONN_SET_STATE(conn, CONN_QUIT_SENT); + SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); } DBG_RETURN(sent); } @@ -1091,7 +1091,7 @@ end: EG(error_reporting) = error_reporting; } if (!sent) { - CONN_SET_STATE(conn, CONN_QUIT_SENT); + SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); } DBG_RETURN(sent); } @@ -2660,7 +2660,7 @@ mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_F -/* {{{ mysqlnd_conn_data::send_command_do_request */ +/* {{{ send_command_do_request */ static enum_func_status send_command_do_request( MYSQLND_CONN_DATA * const conn, @@ -2669,7 +2669,7 @@ send_command_do_request( const zend_bool silent, const zend_bool ignore_upsert_status, - enum mysqlnd_connection_state conn_state, + struct st_mysqlnd_connection_state * connection_state, MYSQLND_ERROR_INFO * error_info, MYSQLND_UPSERT_STATUS * upsert_status, MYSQLND_STATS * stats, @@ -2682,8 +2682,9 @@ send_command_do_request( DBG_INF_FMT("command=%s silent=%u", mysqlnd_command_to_text[command], silent); DBG_INF_FMT("server_status=%u", upsert_status->server_status); DBG_INF_FMT("sending %u bytes", arg_len + 1); /* + 1 is for the command */ + enum mysqlnd_connection_state state = connection_state->m->get(connection_state); - switch (conn_state) { + switch (state) { case CONN_READY: break; case CONN_QUIT_SENT: @@ -2692,7 +2693,7 @@ send_command_do_request( DBG_RETURN(FAIL); default: SET_CLIENT_ERROR(error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); - DBG_ERR_FMT("Command out of sync. State=%u", conn_state); + DBG_ERR_FMT("Command out of sync. State=%u", state); DBG_RETURN(FAIL); } @@ -2718,7 +2719,7 @@ send_command_do_request( DBG_ERR_FMT("Error while sending %s packet", mysqlnd_command_to_text[command]); php_error(E_WARNING, "Error while sending %s packet. PID=%d", mysqlnd_command_to_text[command], getpid()); } - CONN_SET_STATE(conn, CONN_QUIT_SENT); + connection_state->m->set(connection_state, CONN_QUIT_SENT); conn->m->send_close(conn); DBG_ERR("Server is gone"); ret = FAIL; @@ -2778,7 +2779,7 @@ mysqlnd_com_set_option_run(void *cmd) int2store(buffer, (unsigned int) option); ret = send_command_do_request(conn, COM_SET_OPTION, buffer, sizeof(buffer), FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, FALSE, COM_SET_OPTION, TRUE); } @@ -2820,7 +2821,7 @@ mysqlnd_com_debug_run(void *cmd) DBG_ENTER("mysqlnd_com_debug_run"); ret = send_command_do_request(conn, COM_DEBUG, NULL, 0, FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, COM_DEBUG, COM_DEBUG, TRUE); } @@ -2872,7 +2873,7 @@ mysqlnd_com_init_db_run(void *cmd) DBG_ENTER("mysqlnd_com_init_db_run"); ret = send_command_do_request(conn, COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_INIT_DB, TRUE); } @@ -2914,7 +2915,7 @@ mysqlnd_com_ping_run(void *cmd) DBG_ENTER("mysqlnd_com_ping_run"); ret = send_command_do_request(conn, COM_PING, NULL, 0, TRUE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, TRUE, COM_PING, TRUE); } @@ -2982,7 +2983,7 @@ mysqlnd_com_field_list_run(void *cmd) } ret = send_command_do_request(conn, COM_FIELD_LIST, buff, p - buff, FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3022,7 +3023,7 @@ mysqlnd_com_statistics_run(void *cmd) DBG_ENTER("mysqlnd_com_statistics_run"); ret = send_command_do_request(conn, COM_STATISTICS, NULL, 0, FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3073,7 +3074,7 @@ mysqlnd_com_process_kill_run(void *cmd) int4store(buff, command->context.process_id); ret = send_command_do_request(conn, COM_PROCESS_KILL, buff, 4, FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret && command->context.read_response) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE); } @@ -3128,7 +3129,7 @@ mysqlnd_com_refresh_run(void *cmd) int1store(bits, command->context.options); ret = send_command_do_request(conn, COM_REFRESH, bits, 1, FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_REFRESH, TRUE); } @@ -3183,7 +3184,7 @@ mysqlnd_com_shutdown_run(void *cmd) int1store(bits, command->context.level); ret = send_command_do_request(conn, COM_SHUTDOWN, bits, 1, FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_SHUTDOWN, TRUE); } @@ -3235,7 +3236,7 @@ mysqlnd_com_quit_run(void *cmd) DBG_ENTER("mysqlnd_com_quit_run"); ret = send_command_do_request(conn, COM_QUIT, NULL, 0, TRUE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3283,10 +3284,10 @@ mysqlnd_com_query_run(void *cmd) DBG_ENTER("mysqlnd_com_query_run"); ret = send_command_do_request(conn, COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, FALSE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); if (PASS == ret) { - CONN_SET_STATE(conn, CONN_QUERY_SENT); + SET_CONNECTION_STATE(&conn->state, CONN_QUERY_SENT); } DBG_RETURN(ret); @@ -3337,7 +3338,7 @@ mysqlnd_com_change_user_run(void *cmd) DBG_ENTER("mysqlnd_com_change_user_run"); ret = send_command_do_request(conn, COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3383,7 +3384,7 @@ mysqlnd_com_reap_result_run(void *cmd) struct st_mysqlnd_protocol_com_reap_result_command * command = (struct st_mysqlnd_protocol_com_reap_result_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; - const enum_mysqlnd_connection_state state = CONN_GET_STATE(conn); + const enum_mysqlnd_connection_state state = GET_CONNECTION_STATE(&conn->state); DBG_ENTER("mysqlnd_com_reap_result_run"); if (state <= CONN_READY || state == CONN_QUIT_SENT) { @@ -3440,7 +3441,7 @@ mysqlnd_com_stmt_prepare_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_prepare_run"); ret = send_command_do_request(conn, COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3490,7 +3491,7 @@ mysqlnd_com_stmt_execute_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_execute_run"); ret = send_command_do_request(conn, COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, FALSE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3540,7 +3541,7 @@ mysqlnd_com_stmt_fetch_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_fetch_run"); ret = send_command_do_request(conn, COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3592,7 +3593,7 @@ mysqlnd_com_stmt_reset_run(void *cmd) int4store(cmd_buf, command->context.stmt_id); ret = send_command_do_request(conn, COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3642,7 +3643,7 @@ mysqlnd_com_stmt_send_long_data_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_send_long_data_run"); ret = send_command_do_request(conn, COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3694,7 +3695,7 @@ mysqlnd_com_stmt_close_run(void *cmd) int4store(cmd_buf, command->context.stmt_id); ret = send_command_do_request(conn, COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, TRUE, - CONN_GET_STATE(conn), conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); DBG_RETURN(ret); } @@ -3819,7 +3820,7 @@ end: DBG_RETURN(ret); close_conn: - CONN_SET_STATE(conn, CONN_QUIT_SENT); + SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); conn->m->send_close(conn); SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); PACKET_FREE(auth_packet); -- cgit v1.2.1 From f7a445856dc6abcf7bca13377ea94ab474681874 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Fri, 30 Oct 2015 14:31:12 +0100 Subject: MNDR: - pass connection closer and its context - remove unused parameter --- ext/mysqlnd/mysqlnd_wireprotocol.c | 190 +++++++++++++++++++++++++++++-------- 1 file changed, 149 insertions(+), 41 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 4cce44742e..cf46e8c84b 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -2663,18 +2663,18 @@ mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_F /* {{{ send_command_do_request */ static enum_func_status send_command_do_request( - MYSQLND_CONN_DATA * const conn, const enum php_mysqlnd_server_command command, const zend_uchar * const arg, const size_t arg_len, const zend_bool silent, - const zend_bool ignore_upsert_status, struct st_mysqlnd_connection_state * connection_state, MYSQLND_ERROR_INFO * error_info, MYSQLND_UPSERT_STATUS * upsert_status, MYSQLND_STATS * stats, - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory - ) + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory, + func_mysqlnd_conn_data__send_close send_close, + void * send_close_ctx +) { enum_func_status ret = PASS; MYSQLND_PACKET_COMMAND * cmd_packet = NULL; @@ -2720,7 +2720,7 @@ send_command_do_request( php_error(E_WARNING, "Error while sending %s packet. PID=%d", mysqlnd_command_to_text[command], getpid()); } connection_state->m->set(connection_state, CONN_QUIT_SENT); - conn->m->send_close(conn); + send_close(send_close_ctx); DBG_ERR("Server is gone"); ret = FAIL; } @@ -2778,8 +2778,14 @@ mysqlnd_com_set_option_run(void *cmd) DBG_ENTER("mysqlnd_com_set_option_run"); int2store(buffer, (unsigned int) option); - ret = send_command_do_request(conn, COM_SET_OPTION, buffer, sizeof(buffer), FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_SET_OPTION, buffer, sizeof(buffer), FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, FALSE, COM_SET_OPTION, TRUE); } @@ -2820,8 +2826,14 @@ mysqlnd_com_debug_run(void *cmd) DBG_ENTER("mysqlnd_com_debug_run"); - ret = send_command_do_request(conn, COM_DEBUG, NULL, 0, FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_DEBUG, NULL, 0, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, COM_DEBUG, COM_DEBUG, TRUE); } @@ -2872,8 +2884,14 @@ mysqlnd_com_init_db_run(void *cmd) DBG_ENTER("mysqlnd_com_init_db_run"); - ret = send_command_do_request(conn, COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_INIT_DB, TRUE); } @@ -2914,8 +2932,14 @@ mysqlnd_com_ping_run(void *cmd) DBG_ENTER("mysqlnd_com_ping_run"); - ret = send_command_do_request(conn, COM_PING, NULL, 0, TRUE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_PING, NULL, 0, TRUE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, TRUE, COM_PING, TRUE); } @@ -2982,8 +3006,14 @@ mysqlnd_com_field_list_run(void *cmd) *p++ = '\0'; } - ret = send_command_do_request(conn, COM_FIELD_LIST, buff, p - buff, FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_FIELD_LIST, buff, p - buff, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3022,8 +3052,14 @@ mysqlnd_com_statistics_run(void *cmd) DBG_ENTER("mysqlnd_com_statistics_run"); - ret = send_command_do_request(conn, COM_STATISTICS, NULL, 0, FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_STATISTICS, NULL, 0, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3073,8 +3109,14 @@ mysqlnd_com_process_kill_run(void *cmd) DBG_ENTER("mysqlnd_com_process_kill_run"); int4store(buff, command->context.process_id); - ret = send_command_do_request(conn, COM_PROCESS_KILL, buff, 4, FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_PROCESS_KILL, buff, 4, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret && command->context.read_response) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE); } @@ -3128,8 +3170,14 @@ mysqlnd_com_refresh_run(void *cmd) DBG_ENTER("mysqlnd_com_refresh_run"); int1store(bits, command->context.options); - ret = send_command_do_request(conn, COM_REFRESH, bits, 1, FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_REFRESH, bits, 1, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_REFRESH, TRUE); } @@ -3183,8 +3231,14 @@ mysqlnd_com_shutdown_run(void *cmd) DBG_ENTER("mysqlnd_com_shutdown_run"); int1store(bits, command->context.level); - ret = send_command_do_request(conn, COM_SHUTDOWN, bits, 1, FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_SHUTDOWN, bits, 1, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_SHUTDOWN, TRUE); } @@ -3235,8 +3289,14 @@ mysqlnd_com_quit_run(void *cmd) DBG_ENTER("mysqlnd_com_quit_run"); - ret = send_command_do_request(conn, COM_QUIT, NULL, 0, TRUE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_QUIT, NULL, 0, TRUE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3283,8 +3343,14 @@ mysqlnd_com_query_run(void *cmd) DBG_ENTER("mysqlnd_com_query_run"); - ret = send_command_do_request(conn, COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, FALSE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { SET_CONNECTION_STATE(&conn->state, CONN_QUERY_SENT); @@ -3337,8 +3403,14 @@ mysqlnd_com_change_user_run(void *cmd) DBG_ENTER("mysqlnd_com_change_user_run"); - ret = send_command_do_request(conn, COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3440,8 +3512,14 @@ mysqlnd_com_stmt_prepare_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_prepare_run"); - ret = send_command_do_request(conn, COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3490,8 +3568,14 @@ mysqlnd_com_stmt_execute_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_execute_run"); - ret = send_command_do_request(conn, COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, FALSE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3540,8 +3624,14 @@ mysqlnd_com_stmt_fetch_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_fetch_run"); - ret = send_command_do_request(conn, COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3592,8 +3682,14 @@ mysqlnd_com_stmt_reset_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_reset_run"); int4store(cmd_buf, command->context.stmt_id); - ret = send_command_do_request(conn, COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3642,8 +3738,14 @@ mysqlnd_com_stmt_send_long_data_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_send_long_data_run"); - ret = send_command_do_request(conn, COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3694,8 +3796,14 @@ mysqlnd_com_stmt_close_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_close_run"); int4store(cmd_buf, command->context.stmt_id); - ret = send_command_do_request(conn, COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, TRUE, - &conn->state, conn->error_info, conn->upsert_status, conn->stats, conn->payload_decoder_factory); + ret = send_command_do_request(COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } -- cgit v1.2.1 From aa4966d4e37076ed560ba0a10f0758863d8af389 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Fri, 30 Oct 2015 16:05:55 +0100 Subject: MNDR: - now send_command_handle_response() also doesn't depend directly on MYSQLND_CONN_DATA --- ext/mysqlnd/mysqlnd_wireprotocol.c | 477 +++++++++++++++++++++++-------------- 1 file changed, 297 insertions(+), 180 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index cf46e8c84b..21508614ed 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1060,13 +1060,13 @@ size_t php_mysqlnd_cmd_write(void * _packet) net->data->m.consume_uneaten_data(net, packet->command); #endif - if (!packet->argument || !packet->arg_len) { + if (!packet->argument.s || !packet->argument.l) { zend_uchar buffer[MYSQLND_HEADER_SIZE + 1]; int1store(buffer + MYSQLND_HEADER_SIZE, packet->command); sent = net->data->m.send_ex(net, buffer, 1, conn->stats, conn->error_info); } else { - size_t tmp_len = packet->arg_len + 1 + MYSQLND_HEADER_SIZE; + size_t tmp_len = packet->argument.l + 1 + MYSQLND_HEADER_SIZE; zend_uchar *tmp, *p; tmp = (tmp_len > net->cmd_buffer.length)? mnd_emalloc(tmp_len):net->cmd_buffer.buffer; if (!tmp) { @@ -1077,7 +1077,7 @@ size_t php_mysqlnd_cmd_write(void * _packet) int1store(p, packet->command); p++; - memcpy(p, packet->argument, packet->arg_len); + memcpy(p, packet->argument.s, packet->argument.l); sent = net->data->m.send_ex(net, tmp, tmp_len - MYSQLND_HEADER_SIZE, conn->stats, conn->error_info); if (tmp != net->cmd_buffer.buffer) { @@ -1161,11 +1161,11 @@ php_mysqlnd_rset_header_read(void * _packet) would lead to 0 byte allocation but 2^32 or 2^64 bytes copied. */ len = packet->header.size - 1; - packet->info_or_local_file = mnd_emalloc(len + 1); - if (packet->info_or_local_file) { - memcpy(packet->info_or_local_file, p, len); - packet->info_or_local_file[len] = '\0'; - packet->info_or_local_file_len = len; + packet->info_or_local_file.s = mnd_emalloc(len + 1); + if (packet->info_or_local_file.s) { + memcpy(packet->info_or_local_file.s, p, len); + packet->info_or_local_file.s[len] = '\0'; + packet->info_or_local_file.l = len; } else { SET_OOM_ERROR(conn->error_info); ret = FAIL; @@ -1188,11 +1188,11 @@ php_mysqlnd_rset_header_read(void * _packet) BAIL_IF_NO_MORE_DATA; /* Check for additional textual data */ if (packet->header.size > (size_t) (p - buf) && (len = php_mysqlnd_net_field_length(&p))) { - packet->info_or_local_file = mnd_emalloc(len + 1); - if (packet->info_or_local_file) { - memcpy(packet->info_or_local_file, p, len); - packet->info_or_local_file[len] = '\0'; - packet->info_or_local_file_len = len; + packet->info_or_local_file.s = mnd_emalloc(len + 1); + if (packet->info_or_local_file.s) { + memcpy(packet->info_or_local_file.s, p, len); + packet->info_or_local_file.s[len] = '\0'; + packet->info_or_local_file.l = len; } else { SET_OOM_ERROR(conn->error_info); ret = FAIL; @@ -1225,9 +1225,9 @@ void php_mysqlnd_rset_header_free_mem(void * _packet, zend_bool stack_allocation { MYSQLND_PACKET_RSET_HEADER *p= (MYSQLND_PACKET_RSET_HEADER *) _packet; DBG_ENTER("php_mysqlnd_rset_header_free_mem"); - if (p->info_or_local_file) { - mnd_efree(p->info_or_local_file); - p->info_or_local_file = NULL; + if (p->info_or_local_file.s) { + mnd_efree(p->info_or_local_file.s); + p->info_or_local_file.s = NULL; } if (!stack_allocation) { mnd_pefree(p, p->header.persistent); @@ -1961,10 +1961,10 @@ php_mysqlnd_stats_read(void * _packet) DBG_RETURN(FAIL); } - packet->message = mnd_emalloc(packet->header.size + 1); - memcpy(packet->message, buf, packet->header.size); - packet->message[packet->header.size] = '\0'; - packet->message_len = packet->header.size; + packet->message.s = mnd_emalloc(packet->header.size + 1); + memcpy(packet->message.s, buf, packet->header.size); + packet->message.s[packet->header.size] = '\0'; + packet->message.l = packet->header.size; DBG_RETURN(PASS); } @@ -1976,9 +1976,9 @@ static void php_mysqlnd_stats_free_mem(void * _packet, zend_bool stack_allocation) { MYSQLND_PACKET_STATS *p= (MYSQLND_PACKET_STATS *) _packet; - if (p->message) { - mnd_efree(p->message); - p->message = NULL; + if (p->message.s) { + mnd_efree(p->message.s); + p->message.s = NULL; } if (!stack_allocation) { mnd_pefree(p, p->header.persistent); @@ -2660,9 +2660,9 @@ mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_F -/* {{{ send_command_do_request */ +/* {{{ send_command */ static enum_func_status -send_command_do_request( +send_command( const enum php_mysqlnd_server_command command, const zend_uchar * const arg, const size_t arg_len, const zend_bool silent, @@ -2678,7 +2678,7 @@ send_command_do_request( { enum_func_status ret = PASS; MYSQLND_PACKET_COMMAND * cmd_packet = NULL; - DBG_ENTER("send_command_do_request"); + DBG_ENTER("send_command"); DBG_INF_FMT("command=%s silent=%u", mysqlnd_command_to_text[command], silent); DBG_INF_FMT("server_status=%u", upsert_status->server_status); DBG_INF_FMT("sending %u bytes", arg_len + 1); /* + 1 is for the command */ @@ -2708,8 +2708,8 @@ send_command_do_request( cmd_packet->command = command; if (arg && arg_len) { - cmd_packet->argument = arg; - cmd_packet->arg_len = arg_len; + cmd_packet->argument.s = arg; + cmd_packet->argument.l = arg_len; } MYSQLND_INC_CONN_STATISTIC(stats, STAT_COM_QUIT + command - 1 /* because of COM_SLEEP */ ); @@ -2730,6 +2730,113 @@ send_command_do_request( /* }}} */ +/* {{{ send_command_handle_response */ +enum_func_status +send_command_handle_response( + const enum mysqlnd_packet_type ok_packet, + const zend_bool silent, + const enum php_mysqlnd_server_command command, + const zend_bool ignore_upsert_status, + + MYSQLND_ERROR_INFO * error_info, + MYSQLND_UPSERT_STATUS * upsert_status, + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory, + MYSQLND_STRING * last_message, + zend_bool last_message_persistent + ) +{ + enum_func_status ret = FAIL; + + DBG_ENTER("send_command_handle_response"); + DBG_INF_FMT("silent=%u packet=%u command=%s", silent, ok_packet, mysqlnd_command_to_text[command]); + + switch (ok_packet) { + case PROT_OK_PACKET:{ + MYSQLND_PACKET_OK * ok_response = payload_decoder_factory->m.get_ok_packet(payload_decoder_factory, FALSE); + if (!ok_response) { + SET_OOM_ERROR(error_info); + break; + } + if (FAIL == (ret = PACKET_READ(ok_response))) { + if (!silent) { + DBG_ERR_FMT("Error while reading %s's OK packet", mysqlnd_command_to_text[command]); + php_error_docref(NULL, E_WARNING, "Error while reading %s's OK packet. PID=%u", + mysqlnd_command_to_text[command], getpid()); + } + } else { + DBG_INF_FMT("OK from server"); + if (0xFF == ok_response->field_count) { + /* The server signalled error. Set the error */ + SET_CLIENT_ERROR(error_info, ok_response->error_no, ok_response->sqlstate, ok_response->error); + ret = FAIL; + /* + Cover a protocol design error: error packet does not + contain the server status. Therefore, the client has no way + to find out whether there are more result sets of + a multiple-result-set statement pending. Luckily, in 5.0 an + error always aborts execution of a statement, wherever it is + a multi-statement or a stored procedure, so it should be + safe to unconditionally turn off the flag here. + */ + upsert_status->server_status &= ~SERVER_MORE_RESULTS_EXISTS; + UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(upsert_status); + } else { + SET_NEW_MESSAGE(last_message->s, last_message->l, + ok_response->message, ok_response->message_len, + last_message_persistent); + + if (!ignore_upsert_status) { + UPSERT_STATUS_RESET(upsert_status); + upsert_status->warning_count = ok_response->warning_count; + upsert_status->server_status = ok_response->server_status; + upsert_status->affected_rows = ok_response->affected_rows; + upsert_status->last_insert_id = ok_response->last_insert_id; + } + } + } + PACKET_FREE(ok_response); + break; + } + case PROT_EOF_PACKET:{ + MYSQLND_PACKET_EOF * ok_response = payload_decoder_factory->m.get_eof_packet(payload_decoder_factory, FALSE); + if (!ok_response) { + SET_OOM_ERROR(error_info); + break; + } + if (FAIL == (ret = PACKET_READ(ok_response))) { + SET_CLIENT_ERROR(error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, + "Malformed packet"); + if (!silent) { + DBG_ERR_FMT("Error while reading %s's EOF packet", mysqlnd_command_to_text[command]); + php_error_docref(NULL, E_WARNING, "Error while reading %s's EOF packet. PID=%d", + mysqlnd_command_to_text[command], getpid()); + } + } else if (0xFF == ok_response->field_count) { + /* The server signalled error. Set the error */ + SET_CLIENT_ERROR(error_info, ok_response->error_no, ok_response->sqlstate, ok_response->error); + UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(upsert_status); + } else if (0xFE != ok_response->field_count) { + SET_CLIENT_ERROR(error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "Malformed packet"); + if (!silent) { + DBG_ERR_FMT("EOF packet expected, field count wasn't 0xFE but 0x%2X", ok_response->field_count); + php_error_docref(NULL, E_WARNING, "EOF packet expected, field count wasn't 0xFE but 0x%2X", + ok_response->field_count); + } + } else { + DBG_INF_FMT("OK from server"); + } + PACKET_FREE(ok_response); + break; + } + default: + SET_CLIENT_ERROR(error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "Malformed packet"); + php_error_docref(NULL, E_ERROR, "Wrong response packet %u passed to the function", ok_packet); + break; + } + DBG_INF(ret == PASS ? "PASS":"FAIL"); + DBG_RETURN(ret); +} +/* }}} */ @@ -2778,18 +2885,18 @@ mysqlnd_com_set_option_run(void *cmd) DBG_ENTER("mysqlnd_com_set_option_run"); int2store(buffer, (unsigned int) option); - ret = send_command_do_request(COM_SET_OPTION, buffer, sizeof(buffer), FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_SET_OPTION, buffer, sizeof(buffer), FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { - ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, FALSE, COM_SET_OPTION, TRUE); + ret = send_command_handle_response(PROT_EOF_PACKET, FALSE, COM_SET_OPTION, TRUE, + conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } - DBG_RETURN(ret); } /* }}} */ @@ -2826,16 +2933,17 @@ mysqlnd_com_debug_run(void *cmd) DBG_ENTER("mysqlnd_com_debug_run"); - ret = send_command_do_request(COM_DEBUG, NULL, 0, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_DEBUG, NULL, 0, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { - ret = conn->m->send_command_handle_response(conn, PROT_EOF_PACKET, COM_DEBUG, COM_DEBUG, TRUE); + ret = send_command_handle_response(PROT_EOF_PACKET, COM_DEBUG, COM_DEBUG, TRUE, + conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } DBG_RETURN(ret); @@ -2884,16 +2992,17 @@ mysqlnd_com_init_db_run(void *cmd) DBG_ENTER("mysqlnd_com_init_db_run"); - ret = send_command_do_request(COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { - ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_INIT_DB, TRUE); + ret = send_command_handle_response(PROT_OK_PACKET, FALSE, COM_INIT_DB, TRUE, + conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } DBG_RETURN(ret); @@ -2932,16 +3041,17 @@ mysqlnd_com_ping_run(void *cmd) DBG_ENTER("mysqlnd_com_ping_run"); - ret = send_command_do_request(COM_PING, NULL, 0, TRUE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_PING, NULL, 0, TRUE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { - ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, TRUE, COM_PING, TRUE); + ret = send_command_handle_response(PROT_OK_PACKET, TRUE, COM_PING, TRUE, + conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } DBG_RETURN(ret); @@ -3006,14 +3116,14 @@ mysqlnd_com_field_list_run(void *cmd) *p++ = '\0'; } - ret = send_command_do_request(COM_FIELD_LIST, buff, p - buff, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_FIELD_LIST, buff, p - buff, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3052,14 +3162,14 @@ mysqlnd_com_statistics_run(void *cmd) DBG_ENTER("mysqlnd_com_statistics_run"); - ret = send_command_do_request(COM_STATISTICS, NULL, 0, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_STATISTICS, NULL, 0, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3109,16 +3219,17 @@ mysqlnd_com_process_kill_run(void *cmd) DBG_ENTER("mysqlnd_com_process_kill_run"); int4store(buff, command->context.process_id); - ret = send_command_do_request(COM_PROCESS_KILL, buff, 4, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_PROCESS_KILL, buff, 4, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret && command->context.read_response) { - ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE); + ret = send_command_handle_response(PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE, + conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } DBG_RETURN(ret); @@ -3170,16 +3281,17 @@ mysqlnd_com_refresh_run(void *cmd) DBG_ENTER("mysqlnd_com_refresh_run"); int1store(bits, command->context.options); - ret = send_command_do_request(COM_REFRESH, bits, 1, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_REFRESH, bits, 1, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { - ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_REFRESH, TRUE); + ret = send_command_handle_response(PROT_OK_PACKET, FALSE, COM_REFRESH, TRUE, + conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } DBG_RETURN(ret); @@ -3231,16 +3343,17 @@ mysqlnd_com_shutdown_run(void *cmd) DBG_ENTER("mysqlnd_com_shutdown_run"); int1store(bits, command->context.level); - ret = send_command_do_request(COM_SHUTDOWN, bits, 1, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_SHUTDOWN, bits, 1, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { - ret = conn->m->send_command_handle_response(conn, PROT_OK_PACKET, FALSE, COM_SHUTDOWN, TRUE); + ret = send_command_handle_response(PROT_OK_PACKET, FALSE, COM_SHUTDOWN, TRUE, + conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } DBG_RETURN(ret); @@ -3289,14 +3402,14 @@ mysqlnd_com_quit_run(void *cmd) DBG_ENTER("mysqlnd_com_quit_run"); - ret = send_command_do_request(COM_QUIT, NULL, 0, TRUE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_QUIT, NULL, 0, TRUE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3343,14 +3456,14 @@ mysqlnd_com_query_run(void *cmd) DBG_ENTER("mysqlnd_com_query_run"); - ret = send_command_do_request(COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); if (PASS == ret) { SET_CONNECTION_STATE(&conn->state, CONN_QUERY_SENT); @@ -3403,14 +3516,14 @@ mysqlnd_com_change_user_run(void *cmd) DBG_ENTER("mysqlnd_com_change_user_run"); - ret = send_command_do_request(COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3512,14 +3625,14 @@ mysqlnd_com_stmt_prepare_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_prepare_run"); - ret = send_command_do_request(COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3568,14 +3681,14 @@ mysqlnd_com_stmt_execute_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_execute_run"); - ret = send_command_do_request(COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3624,14 +3737,14 @@ mysqlnd_com_stmt_fetch_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_fetch_run"); - ret = send_command_do_request(COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3682,14 +3795,18 @@ mysqlnd_com_stmt_reset_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_reset_run"); int4store(cmd_buf, command->context.stmt_id); - ret = send_command_do_request(COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); + if (PASS == ret) { + ret = send_command_handle_response(PROT_OK_PACKET, FALSE, COM_STMT_RESET, TRUE, + conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); + } DBG_RETURN(ret); } @@ -3738,14 +3855,14 @@ mysqlnd_com_stmt_send_long_data_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_send_long_data_run"); - ret = send_command_do_request(COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } @@ -3796,14 +3913,14 @@ mysqlnd_com_stmt_close_run(void *cmd) DBG_ENTER("mysqlnd_com_stmt_close_run"); int4store(cmd_buf, command->context.stmt_id); - ret = send_command_do_request(COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); + ret = send_command(COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, + &conn->state, + conn->error_info, + conn->upsert_status, + conn->stats, + conn->payload_decoder_factory, + conn->m->send_close, + conn); DBG_RETURN(ret); } -- cgit v1.2.1 From 7e6f9a84cb8693ec24ec44d902c15d99300d3641 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 2 Nov 2015 14:16:18 +0100 Subject: MNDR: - split handle_response() into handle_OK and handle_EOF --- ext/mysqlnd/mysqlnd_wireprotocol.c | 186 ++++++++++++++++++++++--------------- 1 file changed, 109 insertions(+), 77 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 21508614ed..3ab85c4d0e 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -2730,13 +2730,113 @@ send_command( /* }}} */ +/* {{{ send_command_handle_OK */ +static enum_func_status +send_command_handle_OK(MYSQLND_ERROR_INFO * const error_info, + MYSQLND_UPSERT_STATUS * const upsert_status, + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory, + const zend_bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */ + MYSQLND_STRING * const last_message, + const zend_bool last_message_persistent) +{ + enum_func_status ret = FAIL; + MYSQLND_PACKET_OK * ok_response = payload_decoder_factory->m.get_ok_packet(payload_decoder_factory, FALSE); + + DBG_ENTER("send_command_handle_OK"); + if (!ok_response) { + SET_OOM_ERROR(error_info); + DBG_RETURN(FAIL); + } + if (FAIL == (ret = PACKET_READ(ok_response))) { + DBG_INF("Error while reading OK packet"); + SET_CLIENT_ERROR(error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "Malformed packet"); + goto end; + } + DBG_INF_FMT("OK from server"); + if (0xFF == ok_response->field_count) { + /* The server signalled error. Set the error */ + SET_CLIENT_ERROR(error_info, ok_response->error_no, ok_response->sqlstate, ok_response->error); + ret = FAIL; + /* + Cover a protocol design error: error packet does not + contain the server status. Therefore, the client has no way + to find out whether there are more result sets of + a multiple-result-set statement pending. Luckily, in 5.0 an + error always aborts execution of a statement, wherever it is + a multi-statement or a stored procedure, so it should be + safe to unconditionally turn off the flag here. + */ + upsert_status->server_status &= ~SERVER_MORE_RESULTS_EXISTS; + UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(upsert_status); + } else { + SET_NEW_MESSAGE(last_message->s, last_message->l, + ok_response->message, ok_response->message_len, + last_message_persistent); + if (!ignore_upsert_status) { + UPSERT_STATUS_RESET(upsert_status); + upsert_status->warning_count = ok_response->warning_count; + upsert_status->server_status = ok_response->server_status; + upsert_status->affected_rows = ok_response->affected_rows; + upsert_status->last_insert_id = ok_response->last_insert_id; + } else { + /* LOAD DATA */ + } + } +end: + PACKET_FREE(ok_response); + DBG_INF(ret == PASS ? "PASS":"FAIL"); + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ send_command_handle_EOF */ +enum_func_status +send_command_handle_EOF(MYSQLND_ERROR_INFO * const error_info, + MYSQLND_UPSERT_STATUS * const upsert_status, + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory) +{ + enum_func_status ret = FAIL; + MYSQLND_PACKET_EOF * response = payload_decoder_factory->m.get_eof_packet(payload_decoder_factory, FALSE); + + DBG_ENTER("send_command_handle_EOF"); + + if (!response) { + SET_OOM_ERROR(error_info); + DBG_RETURN(FAIL); + } + if (FAIL == (ret = PACKET_READ(response))) { + DBG_INF("Error while reading EOF packet"); + SET_CLIENT_ERROR(error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "Malformed packet"); + } else if (0xFF == response->field_count) { + /* The server signalled error. Set the error */ + DBG_INF_FMT("Error_no=%d SQLstate=%s Error=%s", response->error_no, response->sqlstate, response->error); + + SET_CLIENT_ERROR(error_info, response->error_no, response->sqlstate, response->error); + + UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(upsert_status); + } else if (0xFE != response->field_count) { + SET_CLIENT_ERROR(error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "Malformed packet"); + DBG_ERR_FMT("EOF packet expected, field count wasn't 0xFE but 0x%2X", response->field_count); + php_error_docref(NULL, E_WARNING, "EOF packet expected, field count wasn't 0xFE but 0x%2X", response->field_count); + } else { + DBG_INF_FMT("EOF from server"); + } + PACKET_FREE(response); + + DBG_INF(ret == PASS ? "PASS":"FAIL"); + DBG_RETURN(ret); +} +/* }}} */ + + /* {{{ send_command_handle_response */ enum_func_status send_command_handle_response( const enum mysqlnd_packet_type ok_packet, const zend_bool silent, const enum php_mysqlnd_server_command command, - const zend_bool ignore_upsert_status, + const zend_bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */ MYSQLND_ERROR_INFO * error_info, MYSQLND_UPSERT_STATUS * upsert_status, @@ -2751,88 +2851,20 @@ send_command_handle_response( DBG_INF_FMT("silent=%u packet=%u command=%s", silent, ok_packet, mysqlnd_command_to_text[command]); switch (ok_packet) { - case PROT_OK_PACKET:{ - MYSQLND_PACKET_OK * ok_response = payload_decoder_factory->m.get_ok_packet(payload_decoder_factory, FALSE); - if (!ok_response) { - SET_OOM_ERROR(error_info); - break; - } - if (FAIL == (ret = PACKET_READ(ok_response))) { - if (!silent) { - DBG_ERR_FMT("Error while reading %s's OK packet", mysqlnd_command_to_text[command]); - php_error_docref(NULL, E_WARNING, "Error while reading %s's OK packet. PID=%u", - mysqlnd_command_to_text[command], getpid()); - } - } else { - DBG_INF_FMT("OK from server"); - if (0xFF == ok_response->field_count) { - /* The server signalled error. Set the error */ - SET_CLIENT_ERROR(error_info, ok_response->error_no, ok_response->sqlstate, ok_response->error); - ret = FAIL; - /* - Cover a protocol design error: error packet does not - contain the server status. Therefore, the client has no way - to find out whether there are more result sets of - a multiple-result-set statement pending. Luckily, in 5.0 an - error always aborts execution of a statement, wherever it is - a multi-statement or a stored procedure, so it should be - safe to unconditionally turn off the flag here. - */ - upsert_status->server_status &= ~SERVER_MORE_RESULTS_EXISTS; - UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(upsert_status); - } else { - SET_NEW_MESSAGE(last_message->s, last_message->l, - ok_response->message, ok_response->message_len, - last_message_persistent); - - if (!ignore_upsert_status) { - UPSERT_STATUS_RESET(upsert_status); - upsert_status->warning_count = ok_response->warning_count; - upsert_status->server_status = ok_response->server_status; - upsert_status->affected_rows = ok_response->affected_rows; - upsert_status->last_insert_id = ok_response->last_insert_id; - } - } - } - PACKET_FREE(ok_response); + case PROT_OK_PACKET: + ret = send_command_handle_OK(error_info, upsert_status, payload_decoder_factory, ignore_upsert_status, last_message, last_message_persistent); break; - } - case PROT_EOF_PACKET:{ - MYSQLND_PACKET_EOF * ok_response = payload_decoder_factory->m.get_eof_packet(payload_decoder_factory, FALSE); - if (!ok_response) { - SET_OOM_ERROR(error_info); - break; - } - if (FAIL == (ret = PACKET_READ(ok_response))) { - SET_CLIENT_ERROR(error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, - "Malformed packet"); - if (!silent) { - DBG_ERR_FMT("Error while reading %s's EOF packet", mysqlnd_command_to_text[command]); - php_error_docref(NULL, E_WARNING, "Error while reading %s's EOF packet. PID=%d", - mysqlnd_command_to_text[command], getpid()); - } - } else if (0xFF == ok_response->field_count) { - /* The server signalled error. Set the error */ - SET_CLIENT_ERROR(error_info, ok_response->error_no, ok_response->sqlstate, ok_response->error); - UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(upsert_status); - } else if (0xFE != ok_response->field_count) { - SET_CLIENT_ERROR(error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "Malformed packet"); - if (!silent) { - DBG_ERR_FMT("EOF packet expected, field count wasn't 0xFE but 0x%2X", ok_response->field_count); - php_error_docref(NULL, E_WARNING, "EOF packet expected, field count wasn't 0xFE but 0x%2X", - ok_response->field_count); - } - } else { - DBG_INF_FMT("OK from server"); - } - PACKET_FREE(ok_response); + case PROT_EOF_PACKET: + ret = send_command_handle_EOF(error_info, upsert_status, payload_decoder_factory); break; - } default: SET_CLIENT_ERROR(error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "Malformed packet"); php_error_docref(NULL, E_ERROR, "Wrong response packet %u passed to the function", ok_packet); break; } + if (!silent && error_info->error_no == CR_MALFORMED_PACKET) { + php_error_docref(NULL, E_WARNING, "Error while reading %s's response packet. PID=%d", mysqlnd_command_to_text[command], getpid()); + } DBG_INF(ret == PASS ? "PASS":"FAIL"); DBG_RETURN(ret); } @@ -2942,7 +2974,7 @@ mysqlnd_com_debug_run(void *cmd) conn->m->send_close, conn); if (PASS == ret) { - ret = send_command_handle_response(PROT_EOF_PACKET, COM_DEBUG, COM_DEBUG, TRUE, + ret = send_command_handle_response(PROT_EOF_PACKET, FALSE, COM_DEBUG, TRUE, conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } -- cgit v1.2.1 From 75a1fcc724123eb77171ca66847561be18654023 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 2 Nov 2015 15:58:59 +0100 Subject: MNDR: - move handling of commands to the command itself --- ext/mysqlnd/mysqlnd_wireprotocol.c | 54 ++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 3ab85c4d0e..ad89fc0007 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -3085,6 +3085,11 @@ mysqlnd_com_ping_run(void *cmd) ret = send_command_handle_response(PROT_OK_PACKET, TRUE, COM_PING, TRUE, conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } + /* + The server sends 0 but libmysql doesn't read it and has established + a protocol of giving back -1. Thus we have to follow it :( + */ + UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); DBG_RETURN(ret); } @@ -3184,13 +3189,25 @@ mysqlnd_com_field_list_create_command(va_list args) /************************** COM_STATISTICS ******************************************/ +struct st_mysqlnd_protocol_com_statistics_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_statistics_context + { + MYSQLND_CONN_DATA * conn; + zend_string ** message; + } context; +}; + + /* {{{ mysqlnd_com_statistics_run */ static enum_func_status mysqlnd_com_statistics_run(void *cmd) { - struct st_mysqlnd_protocol_no_params_command * command = (struct st_mysqlnd_protocol_no_params_command *) cmd; + struct st_mysqlnd_protocol_com_statistics_command * command = (struct st_mysqlnd_protocol_com_statistics_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + zend_string **message = command->context.message; DBG_ENTER("mysqlnd_com_statistics_run"); @@ -3203,6 +3220,20 @@ mysqlnd_com_statistics_run(void *cmd) conn->m->send_close, conn); + if (PASS == ret) { + MYSQLND_PACKET_STATS * stats_header = conn->payload_decoder_factory->m.get_stats_packet(conn->payload_decoder_factory, FALSE); + if (!stats_header) { + SET_OOM_ERROR(conn->error_info); + } else { + if (PASS == (ret = PACKET_READ(stats_header))) { + /* will be freed by Zend, thus don't use the mnd_ allocator */ + *message = zend_string_init(stats_header->message.s, stats_header->message.l, 0); + DBG_INF(ZSTR_VAL(*message)); + } + PACKET_FREE(stats_header); + } + } + DBG_RETURN(ret); } /* }}} */ @@ -3212,13 +3243,14 @@ mysqlnd_com_statistics_run(void *cmd) static struct st_mysqlnd_protocol_command * mysqlnd_com_statistics_create_command(va_list args) { - struct st_mysqlnd_protocol_no_params_command * command; + struct st_mysqlnd_protocol_com_statistics_command * command; DBG_ENTER("mysqlnd_com_statistics_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_no_params_command)); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_statistics_command)); if (command) { command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->parent.free_command = mysqlnd_com_no_params_free_command; + command->context.message = va_arg(args, zend_string **); + command->parent.free_command = mysqlnd_com_no_params_free_command; command->parent.run = mysqlnd_com_statistics_run; } @@ -3247,6 +3279,7 @@ mysqlnd_com_process_kill_run(void *cmd) zend_uchar buff[4]; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + zend_bool read_response = command->context.read_response; DBG_ENTER("mysqlnd_com_process_kill_run"); int4store(buff, command->context.process_id); @@ -3259,11 +3292,22 @@ mysqlnd_com_process_kill_run(void *cmd) conn->payload_decoder_factory, conn->m->send_close, conn); - if (PASS == ret && command->context.read_response) { + if (PASS == ret && read_response) { ret = send_command_handle_response(PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE, conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } + if (read_response) { + /* + The server sends 0 but libmysql doesn't read it and has established + a protocol of giving back -1. Thus we have to follow it :( + */ + UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); + } else if (PASS == ret) { + SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); + conn->m->send_close(conn); + } + DBG_RETURN(ret); } /* }}} */ -- cgit v1.2.1 From fefc3045a38fa58302ba38fc5986a56fec7613c1 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 2 Nov 2015 15:59:19 +0100 Subject: MNDR: - remove COM_FIELD_LIST --- ext/mysqlnd/mysqlnd_wireprotocol.c | 79 +------------------------------------- 1 file changed, 1 insertion(+), 78 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index ad89fc0007..975239011f 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1292,9 +1292,8 @@ php_mysqlnd_rset_field_read(void * _packet) DBG_ERR_FMT("Server error : (%u) %s", packet->error_info.error_no, packet->error_info.error); DBG_RETURN(PASS); } else if (EODATA_MARKER == *p && packet->header.size < 8) { - /* Premature EOF. That should be COM_FIELD_LIST */ + /* Premature EOF. That should be COM_FIELD_LIST. But we don't support COM_FIELD_LIST anymore, thus this should not happen */ DBG_INF("Premature EOF. That should be COM_FIELD_LIST"); - packet->stupid_list_fields_eof = TRUE; DBG_RETURN(PASS); } @@ -3114,79 +3113,6 @@ mysqlnd_com_ping_create_command(va_list args) } /* }}} */ -/************************** COM_FIELD_LIST ******************************************/ -struct st_mysqlnd_protocol_com_field_list_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_field_list_context - { - MYSQLND_CONN_DATA * conn; - MYSQLND_CSTRING table; - MYSQLND_CSTRING achtung_wild; - } context; -}; - - -/* {{{ mysqlnd_com_field_list_run */ -static enum_func_status -mysqlnd_com_field_list_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_field_list_command * command = (struct st_mysqlnd_protocol_com_field_list_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - /* db + \0 + wild + \0 (for wild) */ - zend_uchar buff[MYSQLND_MAX_ALLOWED_DB_LEN * 2 + 1 + 1], *p = buff; - - DBG_ENTER("mysqlnd_com_field_list_run"); - - if (command->context.table.s && command->context.table.l) { - size_t to_copy = MIN(command->context.table.l, MYSQLND_MAX_ALLOWED_DB_LEN); - memcpy(p, command->context.table.s, to_copy); - p += to_copy; - *p++ = '\0'; - } - - if (command->context.achtung_wild.s && command->context.achtung_wild.l) { - size_t to_copy = MIN(command->context.achtung_wild.l, MYSQLND_MAX_ALLOWED_DB_LEN); - memcpy(p, command->context.achtung_wild.s, to_copy); - p += to_copy; - *p++ = '\0'; - } - - ret = send_command(COM_FIELD_LIST, buff, p - buff, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->payload_decoder_factory, - conn->m->send_close, - conn); - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_field_list_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_field_list_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_field_list_command * command; - DBG_ENTER("mysqlnd_com_field_list_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_field_list_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.table = va_arg(args, MYSQLND_CSTRING); - command->context.achtung_wild = va_arg(args, MYSQLND_CSTRING); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_field_list_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - /************************** COM_STATISTICS ******************************************/ struct st_mysqlnd_protocol_com_statistics_command @@ -4174,9 +4100,6 @@ mysqlnd_get_command(enum php_mysqlnd_server_command command, ...) case COM_PING: ret = mysqlnd_com_ping_create_command(args); break; - case COM_FIELD_LIST: - ret = mysqlnd_com_field_list_create_command(args); - break; case COM_STATISTICS: ret = mysqlnd_com_statistics_create_command(args); break; -- cgit v1.2.1 From e30e884e53c2cfed646a218122daeaa9a81f2d45 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 2 Nov 2015 16:35:59 +0100 Subject: MNDR: - move COM_INIT_DE result handling to the command --- ext/mysqlnd/mysqlnd_wireprotocol.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 975239011f..8cfbec3c14 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -3020,6 +3020,7 @@ mysqlnd_com_init_db_run(void *cmd) struct st_mysqlnd_protocol_com_init_db_command * command = (struct st_mysqlnd_protocol_com_init_db_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + const MYSQLND_CSTRING db = command->context.db; DBG_ENTER("mysqlnd_com_init_db_run"); @@ -3036,6 +3037,24 @@ mysqlnd_com_init_db_run(void *cmd) conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); } + /* + The server sends 0 but libmysql doesn't read it and has established + a protocol of giving back -1. Thus we have to follow it :( + */ + UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); + if (ret == PASS) { + if (conn->connect_or_select_db.s) { + mnd_pefree(conn->connect_or_select_db.s, conn->persistent); + } + conn->connect_or_select_db.s = mnd_pestrndup(db.s, db.l, conn->persistent); + conn->connect_or_select_db.l = db.l; + if (!conn->connect_or_select_db.s) { + /* OOM */ + SET_OOM_ERROR(conn->error_info); + ret = FAIL; + } + } + DBG_RETURN(ret); } /* }}} */ -- cgit v1.2.1 From 71e703761f8af481b39aecb8afc6fab10e9eb4f3 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 2 Nov 2015 18:05:12 +0100 Subject: MNDR: - clean up some things --- ext/mysqlnd/mysqlnd_wireprotocol.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 8cfbec3c14..c478ccbc7d 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -890,7 +890,7 @@ php_mysqlnd_ok_read(void * _packet) packet->error, sizeof(packet->error), &packet->error_no, packet->sqlstate ); - DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status); + DBG_INF_FMT("conn->server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status)); DBG_RETURN(PASS); } /* Everything was fine! */ @@ -1143,7 +1143,7 @@ php_mysqlnd_rset_header_read(void * _packet) packet->error_info.error, sizeof(packet->error_info.error), &packet->error_info.error_no, packet->error_info.sqlstate ); - DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status); + DBG_INF_FMT("conn->server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status)); DBG_RETURN(PASS); } @@ -2679,7 +2679,7 @@ send_command( MYSQLND_PACKET_COMMAND * cmd_packet = NULL; DBG_ENTER("send_command"); DBG_INF_FMT("command=%s silent=%u", mysqlnd_command_to_text[command], silent); - DBG_INF_FMT("server_status=%u", upsert_status->server_status); + DBG_INF_FMT("server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(upsert_status)); DBG_INF_FMT("sending %u bytes", arg_len + 1); /* + 1 is for the command */ enum mysqlnd_connection_state state = connection_state->m->get(connection_state); @@ -2773,10 +2773,10 @@ send_command_handle_OK(MYSQLND_ERROR_INFO * const error_info, last_message_persistent); if (!ignore_upsert_status) { UPSERT_STATUS_RESET(upsert_status); - upsert_status->warning_count = ok_response->warning_count; - upsert_status->server_status = ok_response->server_status; - upsert_status->affected_rows = ok_response->affected_rows; - upsert_status->last_insert_id = ok_response->last_insert_id; + UPSERT_STATUS_SET_WARNINGS(upsert_status, ok_response->warning_count); + UPSERT_STATUS_SET_SERVER_STATUS(upsert_status, ok_response->server_status); + UPSERT_STATUS_SET_AFFECTED_ROWS(upsert_status, ok_response->affected_rows); + UPSERT_STATUS_SET_LAST_INSERT_ID(upsert_status, ok_response->last_insert_id); } else { /* LOAD DATA */ } -- cgit v1.2.1 From 5abee1948eb71f9a0e163e3ce491b3e10ee0414e Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 2 Nov 2015 18:08:53 +0100 Subject: MNDR: - remove dead code --- ext/mysqlnd/mysqlnd_wireprotocol.c | 42 +------------------------------------- 1 file changed, 1 insertion(+), 41 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index c478ccbc7d..f4f6a82de0 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -572,25 +572,6 @@ size_t php_mysqlnd_auth_write(void * _packet) if (packet->connect_attr && zend_hash_num_elements(packet->connect_attr)) { size_t ca_payload_len = 0; -#ifdef OLD_CODE - HashPosition pos_value; - const char ** entry_value; - zend_hash_internal_pointer_reset_ex(packet->connect_attr, &pos_value); - while (SUCCESS == zend_hash_get_current_data_ex(packet->connect_attr, (void **)&entry_value, &pos_value)) { - char *s_key; - unsigned int s_len; - zend_ulong num_key; - size_t value_len = strlen(*entry_value); - - if (HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(packet->connect_attr, &s_key, &s_len, &num_key, &pos_value)) { - ca_payload_len += php_mysqlnd_net_store_length_size(s_len); - ca_payload_len += s_len; - ca_payload_len += php_mysqlnd_net_store_length_size(value_len); - ca_payload_len += value_len; - } - zend_hash_move_forward_ex(conn->options->connect_attr, &pos_value); - } -#else { zend_string * key; @@ -606,30 +587,10 @@ size_t php_mysqlnd_auth_write(void * _packet) } } ZEND_HASH_FOREACH_END(); } -#endif + if (sizeof(buffer) >= (ca_payload_len + php_mysqlnd_net_store_length_size(ca_payload_len) + (p - buffer))) { p = php_mysqlnd_net_store_length(p, ca_payload_len); -#ifdef OLD_CODE - zend_hash_internal_pointer_reset_ex(packet->connect_attr, &pos_value); - while (SUCCESS == zend_hash_get_current_data_ex(packet->connect_attr, (void **)&entry_value, &pos_value)) { - char *s_key; - unsigned int s_len; - zend_ulong num_key; - size_t value_len = strlen(*entry_value); - if (HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(packet->connect_attr, &s_key, &s_len, &num_key, &pos_value)) { - /* copy key */ - p = php_mysqlnd_net_store_length(p, s_len); - memcpy(p, s_key, s_len); - p+= s_len; - /* copy value */ - p = php_mysqlnd_net_store_length(p, value_len); - memcpy(p, *entry_value, value_len); - p+= value_len; - } - zend_hash_move_forward_ex(conn->options->connect_attr, &pos_value); - } -#else { zend_string * key; zval * entry_value; @@ -648,7 +609,6 @@ size_t php_mysqlnd_auth_write(void * _packet) } } ZEND_HASH_FOREACH_END(); } -#endif } else { /* cannot put the data - skip */ } -- cgit v1.2.1 From baab519ae5bc545376cd59ff520ce28afa142d5d Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Wed, 4 Nov 2015 10:29:00 +0100 Subject: MNDR: - decouple the commands from the connection. CONN ist passed now only in 1 case --- ext/mysqlnd/mysqlnd_wireprotocol.c | 323 +++++++++++++++++++++++++------------ 1 file changed, 219 insertions(+), 104 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index f4f6a82de0..5f7838d983 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -288,15 +288,19 @@ mysqlnd_read_header(MYSQLND_NET * net, MYSQLND_PACKET_HEADER * header, /* {{{ mysqlnd_read_packet_header_and_body */ static enum_func_status -mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, MYSQLND_CONN_DATA * conn, +mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, + MYSQLND_NET * net, + MYSQLND_STATS * stats, + MYSQLND_ERROR_INFO * error_info, + MYSQLND_CONNECTION_STATE * connection_state, zend_uchar * buf, size_t buf_size, const char * const packet_type_as_text, enum mysqlnd_packet_type packet_type) { DBG_ENTER("mysqlnd_read_packet_header_and_body"); DBG_INF_FMT("buf=%p size=%u", buf, buf_size); - if (FAIL == mysqlnd_read_header(conn->net, packet_header, conn->stats, conn->error_info)) { - SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); - SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + if (FAIL == mysqlnd_read_header(net, packet_header, stats, error_info)) { + SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); + SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); DBG_ERR_FMT("Can't read %s's header", packet_type_as_text); DBG_RETURN(FAIL); @@ -306,14 +310,14 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, MYSQL buf_size, packet_header->size, packet_header->size - buf_size); DBG_RETURN(FAIL); } - if (FAIL == conn->net->data->m.receive_ex(conn->net, buf, packet_header->size, conn->stats, conn->error_info)) { - SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); - SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + if (FAIL == net->data->m.receive_ex(net, buf, packet_header->size, stats, error_info)) { + SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); + SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); DBG_ERR_FMT("Empty '%s' packet body", packet_type_as_text); DBG_RETURN(FAIL); } - MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, packet_type_to_statistic_byte_count[packet_type], + MYSQLND_INC_CONN_STATISTIC_W_VALUE2(stats, packet_type_to_statistic_byte_count[packet_type], MYSQLND_HEADER_SIZE + packet_header->size, packet_type_to_statistic_packet_count[packet_type], 1); @@ -331,12 +335,14 @@ php_mysqlnd_greet_read(void * _packet) zend_uchar *begin = buf; zend_uchar *pad_start = NULL; MYSQLND_PACKET_GREET *packet= (MYSQLND_PACKET_GREET *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; DBG_ENTER("php_mysqlnd_greet_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, sizeof(buf), "greeting", PROT_GREET_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, sizeof(buf), "greeting", PROT_GREET_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -496,8 +502,11 @@ size_t php_mysqlnd_auth_write(void * _packet) zend_uchar *p = buffer + MYSQLND_HEADER_SIZE; /* start after the header */ int len; MYSQLND_PACKET_AUTH * packet= (MYSQLND_PACKET_AUTH *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); + MYSQLND_CONN_DATA * conn = packet->header.conn; + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; DBG_ENTER("php_mysqlnd_auth_write"); @@ -528,7 +537,7 @@ size_t php_mysqlnd_auth_write(void * _packet) if (packet->auth_data_len > 0xFF) { const char * const msg = "Authentication data too long. " "Won't fit into the buffer and will be truncated. Authentication will thus fail"; - SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, msg); + SET_CLIENT_ERROR(error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, msg); php_error_docref(NULL, E_WARNING, "%s", msg); DBG_RETURN(0); } @@ -626,9 +635,9 @@ size_t php_mysqlnd_auth_write(void * _packet) DBG_RETURN(ret == PASS? (p - buffer - MYSQLND_HEADER_SIZE) : 0); } else { - size_t sent = conn->net->data->m.send_ex(conn->net, buffer, p - buffer - MYSQLND_HEADER_SIZE, conn->stats, conn->error_info); + size_t sent = net->data->m.send_ex(net, buffer, p - buffer - MYSQLND_HEADER_SIZE, stats, error_info); if (!sent) { - SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); + SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); } DBG_RETURN(sent); } @@ -655,11 +664,13 @@ static enum_func_status php_mysqlnd_auth_response_read(void * _packet) { register MYSQLND_PACKET_AUTH_RESPONSE * packet= (MYSQLND_PACKET_AUTH_RESPONSE *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; zend_uchar local_buf[AUTH_RESP_BUFFER_SIZE]; - size_t buf_len = conn->net->cmd_buffer.buffer? conn->net->cmd_buffer.length: AUTH_RESP_BUFFER_SIZE; - zend_uchar *buf = conn->net->cmd_buffer.buffer? (zend_uchar *) conn->net->cmd_buffer.buffer : local_buf; + size_t buf_len = net->cmd_buffer.buffer? net->cmd_buffer.length: AUTH_RESP_BUFFER_SIZE; + zend_uchar *buf = net->cmd_buffer.buffer? (zend_uchar *) net->cmd_buffer.buffer : local_buf; zend_uchar *p = buf; zend_uchar *begin = buf; zend_ulong i; @@ -668,7 +679,7 @@ php_mysqlnd_auth_response_read(void * _packet) /* leave space for terminating safety \0 */ buf_len--; - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "OK", PROT_OK_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "OK", PROT_OK_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -779,9 +790,11 @@ static size_t php_mysqlnd_change_auth_response_write(void * _packet) { MYSQLND_PACKET_CHANGE_AUTH_RESPONSE *packet= (MYSQLND_PACKET_CHANGE_AUTH_RESPONSE *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); - zend_uchar * buffer = conn->net->cmd_buffer.length >= packet->auth_data_len? conn->net->cmd_buffer.buffer : mnd_emalloc(packet->auth_data_len); + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; + zend_uchar * buffer = net->cmd_buffer.length >= packet->auth_data_len? net->cmd_buffer.buffer : mnd_emalloc(packet->auth_data_len); zend_uchar *p = buffer + MYSQLND_HEADER_SIZE; /* start after the header */ DBG_ENTER("php_mysqlnd_change_auth_response_write"); @@ -792,12 +805,12 @@ php_mysqlnd_change_auth_response_write(void * _packet) } { - size_t sent = conn->net->data->m.send_ex(conn->net, buffer, p - buffer - MYSQLND_HEADER_SIZE, conn->stats, conn->error_info); - if (buffer != conn->net->cmd_buffer.buffer) { + size_t sent = net->data->m.send_ex(net, buffer, p - buffer - MYSQLND_HEADER_SIZE, stats, error_info); + if (buffer != net->cmd_buffer.buffer) { mnd_efree(buffer); } if (!sent) { - SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); + SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); } DBG_RETURN(sent); } @@ -824,18 +837,20 @@ static enum_func_status php_mysqlnd_ok_read(void * _packet) { register MYSQLND_PACKET_OK *packet= (MYSQLND_PACKET_OK *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; zend_uchar local_buf[OK_BUFFER_SIZE]; - size_t buf_len = conn->net->cmd_buffer.buffer? conn->net->cmd_buffer.length : OK_BUFFER_SIZE; - zend_uchar *buf = conn->net->cmd_buffer.buffer? (zend_uchar *) conn->net->cmd_buffer.buffer : local_buf; + size_t buf_len = net->cmd_buffer.buffer? net->cmd_buffer.length : OK_BUFFER_SIZE; + zend_uchar *buf = net->cmd_buffer.buffer? (zend_uchar *) net->cmd_buffer.buffer : local_buf; zend_uchar *p = buf; zend_uchar *begin = buf; zend_ulong i; DBG_ENTER("php_mysqlnd_ok_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "OK", PROT_OK_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "OK", PROT_OK_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -850,7 +865,6 @@ php_mysqlnd_ok_read(void * _packet) packet->error, sizeof(packet->error), &packet->error_no, packet->sqlstate ); - DBG_INF_FMT("conn->server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status)); DBG_RETURN(PASS); } /* Everything was fine! */ @@ -920,16 +934,18 @@ php_mysqlnd_eof_read(void * _packet) Error : error_code + '#' + sqlstate + MYSQLND_ERRMSG_SIZE */ MYSQLND_PACKET_EOF *packet= (MYSQLND_PACKET_EOF *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); - size_t buf_len = conn->net->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; + size_t buf_len = net->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; DBG_ENTER("php_mysqlnd_eof_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "EOF", PROT_EOF_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "EOF", PROT_EOF_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -996,9 +1012,10 @@ size_t php_mysqlnd_cmd_write(void * _packet) { /* Let's have some space, which we can use, if not enough, we will allocate new buffer */ MYSQLND_PACKET_COMMAND * packet= (MYSQLND_PACKET_COMMAND *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); - MYSQLND_NET * net = conn->net; + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; unsigned int error_reporting = EG(error_reporting); size_t sent = 0; @@ -1014,7 +1031,7 @@ size_t php_mysqlnd_cmd_write(void * _packet) EG(error_reporting) = 0; } - MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_PACKETS_SENT_CMD); + MYSQLND_INC_CONN_STATISTIC(stats, STAT_PACKETS_SENT_CMD); #ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND net->data->m.consume_uneaten_data(net, packet->command); @@ -1024,7 +1041,7 @@ size_t php_mysqlnd_cmd_write(void * _packet) zend_uchar buffer[MYSQLND_HEADER_SIZE + 1]; int1store(buffer + MYSQLND_HEADER_SIZE, packet->command); - sent = net->data->m.send_ex(net, buffer, 1, conn->stats, conn->error_info); + sent = net->data->m.send_ex(net, buffer, 1, stats, error_info); } else { size_t tmp_len = packet->argument.l + 1 + MYSQLND_HEADER_SIZE; zend_uchar *tmp, *p; @@ -1039,9 +1056,9 @@ size_t php_mysqlnd_cmd_write(void * _packet) memcpy(p, packet->argument.s, packet->argument.l); - sent = net->data->m.send_ex(net, tmp, tmp_len - MYSQLND_HEADER_SIZE, conn->stats, conn->error_info); + sent = net->data->m.send_ex(net, tmp, tmp_len - MYSQLND_HEADER_SIZE, stats, error_info); if (tmp != net->cmd_buffer.buffer) { - MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_CMD_BUFFER_TOO_SMALL); + MYSQLND_INC_CONN_STATISTIC(stats, STAT_CMD_BUFFER_TOO_SMALL); mnd_efree(tmp); } } @@ -1051,7 +1068,7 @@ end: EG(error_reporting) = error_reporting; } if (!sent) { - SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); + SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); } DBG_RETURN(sent); } @@ -1075,18 +1092,20 @@ static enum_func_status php_mysqlnd_rset_header_read(void * _packet) { MYSQLND_PACKET_RSET_HEADER * packet= (MYSQLND_PACKET_RSET_HEADER *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; enum_func_status ret = PASS; - size_t buf_len = conn->net->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; + size_t buf_len = net->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; size_t len; DBG_ENTER("php_mysqlnd_rset_header_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "resultset header", PROT_RSET_HEADER_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "resultset header", PROT_RSET_HEADER_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -1103,7 +1122,6 @@ php_mysqlnd_rset_header_read(void * _packet) packet->error_info.error, sizeof(packet->error_info.error), &packet->error_info.error_no, packet->error_info.sqlstate ); - DBG_INF_FMT("conn->server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status)); DBG_RETURN(PASS); } @@ -1127,7 +1145,7 @@ php_mysqlnd_rset_header_read(void * _packet) packet->info_or_local_file.s[len] = '\0'; packet->info_or_local_file.l = len; } else { - SET_OOM_ERROR(conn->error_info); + SET_OOM_ERROR(error_info); ret = FAIL; } break; @@ -1154,7 +1172,7 @@ php_mysqlnd_rset_header_read(void * _packet) packet->info_or_local_file.s[len] = '\0'; packet->info_or_local_file.l = len; } else { - SET_OOM_ERROR(conn->error_info); + SET_OOM_ERROR(error_info); ret = FAIL; } } @@ -1219,10 +1237,12 @@ php_mysqlnd_rset_field_read(void * _packet) { /* Should be enough for the metadata of a single row */ MYSQLND_PACKET_RES_FIELD *packet = (MYSQLND_PACKET_RES_FIELD *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); - size_t buf_len = conn->net->cmd_buffer.length, total_len = 0; - zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; + size_t buf_len = net->cmd_buffer.length, total_len = 0; + zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; char *root_ptr; @@ -1232,7 +1252,7 @@ php_mysqlnd_rset_field_read(void * _packet) DBG_ENTER("php_mysqlnd_rset_field_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "field", PROT_RSET_FLD_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "field", PROT_RSET_FLD_PACKET)) { DBG_RETURN(FAIL); } @@ -1335,7 +1355,7 @@ php_mysqlnd_rset_field_read(void * _packet) DBG_INF_FMT("Def found, length %lu, persistent=%u", len, packet->persistent_alloc); meta->def = mnd_pemalloc(len + 1, packet->persistent_alloc); if (!meta->def) { - SET_OOM_ERROR(conn->error_info); + SET_OOM_ERROR(error_info); DBG_RETURN(FAIL); } memcpy(meta->def, p, len); @@ -1346,7 +1366,7 @@ php_mysqlnd_rset_field_read(void * _packet) root_ptr = meta->root = mnd_pemalloc(total_len, packet->persistent_alloc); if (!root_ptr) { - SET_OOM_ERROR(conn->error_info); + SET_OOM_ERROR(error_info); DBG_RETURN(FAIL); } @@ -1432,7 +1452,10 @@ void php_mysqlnd_rset_field_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_read_row_ex */ static enum_func_status -php_mysqlnd_read_row_ex(MYSQLND_CONN_DATA * conn, MYSQLND_MEMORY_POOL * result_set_memory_pool, +php_mysqlnd_read_row_ex(MYSQLND_NET * net, + MYSQLND_STATS * stats, + MYSQLND_ERROR_INFO * error_info, + MYSQLND_MEMORY_POOL * result_set_memory_pool, MYSQLND_MEMORY_POOL_CHUNK ** buffer, size_t * data_size, zend_bool persistent_alloc, unsigned int prealloc_more_bytes) @@ -1454,7 +1477,7 @@ php_mysqlnd_read_row_ex(MYSQLND_CONN_DATA * conn, MYSQLND_MEMORY_POOL * result_s *data_size = prealloc_more_bytes; while (1) { - if (FAIL == mysqlnd_read_header(conn->net, &header, conn->stats, conn->error_info)) { + if (FAIL == mysqlnd_read_header(net, &header, stats, error_info)) { ret = FAIL; break; } @@ -1479,7 +1502,7 @@ php_mysqlnd_read_row_ex(MYSQLND_CONN_DATA * conn, MYSQLND_MEMORY_POOL * result_s We have to realloc the buffer. */ if (FAIL == (*buffer)->resize_chunk((*buffer), *data_size)) { - SET_OOM_ERROR(conn->error_info); + SET_OOM_ERROR(error_info); ret = FAIL; break; } @@ -1487,7 +1510,7 @@ php_mysqlnd_read_row_ex(MYSQLND_CONN_DATA * conn, MYSQLND_MEMORY_POOL * result_s p = (*buffer)->ptr + (*data_size - header.size); } - if (PASS != (ret = conn->net->data->m.receive_ex(conn->net, p, header.size, conn->stats, conn->error_info))) { + if (PASS != (ret = net->data->m.receive_ex(net, p, header.size, stats, error_info))) { DBG_ERR("Empty row packet body"); php_error(E_WARNING, "Empty row packet body"); break; @@ -1787,8 +1810,9 @@ static enum_func_status php_mysqlnd_rowp_read(void * _packet) { MYSQLND_PACKET_ROW *packet= (MYSQLND_PACKET_ROW *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; zend_uchar *p; enum_func_status ret = PASS; size_t post_alloc_for_bit_fields = 0; @@ -1801,13 +1825,14 @@ php_mysqlnd_rowp_read(void * _packet) post_alloc_for_bit_fields = packet->bit_fields_total_len + packet->bit_fields_count; } - ret = php_mysqlnd_read_row_ex(conn, packet->result_set_memory_pool, &packet->row_buffer, &data_size, + ret = php_mysqlnd_read_row_ex(net, stats, error_info, + packet->result_set_memory_pool, &packet->row_buffer, &data_size, packet->persistent_alloc, post_alloc_for_bit_fields ); if (FAIL == ret) { goto end; } - MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, packet_type_to_statistic_byte_count[PROT_ROW_PACKET], + MYSQLND_INC_CONN_STATISTIC_W_VALUE2(stats, packet_type_to_statistic_byte_count[PROT_ROW_PACKET], MYSQLND_HEADER_SIZE + packet->header.size, packet_type_to_statistic_packet_count[PROT_ROW_PACKET], 1); @@ -1840,7 +1865,7 @@ php_mysqlnd_rowp_read(void * _packet) DBG_INF_FMT("server_status=%u warning_count=%u", packet->server_status, packet->warning_count); } } else { - MYSQLND_INC_CONN_STATISTIC(conn->stats, + MYSQLND_INC_CONN_STATISTIC(stats, packet->binary_protocol? STAT_ROWS_FETCHED_FROM_SERVER_PS: STAT_ROWS_FETCHED_FROM_SERVER_NORMAL); @@ -1864,7 +1889,7 @@ php_mysqlnd_rowp_read(void * _packet) packet->persistent_alloc); } } else { - MYSQLND_INC_CONN_STATISTIC(conn->stats, + MYSQLND_INC_CONN_STATISTIC(stats, packet->binary_protocol? STAT_ROWS_SKIPPED_PS: STAT_ROWS_SKIPPED_NORMAL); } @@ -1909,14 +1934,16 @@ static enum_func_status php_mysqlnd_stats_read(void * _packet) { MYSQLND_PACKET_STATS *packet= (MYSQLND_PACKET_STATS *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); - size_t buf_len = conn->net->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; + size_t buf_len = net->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; DBG_ENTER("php_mysqlnd_stats_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "statistics", PROT_STATS_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "statistics", PROT_STATS_PACKET)) { DBG_RETURN(FAIL); } @@ -1955,18 +1982,20 @@ static enum_func_status php_mysqlnd_prepare_read(void * _packet) { MYSQLND_PACKET_PREPARE_RESPONSE *packet= (MYSQLND_PACKET_PREPARE_RESPONSE *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; /* In case of an error, we should have place to put it */ - size_t buf_len = conn->net->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; + size_t buf_len = net->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; unsigned int data_size; DBG_ENTER("php_mysqlnd_prepare_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "prepare", PROT_PREPARE_RESP_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "prepare", PROT_PREPARE_RESP_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -2047,17 +2076,19 @@ static enum_func_status php_mysqlnd_chg_user_read(void * _packet) { MYSQLND_PACKET_CHG_USER_RESPONSE *packet= (MYSQLND_PACKET_CHG_USER_RESPONSE *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; /* There could be an error message */ - size_t buf_len = conn->net->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer; + size_t buf_len = net->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; DBG_ENTER("php_mysqlnd_chg_user_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, buf_len, "change user response", PROT_CHG_USER_RESP_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "change user response", PROT_CHG_USER_RESP_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -2138,16 +2169,17 @@ php_mysqlnd_chg_user_free_mem(void * _packet, zend_bool stack_allocation) static size_t php_mysqlnd_sha256_pk_request_write(void * _packet) { - MYSQLND_PACKET_HEADER *packet_header= (MYSQLND_PACKET_HEADER *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet_header->factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); + MYSQLND_PACKET_SHA256_PK_REQUEST * packet = (MYSQLND_PACKET_SHA256_PK_REQUEST *) _packet; + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; zend_uchar buffer[MYSQLND_HEADER_SIZE + 1]; size_t sent; DBG_ENTER("php_mysqlnd_sha256_pk_request_write"); int1store(buffer + MYSQLND_HEADER_SIZE, '\1'); - sent = conn->net->data->m.send_ex(conn->net, buffer, 1, conn->stats, conn->error_info); + sent = net->data->m.send_ex(net, buffer, 1, stats, error_info); DBG_RETURN(sent); } @@ -2173,8 +2205,10 @@ static enum_func_status php_mysqlnd_sha256_pk_request_response_read(void * _packet) { MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE * packet= (MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE *) _packet; - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory = packet->header.factory; - MYSQLND_CONN_DATA * conn = factory->m.get_mysqlnd_conn_data(factory); + MYSQLND_ERROR_INFO * error_info = packet->header.error_info; + MYSQLND_NET * net = packet->header.net; + MYSQLND_STATS * stats = packet->header.stats; + MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; zend_uchar buf[SHA256_PK_REQUEST_RESP_BUFFER_SIZE]; zend_uchar *p = buf; zend_uchar *begin = buf; @@ -2182,7 +2216,7 @@ php_mysqlnd_sha256_pk_request_response_read(void * _packet) DBG_ENTER("php_mysqlnd_sha256_pk_request_response_read"); /* leave space for terminating safety \0 */ - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), conn, buf, sizeof(buf), "SHA256_PK_REQUEST_RESPONSE", PROT_SHA256_PK_REQUEST_RESPONSE_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, sizeof(buf), "SHA256_PK_REQUEST_RESPONSE", PROT_SHA256_PK_REQUEST_RESPONSE_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -2322,16 +2356,6 @@ mysqlnd_packet_methods packet_methods[PROT_LAST] = /* }}} */ -/* {{{ mysqlnd_protocol::get_mysqlnd_conn_data */ -MYSQLND_CONN_DATA * -MYSQLND_METHOD(mysqlnd_protocol, get_mysqlnd_conn_data)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory) -{ - DBG_ENTER("mysqlnd_protocol::get_mysqlnd_conn_data"); - DBG_RETURN(factory->conn); -} -/* }}} */ - - /* {{{ mysqlnd_protocol::get_greet_packet */ static struct st_mysqlnd_packet_greet * MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) @@ -2341,6 +2365,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECO if (packet) { packet->header.m = &packet_methods[PROT_GREET_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2357,6 +2387,13 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECOD if (packet) { packet->header.m = &packet_methods[PROT_AUTH_PACKET]; packet->header.factory = factory; + + packet->header.conn = factory->conn; + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2373,6 +2410,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet)(MYSQLND_PROTOCOL_PAYL if (packet) { packet->header.m = &packet_methods[PROT_AUTH_RESP_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2389,6 +2432,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet)(MYSQLND_PROTOC if (packet) { packet->header.m = &packet_methods[PROT_CHANGE_AUTH_RESP_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2405,6 +2454,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER if (packet) { packet->header.m = &packet_methods[PROT_OK_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2421,6 +2476,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODE if (packet) { packet->header.m = &packet_methods[PROT_EOF_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2437,6 +2498,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL_PAYLOAD_DE if (packet) { packet->header.m = &packet_methods[PROT_CMD_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2453,6 +2520,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL_PAYLOA if (packet) { packet->header.m = &packet_methods[PROT_RSET_HEADER_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2469,6 +2542,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL_PAYLO if (packet) { packet->header.m = &packet_methods[PROT_RSET_FLD_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2485,6 +2564,13 @@ MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODE if (packet) { packet->header.m = &packet_methods[PROT_ROW_PACKET]; packet->header.factory = factory; + + packet->header.conn = factory->conn; + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2501,6 +2587,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECO if (packet) { packet->header.m = &packet_methods[PROT_STATS_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2517,6 +2609,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL_P if (packet) { packet->header.m = &packet_methods[PROT_PREPARE_RESP_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2533,6 +2631,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOC if (packet) { packet->header.m = &packet_methods[PROT_CHG_USER_RESP_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2549,6 +2653,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet)(MYSQLND_PROTOCOL_ if (packet) { packet->header.m = &packet_methods[PROT_SHA256_PK_REQUEST_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2565,6 +2675,12 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_ if (packet) { packet->header.m = &packet_methods[PROT_SHA256_PK_REQUEST_RESPONSE_PACKET]; packet->header.factory = factory; + + packet->header.net = factory->conn->net; + packet->header.stats = factory->conn->stats; + packet->header.error_info = factory->conn->error_info; + packet->header.connection_state = &factory->conn->state; + packet->header.persistent = persistent; } DBG_RETURN(packet); @@ -2572,7 +2688,6 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_ /* }}} */ MYSQLND_CLASS_METHODS_START(mysqlnd_protocol_payload_decoder_factory) - MYSQLND_METHOD(mysqlnd_protocol, get_mysqlnd_conn_data), MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet), MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet), MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet), -- cgit v1.2.1 From b8b1d45c3c9b5ceba2e3a12108c84e122e2e20b1 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Thu, 5 Nov 2015 15:26:33 +0100 Subject: MNDR: - move connection establishment code to own command - COM_HANDSHAKE --- ext/mysqlnd/mysqlnd_wireprotocol.c | 154 +++++++++++++++++++++++++++++++++---- 1 file changed, 138 insertions(+), 16 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 5f7838d983..c6b53e4323 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -347,8 +347,8 @@ php_mysqlnd_greet_read(void * _packet) } BAIL_IF_NO_MORE_DATA; - packet->auth_plugin_data = packet->intern_auth_plugin_data; - packet->auth_plugin_data_len = sizeof(packet->intern_auth_plugin_data); + packet->authentication_plugin_data.s = packet->intern_auth_plugin_data; + packet->authentication_plugin_data.l = sizeof(packet->intern_auth_plugin_data); if (packet->header.size < sizeof(buf)) { /* @@ -386,7 +386,7 @@ php_mysqlnd_greet_read(void * _packet) p+=4; BAIL_IF_NO_MORE_DATA; - memcpy(packet->auth_plugin_data, p, SCRAMBLE_LENGTH_323); + memcpy(packet->authentication_plugin_data.s, p, SCRAMBLE_LENGTH_323); p+= SCRAMBLE_LENGTH_323; BAIL_IF_NO_MORE_DATA; @@ -413,7 +413,7 @@ php_mysqlnd_greet_read(void * _packet) if ((size_t) (p - buf) < packet->header.size) { /* auth_plugin_data is split into two parts */ - memcpy(packet->auth_plugin_data + SCRAMBLE_LENGTH_323, p, SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323); + memcpy(packet->authentication_plugin_data.s + SCRAMBLE_LENGTH_323, p, SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323); p+= SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323; p++; /* 0x0 at the end of the scramble and thus last byte in the packet in 5.1 and previous */ } else { @@ -428,19 +428,19 @@ php_mysqlnd_greet_read(void * _packet) /* Additional 16 bits for server capabilities */ packet->server_capabilities |= uint2korr(pad_start) << 16; /* And a length of the server scramble in one byte */ - packet->auth_plugin_data_len = uint1korr(pad_start + 2); - if (packet->auth_plugin_data_len > SCRAMBLE_LENGTH) { + packet->authentication_plugin_data.l = uint1korr(pad_start + 2); + if (packet->authentication_plugin_data.l > SCRAMBLE_LENGTH) { /* more data*/ - zend_uchar * new_auth_plugin_data = emalloc(packet->auth_plugin_data_len); + char * new_auth_plugin_data = emalloc(packet->authentication_plugin_data.l); if (!new_auth_plugin_data) { goto premature_end; } /* copy what we already have */ - memcpy(new_auth_plugin_data, packet->auth_plugin_data, SCRAMBLE_LENGTH); + memcpy(new_auth_plugin_data, packet->authentication_plugin_data.s, SCRAMBLE_LENGTH); /* add additional scramble data 5.5+ sent us */ - memcpy(new_auth_plugin_data + SCRAMBLE_LENGTH, p, packet->auth_plugin_data_len - SCRAMBLE_LENGTH); - p+= (packet->auth_plugin_data_len - SCRAMBLE_LENGTH); - packet->auth_plugin_data = new_auth_plugin_data; + memcpy(new_auth_plugin_data + SCRAMBLE_LENGTH, p, packet->authentication_plugin_data.l - SCRAMBLE_LENGTH); + p+= (packet->authentication_plugin_data.l - SCRAMBLE_LENGTH); + packet->authentication_plugin_data.s = new_auth_plugin_data; } } @@ -456,7 +456,7 @@ php_mysqlnd_greet_read(void * _packet) DBG_INF_FMT("server_capabilities=%u charset_no=%u server_status=%i auth_protocol=%s scramble_length=%u", packet->server_capabilities, packet->charset_no, packet->server_status, - packet->auth_protocol? packet->auth_protocol:"n/a", packet->auth_plugin_data_len); + packet->auth_protocol? packet->auth_protocol:"n/a", packet->authentication_plugin_data.l); DBG_RETURN(PASS); premature_end: @@ -477,9 +477,9 @@ void php_mysqlnd_greet_free_mem(void * _packet, zend_bool stack_allocation) efree(p->server_version); p->server_version = NULL; } - if (p->auth_plugin_data && p->auth_plugin_data != p->intern_auth_plugin_data) { - efree(p->auth_plugin_data); - p->auth_plugin_data = NULL; + if (p->authentication_plugin_data.s && p->authentication_plugin_data.s != p->intern_auth_plugin_data) { + efree(p->authentication_plugin_data.s); + p->authentication_plugin_data.s = NULL; } if (p->auth_protocol) { efree(p->auth_protocol); @@ -2782,7 +2782,7 @@ send_command( cmd_packet->command = command; if (arg && arg_len) { - cmd_packet->argument.s = arg; + cmd_packet->argument.s = (char *) arg; cmd_packet->argument.l = arg_len; } @@ -4171,6 +4171,125 @@ mysqlnd_com_enable_ssl_create_command(va_list args) } /* }}} */ +/************************** COM_READ_HANDSHAKE ******************************************/ +struct st_mysqlnd_protocol_com_handshake_command +{ + struct st_mysqlnd_protocol_command parent; + struct st_mysqlnd_com_handshake_context + { + MYSQLND_CONN_DATA * conn; + MYSQLND_CSTRING user; + MYSQLND_CSTRING passwd; + MYSQLND_CSTRING database; + size_t client_flags; + } context; +}; + + +/* {{{ mysqlnd_com_handshake_run */ +static enum_func_status +mysqlnd_com_handshake_run(void *cmd) +{ + struct st_mysqlnd_protocol_com_handshake_command * command = (struct st_mysqlnd_protocol_com_handshake_command *) cmd; + const char * user = command->context.user.s; + + const char * passwd = command->context.passwd.s; + size_t passwd_len = command->context.passwd.l; + + const char * db = command->context.database.s; + size_t db_len = command->context.database.l; + + size_t mysql_flags = command->context.client_flags; + + MYSQLND_CONN_DATA * conn = command->context.conn; + MYSQLND_PACKET_GREET * greet_packet; + + DBG_ENTER("mysqlnd_conn_data::connect_handshake"); + DBG_INF_FMT("stream=%p", conn->net->data->m.get_stream(conn->net)); + DBG_INF_FMT("[user=%s] [db=%s:%d] [flags=%llu]", user, db, db_len, mysql_flags); + + greet_packet = conn->payload_decoder_factory->m.get_greet_packet(conn->payload_decoder_factory, FALSE); + if (!greet_packet) { + SET_OOM_ERROR(conn->error_info); + DBG_RETURN(FAIL); /* OOM */ + } + + if (FAIL == PACKET_READ(greet_packet)) { + DBG_ERR("Error while reading greeting packet"); + php_error_docref(NULL, E_WARNING, "Error while reading greeting packet. PID=%d", getpid()); + goto err; + } else if (greet_packet->error_no) { + DBG_ERR_FMT("errorno=%u error=%s", greet_packet->error_no, greet_packet->error); + SET_CLIENT_ERROR(conn->error_info, greet_packet->error_no, greet_packet->sqlstate, greet_packet->error); + goto err; + } else if (greet_packet->pre41) { + DBG_ERR_FMT("Connecting to 3.22, 3.23 & 4.0 is not supported. Server is %-.32s", greet_packet->server_version); + php_error_docref(NULL, E_WARNING, "Connecting to 3.22, 3.23 & 4.0 " + " is not supported. Server is %-.32s", greet_packet->server_version); + SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, + "Connecting to 3.22, 3.23 & 4.0 servers is not supported"); + goto err; + } + + conn->thread_id = greet_packet->thread_id; + conn->protocol_version = greet_packet->protocol_version; + conn->server_version = mnd_pestrdup(greet_packet->server_version, conn->persistent); + + conn->greet_charset = mysqlnd_find_charset_nr(greet_packet->charset_no); + if (!conn->greet_charset) { + php_error_docref(NULL, E_WARNING, + "Server sent charset (%d) unknown to the client. Please, report to the developers", greet_packet->charset_no); + SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, + "Server sent charset unknown to the client. Please, report to the developers"); + goto err; + } + + conn->server_capabilities = greet_packet->server_capabilities; + + if (FAIL == mysqlnd_connect_run_authentication(conn, user, passwd, db, db_len, (size_t) passwd_len, + greet_packet->authentication_plugin_data, greet_packet->auth_protocol, + greet_packet->charset_no, greet_packet->server_capabilities, + conn->options, mysql_flags)) + { + goto err; + } + + UPSERT_STATUS_RESET(conn->upsert_status); + UPSERT_STATUS_SET_SERVER_STATUS(conn->upsert_status, greet_packet->server_status); + + PACKET_FREE(greet_packet); + DBG_RETURN(PASS); +err: + conn->server_capabilities = 0; + PACKET_FREE(greet_packet); + DBG_RETURN(FAIL); +} +/* }}} */ + + +/* {{{ mysqlnd_com_handshake_create_command */ +static struct st_mysqlnd_protocol_command * +mysqlnd_com_handshake_create_command(va_list args) +{ + struct st_mysqlnd_protocol_com_handshake_command * command; + DBG_ENTER("mysqlnd_com_handshake_create_command"); + command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_handshake_command)); + if (command) { + command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); + command->context.user = *va_arg(args, const MYSQLND_CSTRING *); + command->context.passwd = *va_arg(args, const MYSQLND_CSTRING *); + command->context.database = *va_arg(args, const MYSQLND_CSTRING *); + command->context.client_flags = va_arg(args, size_t); + + command->parent.free_command = mysqlnd_com_no_params_free_command; + command->parent.run = mysqlnd_com_handshake_run; + } + + DBG_RETURN((struct st_mysqlnd_protocol_command *) command); +} +/* }}} */ + + /* {{{ mysqlnd_get_command */ static struct st_mysqlnd_protocol_command * @@ -4239,6 +4358,9 @@ mysqlnd_get_command(enum php_mysqlnd_server_command command, ...) case COM_ENABLE_SSL: ret = mysqlnd_com_enable_ssl_create_command(args); break; + case COM_HANDSHAKE: + ret = mysqlnd_com_handshake_create_command(args); + break; default: break; } -- cgit v1.2.1 From 0d3329fc9310e3f7d9e6e28ee0f3f386e06031d7 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Fri, 6 Nov 2015 16:36:02 +0100 Subject: MNDR: - send_command and send_command_handle_response_* moved to a structure --- ext/mysqlnd/mysqlnd_wireprotocol.c | 246 ++++++++++++++++++++----------------- 1 file changed, 131 insertions(+), 115 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index c6b53e4323..041dc07c3f 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -2687,56 +2687,11 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_ } /* }}} */ -MYSQLND_CLASS_METHODS_START(mysqlnd_protocol_payload_decoder_factory) - MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_command_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_row_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet), - MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet) -MYSQLND_CLASS_METHODS_END; - - -/* {{{ mysqlnd_protocol_payload_decoder_factory_init */ -PHPAPI MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * -mysqlnd_protocol_payload_decoder_factory_init(MYSQLND_CONN_DATA * conn, zend_bool persistent) -{ - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * ret; - DBG_ENTER("mysqlnd_protocol_payload_decoder_factory_init"); - ret = MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory).get_protocol_payload_decoder_factory(conn, persistent); - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_protocol_payload_decoder_factory_free */ -PHPAPI void -mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory) -{ - DBG_ENTER("mysqlnd_protocol_payload_decoder_factory_free"); - - if (factory) { - zend_bool pers = factory->persistent; - mnd_pefree(factory, pers); - } - DBG_VOID_RETURN; -} -/* }}} */ - - /* {{{ send_command */ static enum_func_status -send_command( +mysqlnd_protocol__send_command( + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory, const enum php_mysqlnd_server_command command, const zend_uchar * const arg, const size_t arg_len, const zend_bool silent, @@ -2745,10 +2700,8 @@ send_command( MYSQLND_ERROR_INFO * error_info, MYSQLND_UPSERT_STATUS * upsert_status, MYSQLND_STATS * stats, - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory, func_mysqlnd_conn_data__send_close send_close, - void * send_close_ctx -) + void * send_close_ctx) { enum_func_status ret = PASS; MYSQLND_PACKET_COMMAND * cmd_packet = NULL; @@ -2806,12 +2759,13 @@ send_command( /* {{{ send_command_handle_OK */ static enum_func_status -send_command_handle_OK(MYSQLND_ERROR_INFO * const error_info, - MYSQLND_UPSERT_STATUS * const upsert_status, - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory, - const zend_bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */ - MYSQLND_STRING * const last_message, - const zend_bool last_message_persistent) +mysqlnd_protocol__send_command_handle_OK( + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory, + MYSQLND_ERROR_INFO * const error_info, + MYSQLND_UPSERT_STATUS * const upsert_status, + const zend_bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */ + MYSQLND_STRING * const last_message, + const zend_bool last_message_persistent) { enum_func_status ret = FAIL; MYSQLND_PACKET_OK * ok_response = payload_decoder_factory->m.get_ok_packet(payload_decoder_factory, FALSE); @@ -2865,10 +2819,11 @@ end: /* {{{ send_command_handle_EOF */ -enum_func_status -send_command_handle_EOF(MYSQLND_ERROR_INFO * const error_info, - MYSQLND_UPSERT_STATUS * const upsert_status, - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory) +static enum_func_status +mysqlnd_protocol__send_command_handle_EOF( + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory, + MYSQLND_ERROR_INFO * const error_info, + MYSQLND_UPSERT_STATUS * const upsert_status) { enum_func_status ret = FAIL; MYSQLND_PACKET_EOF * response = payload_decoder_factory->m.get_eof_packet(payload_decoder_factory, FALSE); @@ -2905,8 +2860,9 @@ send_command_handle_EOF(MYSQLND_ERROR_INFO * const error_info, /* {{{ send_command_handle_response */ -enum_func_status -send_command_handle_response( +static enum_func_status +mysqlnd_protocol__send_command_handle_response( + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory, const enum mysqlnd_packet_type ok_packet, const zend_bool silent, const enum php_mysqlnd_server_command command, @@ -2914,7 +2870,6 @@ send_command_handle_response( MYSQLND_ERROR_INFO * error_info, MYSQLND_UPSERT_STATUS * upsert_status, - MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory, MYSQLND_STRING * last_message, zend_bool last_message_persistent ) @@ -2926,10 +2881,10 @@ send_command_handle_response( switch (ok_packet) { case PROT_OK_PACKET: - ret = send_command_handle_OK(error_info, upsert_status, payload_decoder_factory, ignore_upsert_status, last_message, last_message_persistent); + ret = payload_decoder_factory->m.send_command_handle_OK(payload_decoder_factory, error_info, upsert_status, ignore_upsert_status, last_message, last_message_persistent); break; case PROT_EOF_PACKET: - ret = send_command_handle_EOF(error_info, upsert_status, payload_decoder_factory); + ret = payload_decoder_factory->m.send_command_handle_EOF(payload_decoder_factory, error_info, upsert_status); break; default: SET_CLIENT_ERROR(error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "Malformed packet"); @@ -2946,6 +2901,59 @@ send_command_handle_response( +MYSQLND_CLASS_METHODS_START(mysqlnd_protocol_payload_decoder_factory) + MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_command_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_row_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet), + MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet), + + mysqlnd_protocol__send_command, + mysqlnd_protocol__send_command_handle_response, + mysqlnd_protocol__send_command_handle_OK, + mysqlnd_protocol__send_command_handle_EOF, +MYSQLND_CLASS_METHODS_END; + + +/* {{{ mysqlnd_protocol_payload_decoder_factory_init */ +PHPAPI MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * +mysqlnd_protocol_payload_decoder_factory_init(MYSQLND_CONN_DATA * conn, zend_bool persistent) +{ + MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * ret; + DBG_ENTER("mysqlnd_protocol_payload_decoder_factory_init"); + ret = MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory).get_protocol_payload_decoder_factory(conn, persistent); + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_protocol_payload_decoder_factory_free */ +PHPAPI void +mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory) +{ + DBG_ENTER("mysqlnd_protocol_payload_decoder_factory_free"); + + if (factory) { + zend_bool pers = factory->persistent; + mnd_pefree(factory, pers); + } + DBG_VOID_RETURN; +} +/* }}} */ + + + + struct st_mysqlnd_protocol_no_params_command { struct st_mysqlnd_protocol_command parent; @@ -2987,21 +2995,22 @@ mysqlnd_com_set_option_run(void *cmd) enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; enum_mysqlnd_server_option option = command->context.option; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; + func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; DBG_ENTER("mysqlnd_com_set_option_run"); int2store(buffer, (unsigned int) option); - ret = send_command(COM_SET_OPTION, buffer, sizeof(buffer), FALSE, + ret = send_command(conn->payload_decoder_factory, COM_SET_OPTION, buffer, sizeof(buffer), FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); if (PASS == ret) { - ret = send_command_handle_response(PROT_EOF_PACKET, FALSE, COM_SET_OPTION, TRUE, - conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); + ret = send_command_handle_response(conn->payload_decoder_factory, PROT_EOF_PACKET, FALSE, COM_SET_OPTION, TRUE, + conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); } DBG_RETURN(ret); } @@ -3036,20 +3045,21 @@ mysqlnd_com_debug_run(void *cmd) struct st_mysqlnd_protocol_no_params_command * command = (struct st_mysqlnd_protocol_no_params_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; + func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; DBG_ENTER("mysqlnd_com_debug_run"); - ret = send_command(COM_DEBUG, NULL, 0, FALSE, + ret = send_command(conn->payload_decoder_factory, COM_DEBUG, NULL, 0, FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); if (PASS == ret) { - ret = send_command_handle_response(PROT_EOF_PACKET, FALSE, COM_DEBUG, TRUE, - conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); + ret = send_command_handle_response(conn->payload_decoder_factory, PROT_EOF_PACKET, FALSE, COM_DEBUG, TRUE, + conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); } DBG_RETURN(ret); @@ -3096,20 +3106,21 @@ mysqlnd_com_init_db_run(void *cmd) enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; const MYSQLND_CSTRING db = command->context.db; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; + func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; DBG_ENTER("mysqlnd_com_init_db_run"); - ret = send_command(COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, + ret = send_command(conn->payload_decoder_factory, COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); if (PASS == ret) { - ret = send_command_handle_response(PROT_OK_PACKET, FALSE, COM_INIT_DB, TRUE, - conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); + ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_INIT_DB, TRUE, + conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); } /* @@ -3163,20 +3174,21 @@ mysqlnd_com_ping_run(void *cmd) struct st_mysqlnd_protocol_no_params_command * command = (struct st_mysqlnd_protocol_no_params_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; + func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; DBG_ENTER("mysqlnd_com_ping_run"); - ret = send_command(COM_PING, NULL, 0, TRUE, + ret = send_command(conn->payload_decoder_factory, COM_PING, NULL, 0, TRUE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); if (PASS == ret) { - ret = send_command_handle_response(PROT_OK_PACKET, TRUE, COM_PING, TRUE, - conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); + ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, TRUE, COM_PING, TRUE, + conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); } /* The server sends 0 but libmysql doesn't read it and has established @@ -3228,15 +3240,15 @@ mysqlnd_com_statistics_run(void *cmd) enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; zend_string **message = command->context.message; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; DBG_ENTER("mysqlnd_com_statistics_run"); - ret = send_command(COM_STATISTICS, NULL, 0, FALSE, + ret = send_command(conn->payload_decoder_factory, COM_STATISTICS, NULL, 0, FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); @@ -3300,21 +3312,22 @@ mysqlnd_com_process_kill_run(void *cmd) enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; zend_bool read_response = command->context.read_response; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; + func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; DBG_ENTER("mysqlnd_com_process_kill_run"); int4store(buff, command->context.process_id); - ret = send_command(COM_PROCESS_KILL, buff, 4, FALSE, + ret = send_command(conn->payload_decoder_factory, COM_PROCESS_KILL, buff, 4, FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); if (PASS == ret && read_response) { - ret = send_command_handle_response(PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE, - conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); + ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE, + conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); } if (read_response) { @@ -3373,21 +3386,22 @@ mysqlnd_com_refresh_run(void *cmd) zend_uchar bits[1]; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; + func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; DBG_ENTER("mysqlnd_com_refresh_run"); int1store(bits, command->context.options); - ret = send_command(COM_REFRESH, bits, 1, FALSE, + ret = send_command(conn->payload_decoder_factory, COM_REFRESH, bits, 1, FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); if (PASS == ret) { - ret = send_command_handle_response(PROT_OK_PACKET, FALSE, COM_REFRESH, TRUE, - conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); + ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_REFRESH, TRUE, + conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); } DBG_RETURN(ret); @@ -3435,21 +3449,22 @@ mysqlnd_com_shutdown_run(void *cmd) zend_uchar bits[1]; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; + func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; DBG_ENTER("mysqlnd_com_shutdown_run"); int1store(bits, command->context.level); - ret = send_command(COM_SHUTDOWN, bits, 1, FALSE, + ret = send_command(conn->payload_decoder_factory, COM_SHUTDOWN, bits, 1, FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); if (PASS == ret) { - ret = send_command_handle_response(PROT_OK_PACKET, FALSE, COM_SHUTDOWN, TRUE, - conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); + ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_SHUTDOWN, TRUE, + conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); } DBG_RETURN(ret); @@ -3495,15 +3510,15 @@ mysqlnd_com_quit_run(void *cmd) struct st_mysqlnd_protocol_com_quit_command * command = (struct st_mysqlnd_protocol_com_quit_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; DBG_ENTER("mysqlnd_com_quit_run"); - ret = send_command(COM_QUIT, NULL, 0, TRUE, + ret = send_command(conn->payload_decoder_factory, COM_QUIT, NULL, 0, TRUE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); @@ -3549,15 +3564,15 @@ mysqlnd_com_query_run(void *cmd) struct st_mysqlnd_protocol_com_query_command * command = (struct st_mysqlnd_protocol_com_query_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; DBG_ENTER("mysqlnd_com_query_run"); - ret = send_command(COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, + ret = send_command(conn->payload_decoder_factory, COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); @@ -3609,15 +3624,15 @@ mysqlnd_com_change_user_run(void *cmd) struct st_mysqlnd_protocol_com_change_user_command * command = (struct st_mysqlnd_protocol_com_change_user_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; DBG_ENTER("mysqlnd_com_change_user_run"); - ret = send_command(COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, + ret = send_command(conn->payload_decoder_factory, COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); @@ -3718,15 +3733,15 @@ mysqlnd_com_stmt_prepare_run(void *cmd) struct st_mysqlnd_protocol_com_stmt_prepare_command * command = (struct st_mysqlnd_protocol_com_stmt_prepare_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; DBG_ENTER("mysqlnd_com_stmt_prepare_run"); - ret = send_command(COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, + ret = send_command(conn->payload_decoder_factory, COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); @@ -3774,15 +3789,15 @@ mysqlnd_com_stmt_execute_run(void *cmd) struct st_mysqlnd_protocol_com_stmt_execute_command * command = (struct st_mysqlnd_protocol_com_stmt_execute_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; DBG_ENTER("mysqlnd_com_stmt_execute_run"); - ret = send_command(COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, + ret = send_command(conn->payload_decoder_factory, COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); @@ -3830,15 +3845,15 @@ mysqlnd_com_stmt_fetch_run(void *cmd) struct st_mysqlnd_protocol_com_stmt_fetch_command * command = (struct st_mysqlnd_protocol_com_stmt_fetch_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; DBG_ENTER("mysqlnd_com_stmt_fetch_run"); - ret = send_command(COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, + ret = send_command(conn->payload_decoder_factory, COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); @@ -3887,21 +3902,22 @@ mysqlnd_com_stmt_reset_run(void *cmd) struct st_mysqlnd_protocol_com_stmt_reset_command * command = (struct st_mysqlnd_protocol_com_stmt_reset_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; + func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; DBG_ENTER("mysqlnd_com_stmt_reset_run"); int4store(cmd_buf, command->context.stmt_id); - ret = send_command(COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, + ret = send_command(conn->payload_decoder_factory, COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); if (PASS == ret) { - ret = send_command_handle_response(PROT_OK_PACKET, FALSE, COM_STMT_RESET, TRUE, - conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent); + ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_STMT_RESET, TRUE, + conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); } DBG_RETURN(ret); @@ -3948,15 +3964,15 @@ mysqlnd_com_stmt_send_long_data_run(void *cmd) struct st_mysqlnd_protocol_com_stmt_send_long_data_command * command = (struct st_mysqlnd_protocol_com_stmt_send_long_data_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; DBG_ENTER("mysqlnd_com_stmt_send_long_data_run"); - ret = send_command(COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, + ret = send_command(conn->payload_decoder_factory, COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); @@ -4005,16 +4021,16 @@ mysqlnd_com_stmt_close_run(void *cmd) struct st_mysqlnd_protocol_com_stmt_close_command * command = (struct st_mysqlnd_protocol_com_stmt_close_command *) cmd; enum_func_status ret = FAIL; MYSQLND_CONN_DATA * conn = command->context.conn; + func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; DBG_ENTER("mysqlnd_com_stmt_close_run"); int4store(cmd_buf, command->context.stmt_id); - ret = send_command(COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, + ret = send_command(conn->payload_decoder_factory, COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, &conn->state, conn->error_info, conn->upsert_status, conn->stats, - conn->payload_decoder_factory, conn->m->send_close, conn); -- cgit v1.2.1 From a990573752af7e0743ed4233ae38cd47b3c94fd5 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Fri, 6 Nov 2015 17:07:18 +0100 Subject: MNDR: - some small renaming of methods --- ext/mysqlnd/mysqlnd_wireprotocol.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 041dc07c3f..be400654ac 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -2688,9 +2688,9 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_ /* }}} */ -/* {{{ send_command */ +/* {{{ mysqlnd_protocol::send_command */ static enum_func_status -mysqlnd_protocol__send_command( +MYSQLND_METHOD(mysqlnd_protocol, send_command)( MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory, const enum php_mysqlnd_server_command command, const zend_uchar * const arg, const size_t arg_len, @@ -2705,7 +2705,7 @@ mysqlnd_protocol__send_command( { enum_func_status ret = PASS; MYSQLND_PACKET_COMMAND * cmd_packet = NULL; - DBG_ENTER("send_command"); + DBG_ENTER("mysqlnd_protocol::send_command"); DBG_INF_FMT("command=%s silent=%u", mysqlnd_command_to_text[command], silent); DBG_INF_FMT("server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(upsert_status)); DBG_INF_FMT("sending %u bytes", arg_len + 1); /* + 1 is for the command */ @@ -2757,9 +2757,9 @@ mysqlnd_protocol__send_command( /* }}} */ -/* {{{ send_command_handle_OK */ +/* {{{ mysqlnd_protocol::send_command_handle_OK */ static enum_func_status -mysqlnd_protocol__send_command_handle_OK( +MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_OK)( MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory, MYSQLND_ERROR_INFO * const error_info, MYSQLND_UPSERT_STATUS * const upsert_status, @@ -2770,7 +2770,7 @@ mysqlnd_protocol__send_command_handle_OK( enum_func_status ret = FAIL; MYSQLND_PACKET_OK * ok_response = payload_decoder_factory->m.get_ok_packet(payload_decoder_factory, FALSE); - DBG_ENTER("send_command_handle_OK"); + DBG_ENTER("mysqlnd_protocol::send_command_handle_OK"); if (!ok_response) { SET_OOM_ERROR(error_info); DBG_RETURN(FAIL); @@ -2818,9 +2818,9 @@ end: /* }}} */ -/* {{{ send_command_handle_EOF */ +/* {{{ mysqlnd_protocol::send_command_handle_EOF */ static enum_func_status -mysqlnd_protocol__send_command_handle_EOF( +MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_EOF)( MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory, MYSQLND_ERROR_INFO * const error_info, MYSQLND_UPSERT_STATUS * const upsert_status) @@ -2828,7 +2828,7 @@ mysqlnd_protocol__send_command_handle_EOF( enum_func_status ret = FAIL; MYSQLND_PACKET_EOF * response = payload_decoder_factory->m.get_eof_packet(payload_decoder_factory, FALSE); - DBG_ENTER("send_command_handle_EOF"); + DBG_ENTER("mysqlnd_protocol::send_command_handle_EOF"); if (!response) { SET_OOM_ERROR(error_info); @@ -2861,7 +2861,7 @@ mysqlnd_protocol__send_command_handle_EOF( /* {{{ send_command_handle_response */ static enum_func_status -mysqlnd_protocol__send_command_handle_response( +MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_response)( MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory, const enum mysqlnd_packet_type ok_packet, const zend_bool silent, @@ -2876,7 +2876,7 @@ mysqlnd_protocol__send_command_handle_response( { enum_func_status ret = FAIL; - DBG_ENTER("send_command_handle_response"); + DBG_ENTER("mysqlnd_protocol::send_command_handle_response"); DBG_INF_FMT("silent=%u packet=%u command=%s", silent, ok_packet, mysqlnd_command_to_text[command]); switch (ok_packet) { @@ -2918,10 +2918,10 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_protocol_payload_decoder_factory) MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet), MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet), - mysqlnd_protocol__send_command, - mysqlnd_protocol__send_command_handle_response, - mysqlnd_protocol__send_command_handle_OK, - mysqlnd_protocol__send_command_handle_EOF, + MYSQLND_METHOD(mysqlnd_protocol, send_command), + MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_response), + MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_OK), + MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_EOF), MYSQLND_CLASS_METHODS_END; -- cgit v1.2.1 From e9f3139f438ef712d82b69984a65da4230fdfeb2 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 9 Nov 2015 14:56:16 +0100 Subject: MNDR: - split MYSQLND_NET into MYSQLND_NET and MYSQLND_VIO MYSQLND_NET is above MYSQLND_VIO. _NET takes care of protocol packet counting (even with compressed), while VIO is just about the network (or in case of windows, non-network, but PIPE) transport. --- ext/mysqlnd/mysqlnd_wireprotocol.c | 124 +++++++++++++++++++++++-------------- 1 file changed, 78 insertions(+), 46 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index be400654ac..e2fd68e5d3 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -245,14 +245,14 @@ end: /* {{{ mysqlnd_read_header */ static enum_func_status -mysqlnd_read_header(MYSQLND_NET * net, MYSQLND_PACKET_HEADER * header, +mysqlnd_read_header(MYSQLND_NET * net, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER * header, MYSQLND_STATS * conn_stats, MYSQLND_ERROR_INFO * error_info) { zend_uchar buffer[MYSQLND_HEADER_SIZE]; DBG_ENTER(mysqlnd_read_header_name); DBG_INF_FMT("compressed=%u", net->data->compressed); - if (FAIL == net->data->m.receive_ex(net, buffer, MYSQLND_HEADER_SIZE, conn_stats, error_info)) { + if (FAIL == net->data->m.receive(net, vio, buffer, MYSQLND_HEADER_SIZE, conn_stats, error_info)) { DBG_RETURN(FAIL); } @@ -290,6 +290,7 @@ mysqlnd_read_header(MYSQLND_NET * net, MYSQLND_PACKET_HEADER * header, static enum_func_status mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, MYSQLND_NET * net, + MYSQLND_VIO * vio, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info, MYSQLND_CONNECTION_STATE * connection_state, @@ -298,7 +299,7 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, { DBG_ENTER("mysqlnd_read_packet_header_and_body"); DBG_INF_FMT("buf=%p size=%u", buf, buf_size); - if (FAIL == mysqlnd_read_header(net, packet_header, stats, error_info)) { + if (FAIL == mysqlnd_read_header(net, vio, packet_header, stats, error_info)) { SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); @@ -310,7 +311,7 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, buf_size, packet_header->size, packet_header->size - buf_size); DBG_RETURN(FAIL); } - if (FAIL == net->data->m.receive_ex(net, buf, packet_header->size, stats, error_info)) { + if (FAIL == net->data->m.receive(net, vio, buf, packet_header->size, stats, error_info)) { SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); @@ -337,12 +338,13 @@ php_mysqlnd_greet_read(void * _packet) MYSQLND_PACKET_GREET *packet= (MYSQLND_PACKET_GREET *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; DBG_ENTER("php_mysqlnd_greet_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, sizeof(buf), "greeting", PROT_GREET_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, sizeof(buf), "greeting", PROT_GREET_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -505,6 +507,7 @@ size_t php_mysqlnd_auth_write(void * _packet) MYSQLND_CONN_DATA * conn = packet->header.conn; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -635,7 +638,7 @@ size_t php_mysqlnd_auth_write(void * _packet) DBG_RETURN(ret == PASS? (p - buffer - MYSQLND_HEADER_SIZE) : 0); } else { - size_t sent = net->data->m.send_ex(net, buffer, p - buffer - MYSQLND_HEADER_SIZE, stats, error_info); + size_t sent = net->data->m.send(net, vio, buffer, p - buffer - MYSQLND_HEADER_SIZE, stats, error_info); if (!sent) { SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); } @@ -666,11 +669,12 @@ php_mysqlnd_auth_response_read(void * _packet) register MYSQLND_PACKET_AUTH_RESPONSE * packet= (MYSQLND_PACKET_AUTH_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; zend_uchar local_buf[AUTH_RESP_BUFFER_SIZE]; - size_t buf_len = net->cmd_buffer.buffer? net->cmd_buffer.length: AUTH_RESP_BUFFER_SIZE; - zend_uchar *buf = net->cmd_buffer.buffer? (zend_uchar *) net->cmd_buffer.buffer : local_buf; + size_t buf_len = vio->cmd_buffer.buffer? vio->cmd_buffer.length: AUTH_RESP_BUFFER_SIZE; + zend_uchar *buf = vio->cmd_buffer.buffer? (zend_uchar *) vio->cmd_buffer.buffer : local_buf; zend_uchar *p = buf; zend_uchar *begin = buf; zend_ulong i; @@ -679,7 +683,7 @@ php_mysqlnd_auth_response_read(void * _packet) /* leave space for terminating safety \0 */ buf_len--; - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "OK", PROT_OK_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "OK", PROT_OK_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -792,9 +796,10 @@ php_mysqlnd_change_auth_response_write(void * _packet) MYSQLND_PACKET_CHANGE_AUTH_RESPONSE *packet= (MYSQLND_PACKET_CHANGE_AUTH_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; - zend_uchar * buffer = net->cmd_buffer.length >= packet->auth_data_len? net->cmd_buffer.buffer : mnd_emalloc(packet->auth_data_len); + zend_uchar * buffer = vio->cmd_buffer.length >= packet->auth_data_len? vio->cmd_buffer.buffer : mnd_emalloc(packet->auth_data_len); zend_uchar *p = buffer + MYSQLND_HEADER_SIZE; /* start after the header */ DBG_ENTER("php_mysqlnd_change_auth_response_write"); @@ -805,8 +810,8 @@ php_mysqlnd_change_auth_response_write(void * _packet) } { - size_t sent = net->data->m.send_ex(net, buffer, p - buffer - MYSQLND_HEADER_SIZE, stats, error_info); - if (buffer != net->cmd_buffer.buffer) { + size_t sent = net->data->m.send(net, vio, buffer, p - buffer - MYSQLND_HEADER_SIZE, stats, error_info); + if (buffer != vio->cmd_buffer.buffer) { mnd_efree(buffer); } if (!sent) { @@ -839,18 +844,19 @@ php_mysqlnd_ok_read(void * _packet) register MYSQLND_PACKET_OK *packet= (MYSQLND_PACKET_OK *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; zend_uchar local_buf[OK_BUFFER_SIZE]; - size_t buf_len = net->cmd_buffer.buffer? net->cmd_buffer.length : OK_BUFFER_SIZE; - zend_uchar *buf = net->cmd_buffer.buffer? (zend_uchar *) net->cmd_buffer.buffer : local_buf; + size_t buf_len = vio->cmd_buffer.buffer? vio->cmd_buffer.length : OK_BUFFER_SIZE; + zend_uchar *buf = vio->cmd_buffer.buffer? (zend_uchar *) vio->cmd_buffer.buffer : local_buf; zend_uchar *p = buf; zend_uchar *begin = buf; zend_ulong i; DBG_ENTER("php_mysqlnd_ok_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "OK", PROT_OK_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "OK", PROT_OK_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -936,16 +942,17 @@ php_mysqlnd_eof_read(void * _packet) MYSQLND_PACKET_EOF *packet= (MYSQLND_PACKET_EOF *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; - size_t buf_len = net->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; + size_t buf_len = vio->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; DBG_ENTER("php_mysqlnd_eof_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "EOF", PROT_EOF_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "EOF", PROT_EOF_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -1014,6 +1021,7 @@ size_t php_mysqlnd_cmd_write(void * _packet) MYSQLND_PACKET_COMMAND * packet= (MYSQLND_PACKET_COMMAND *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; unsigned int error_reporting = EG(error_reporting); @@ -1034,18 +1042,18 @@ size_t php_mysqlnd_cmd_write(void * _packet) MYSQLND_INC_CONN_STATISTIC(stats, STAT_PACKETS_SENT_CMD); #ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND - net->data->m.consume_uneaten_data(net, packet->command); + vio->data->m.consume_uneaten_data(vio, packet->command); #endif if (!packet->argument.s || !packet->argument.l) { zend_uchar buffer[MYSQLND_HEADER_SIZE + 1]; int1store(buffer + MYSQLND_HEADER_SIZE, packet->command); - sent = net->data->m.send_ex(net, buffer, 1, stats, error_info); + sent = net->data->m.send(net, vio, buffer, 1, stats, error_info); } else { size_t tmp_len = packet->argument.l + 1 + MYSQLND_HEADER_SIZE; zend_uchar *tmp, *p; - tmp = (tmp_len > net->cmd_buffer.length)? mnd_emalloc(tmp_len):net->cmd_buffer.buffer; + tmp = (tmp_len > vio->cmd_buffer.length)? mnd_emalloc(tmp_len):vio->cmd_buffer.buffer; if (!tmp) { goto end; } @@ -1056,8 +1064,8 @@ size_t php_mysqlnd_cmd_write(void * _packet) memcpy(p, packet->argument.s, packet->argument.l); - sent = net->data->m.send_ex(net, tmp, tmp_len - MYSQLND_HEADER_SIZE, stats, error_info); - if (tmp != net->cmd_buffer.buffer) { + sent = net->data->m.send(net, vio, tmp, tmp_len - MYSQLND_HEADER_SIZE, stats, error_info); + if (tmp != vio->cmd_buffer.buffer) { MYSQLND_INC_CONN_STATISTIC(stats, STAT_CMD_BUFFER_TOO_SMALL); mnd_efree(tmp); } @@ -1094,18 +1102,19 @@ php_mysqlnd_rset_header_read(void * _packet) MYSQLND_PACKET_RSET_HEADER * packet= (MYSQLND_PACKET_RSET_HEADER *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; enum_func_status ret = PASS; - size_t buf_len = net->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; + size_t buf_len = vio->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; size_t len; DBG_ENTER("php_mysqlnd_rset_header_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "resultset header", PROT_RSET_HEADER_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "resultset header", PROT_RSET_HEADER_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -1239,10 +1248,11 @@ php_mysqlnd_rset_field_read(void * _packet) MYSQLND_PACKET_RES_FIELD *packet = (MYSQLND_PACKET_RES_FIELD *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; - size_t buf_len = net->cmd_buffer.length, total_len = 0; - zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; + size_t buf_len = vio->cmd_buffer.length, total_len = 0; + zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; char *root_ptr; @@ -1252,7 +1262,7 @@ php_mysqlnd_rset_field_read(void * _packet) DBG_ENTER("php_mysqlnd_rset_field_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "field", PROT_RSET_FLD_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "field", PROT_RSET_FLD_PACKET)) { DBG_RETURN(FAIL); } @@ -1453,6 +1463,7 @@ void php_mysqlnd_rset_field_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_read_row_ex */ static enum_func_status php_mysqlnd_read_row_ex(MYSQLND_NET * net, + MYSQLND_VIO * vio, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info, MYSQLND_MEMORY_POOL * result_set_memory_pool, @@ -1477,7 +1488,7 @@ php_mysqlnd_read_row_ex(MYSQLND_NET * net, *data_size = prealloc_more_bytes; while (1) { - if (FAIL == mysqlnd_read_header(net, &header, stats, error_info)) { + if (FAIL == mysqlnd_read_header(net, vio, &header, stats, error_info)) { ret = FAIL; break; } @@ -1510,7 +1521,7 @@ php_mysqlnd_read_row_ex(MYSQLND_NET * net, p = (*buffer)->ptr + (*data_size - header.size); } - if (PASS != (ret = net->data->m.receive_ex(net, p, header.size, stats, error_info))) { + if (PASS != (ret = net->data->m.receive(net, vio, p, header.size, stats, error_info))) { DBG_ERR("Empty row packet body"); php_error(E_WARNING, "Empty row packet body"); break; @@ -1812,6 +1823,7 @@ php_mysqlnd_rowp_read(void * _packet) MYSQLND_PACKET_ROW *packet= (MYSQLND_PACKET_ROW *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; zend_uchar *p; enum_func_status ret = PASS; @@ -1825,7 +1837,7 @@ php_mysqlnd_rowp_read(void * _packet) post_alloc_for_bit_fields = packet->bit_fields_total_len + packet->bit_fields_count; } - ret = php_mysqlnd_read_row_ex(net, stats, error_info, + ret = php_mysqlnd_read_row_ex(net, vio, stats, error_info, packet->result_set_memory_pool, &packet->row_buffer, &data_size, packet->persistent_alloc, post_alloc_for_bit_fields ); @@ -1936,14 +1948,15 @@ php_mysqlnd_stats_read(void * _packet) MYSQLND_PACKET_STATS *packet= (MYSQLND_PACKET_STATS *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; - size_t buf_len = net->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; + size_t buf_len = vio->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; DBG_ENTER("php_mysqlnd_stats_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "statistics", PROT_STATS_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "statistics", PROT_STATS_PACKET)) { DBG_RETURN(FAIL); } @@ -1984,18 +1997,19 @@ php_mysqlnd_prepare_read(void * _packet) MYSQLND_PACKET_PREPARE_RESPONSE *packet= (MYSQLND_PACKET_PREPARE_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; /* In case of an error, we should have place to put it */ - size_t buf_len = net->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; + size_t buf_len = vio->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; unsigned int data_size; DBG_ENTER("php_mysqlnd_prepare_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "prepare", PROT_PREPARE_RESP_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "prepare", PROT_PREPARE_RESP_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -2078,17 +2092,18 @@ php_mysqlnd_chg_user_read(void * _packet) MYSQLND_PACKET_CHG_USER_RESPONSE *packet= (MYSQLND_PACKET_CHG_USER_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; /* There could be an error message */ - size_t buf_len = net->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) net->cmd_buffer.buffer; + size_t buf_len = vio->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; zend_uchar *p = buf; zend_uchar *begin = buf; DBG_ENTER("php_mysqlnd_chg_user_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, buf_len, "change user response", PROT_CHG_USER_RESP_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "change user response", PROT_CHG_USER_RESP_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -2172,6 +2187,7 @@ size_t php_mysqlnd_sha256_pk_request_write(void * _packet) MYSQLND_PACKET_SHA256_PK_REQUEST * packet = (MYSQLND_PACKET_SHA256_PK_REQUEST *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; zend_uchar buffer[MYSQLND_HEADER_SIZE + 1]; size_t sent; @@ -2179,7 +2195,7 @@ size_t php_mysqlnd_sha256_pk_request_write(void * _packet) DBG_ENTER("php_mysqlnd_sha256_pk_request_write"); int1store(buffer + MYSQLND_HEADER_SIZE, '\1'); - sent = net->data->m.send_ex(net, buffer, 1, stats, error_info); + sent = net->data->m.send(net, vio, buffer, 1, stats, error_info); DBG_RETURN(sent); } @@ -2207,6 +2223,7 @@ php_mysqlnd_sha256_pk_request_response_read(void * _packet) MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE * packet= (MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_NET * net = packet->header.net; + MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; zend_uchar buf[SHA256_PK_REQUEST_RESP_BUFFER_SIZE]; @@ -2216,7 +2233,7 @@ php_mysqlnd_sha256_pk_request_response_read(void * _packet) DBG_ENTER("php_mysqlnd_sha256_pk_request_response_read"); /* leave space for terminating safety \0 */ - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, stats, error_info, connection_state, buf, sizeof(buf), "SHA256_PK_REQUEST_RESPONSE", PROT_SHA256_PK_REQUEST_RESPONSE_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, sizeof(buf), "SHA256_PK_REQUEST_RESPONSE", PROT_SHA256_PK_REQUEST_RESPONSE_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -2367,6 +2384,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECO packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2390,6 +2408,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECOD packet->header.conn = factory->conn; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2412,6 +2431,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet)(MYSQLND_PROTOCOL_PAYL packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2434,6 +2454,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet)(MYSQLND_PROTOC packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2456,6 +2477,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2478,6 +2500,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODE packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2500,6 +2523,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL_PAYLOAD_DE packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2522,6 +2546,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL_PAYLOA packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2544,6 +2569,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL_PAYLO packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2567,6 +2593,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODE packet->header.conn = factory->conn; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2589,6 +2616,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECO packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2611,6 +2639,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL_P packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2633,6 +2662,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOC packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2655,6 +2685,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet)(MYSQLND_PROTOCOL_ packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -2677,6 +2708,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_ packet->header.factory = factory; packet->header.net = factory->conn->net; + packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; packet->header.connection_state = &factory->conn->state; @@ -4138,9 +4170,9 @@ mysqlnd_com_enable_ssl_run(void *cmd) goto close_conn; } - conn->net->data->m.set_client_option(conn->net, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, (const char *) &verify); + conn->vio->data->m.set_client_option(conn->vio, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, (const char *) &verify); - if (FAIL == conn->net->data->m.enable_ssl(conn->net)) { + if (FAIL == conn->vio->data->m.enable_ssl(conn->vio)) { goto end; } } @@ -4221,7 +4253,7 @@ mysqlnd_com_handshake_run(void *cmd) MYSQLND_PACKET_GREET * greet_packet; DBG_ENTER("mysqlnd_conn_data::connect_handshake"); - DBG_INF_FMT("stream=%p", conn->net->data->m.get_stream(conn->net)); + DBG_INF_FMT("stream=%p", conn->vio->data->m.get_stream(conn->vio)); DBG_INF_FMT("[user=%s] [db=%s:%d] [flags=%llu]", user, db, db_len, mysql_flags); greet_packet = conn->payload_decoder_factory->m.get_greet_packet(conn->payload_decoder_factory, FALSE); -- cgit v1.2.1 From 80d59a3a362052cfa5767f99dcd3954182947c55 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 9 Nov 2015 15:53:42 +0100 Subject: MNDR: - intermediate step to move MYSQLND_NET from mysqlnd_vio.c to mysqlnd_wireprotocol.c In following commits MYSQLND_NET's methods and data will be moved to MYSQLND_PROTOCOL --- ext/mysqlnd/mysqlnd_wireprotocol.c | 512 +++++++++++++++++++++++++++++++++++++ 1 file changed, 512 insertions(+) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index e2fd68e5d3..7199178b2c 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -27,6 +27,9 @@ #include "mysqlnd_statistics.h" #include "mysqlnd_debug.h" #include "zend_ini.h" +#ifdef MYSQLND_COMPRESSION_ENABLED +#include +#endif #define MYSQLND_SILENT 1 #define MYSQLND_DUMP_HEADER_N_BODY @@ -2933,6 +2936,515 @@ MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_response)( +/* {{{ mysqlnd_net::connect */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, connect)(MYSQLND_NET * const net, const MYSQLND_CSTRING scheme, const zend_bool persistent, + MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info) +{ + DBG_ENTER("mysqlnd_net::connect"); + net->packet_no = net->compressed_envelope_packet_no = 0; + DBG_RETURN(PASS); +} +/* }}} */ + + +/* We assume that MYSQLND_HEADER_SIZE is 4 bytes !! */ +#define COPY_HEADER(T,A) do { \ + *(((char *)(T))) = *(((char *)(A)));\ + *(((char *)(T))+1) = *(((char *)(A))+1);\ + *(((char *)(T))+2) = *(((char *)(A))+2);\ + *(((char *)(T))+3) = *(((char *)(A))+3); } while (0) +#define STORE_HEADER_SIZE(safe_storage, buffer) COPY_HEADER((safe_storage), (buffer)) +#define RESTORE_HEADER_SIZE(buffer, safe_storage) STORE_HEADER_SIZE((safe_storage), (buffer)) + + +/* {{{ mysqlnd_net::send */ +/* + IMPORTANT : It's expected that buffer has place in the beginning for MYSQLND_HEADER_SIZE !!!! + This is done for performance reasons in the caller of this function. + Otherwise we will have to do send two TCP packets, or do new alloc and memcpy. + Neither are quick, thus the clients of this function are obligated to do + what they are asked for. + + `count` is actually the length of the payload data. Thus : + count + MYSQLND_HEADER_SIZE = sizeof(buffer) (not the pointer but the actual buffer) +*/ +static size_t +MYSQLND_METHOD(mysqlnd_net, send)(MYSQLND_NET * const net, MYSQLND_VIO * const vio, zend_uchar * const buffer, const size_t count, + MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info) +{ + zend_uchar safe_buf[((MYSQLND_HEADER_SIZE) + (sizeof(zend_uchar)) - 1) / (sizeof(zend_uchar))]; + zend_uchar * safe_storage = safe_buf; + size_t bytes_sent, packets_sent = 1; + size_t left = count; + zend_uchar * p = (zend_uchar *) buffer; + zend_uchar * compress_buf = NULL; + size_t to_be_sent; + + DBG_ENTER("mysqlnd_net::send"); + DBG_INF_FMT("count=" MYSQLND_SZ_T_SPEC " compression=%u", count, net->data->compressed); + + if (net->data->compressed == TRUE) { + size_t comp_buf_size = MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE + MYSQLND_HEADER_SIZE + MIN(left, MYSQLND_MAX_PACKET_SIZE); + DBG_INF_FMT("compress_buf_size="MYSQLND_SZ_T_SPEC, comp_buf_size); + compress_buf = mnd_emalloc(comp_buf_size); + } + + do { + to_be_sent = MIN(left, MYSQLND_MAX_PACKET_SIZE); + DBG_INF_FMT("to_be_sent=%u", to_be_sent); + DBG_INF_FMT("packets_sent=%u", packets_sent); + DBG_INF_FMT("compressed_envelope_packet_no=%u", net->compressed_envelope_packet_no); + DBG_INF_FMT("packet_no=%u", net->packet_no); +#ifdef MYSQLND_COMPRESSION_ENABLED + if (net->data->compressed == TRUE) { + /* here we need to compress the data and then write it, first comes the compressed header */ + size_t tmp_complen = to_be_sent; + size_t payload_size; + zend_uchar * uncompressed_payload = p; /* should include the header */ + + STORE_HEADER_SIZE(safe_storage, uncompressed_payload); + int3store(uncompressed_payload, to_be_sent); + int1store(uncompressed_payload + 3, net->packet_no); + if (PASS == net->data->m.encode((compress_buf + COMPRESSED_HEADER_SIZE + MYSQLND_HEADER_SIZE), &tmp_complen, + uncompressed_payload, to_be_sent + MYSQLND_HEADER_SIZE)) + { + int3store(compress_buf + MYSQLND_HEADER_SIZE, to_be_sent + MYSQLND_HEADER_SIZE); + payload_size = tmp_complen; + } else { + int3store(compress_buf + MYSQLND_HEADER_SIZE, 0); + memcpy(compress_buf + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE, uncompressed_payload, to_be_sent + MYSQLND_HEADER_SIZE); + payload_size = to_be_sent + MYSQLND_HEADER_SIZE; + } + RESTORE_HEADER_SIZE(uncompressed_payload, safe_storage); + + int3store(compress_buf, payload_size); + int1store(compress_buf + 3, net->packet_no); + DBG_INF_FMT("writing "MYSQLND_SZ_T_SPEC" bytes to the network", payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE); + bytes_sent = vio->data->m.network_write(vio, compress_buf, payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE, conn_stats, error_info); + net->compressed_envelope_packet_no++; + #if WHEN_WE_NEED_TO_CHECK_WHETHER_COMPRESSION_WORKS_CORRECTLY + if (res == Z_OK) { + size_t decompressed_size = left + MYSQLND_HEADER_SIZE; + zend_uchar * decompressed_data = mnd_malloc(decompressed_size); + int error = net->data->m.decode(decompressed_data, decompressed_size, + compress_buf + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE, payload_size); + if (error == Z_OK) { + int i; + DBG_INF("success decompressing"); + for (i = 0 ; i < decompressed_size; i++) { + if (i && (i % 30 == 0)) { + printf("\n\t\t"); + } + printf("%.2X ", (int)*((char*)&(decompressed_data[i]))); + DBG_INF_FMT("%.2X ", (int)*((char*)&(decompressed_data[i]))); + } + } else { + DBG_INF("error decompressing"); + } + mnd_free(decompressed_data); + } + #endif /* WHEN_WE_NEED_TO_CHECK_WHETHER_COMPRESSION_WORKS_CORRECTLY */ + } else +#endif /* MYSQLND_COMPRESSION_ENABLED */ + { + DBG_INF("no compression"); + STORE_HEADER_SIZE(safe_storage, p); + int3store(p, to_be_sent); + int1store(p + 3, net->packet_no); + bytes_sent = vio->data->m.network_write(vio, p, to_be_sent + MYSQLND_HEADER_SIZE, conn_stats, error_info); + RESTORE_HEADER_SIZE(p, safe_storage); + net->compressed_envelope_packet_no++; + } + net->packet_no++; + + p += to_be_sent; + left -= to_be_sent; + packets_sent++; + /* + if left is 0 then there is nothing more to send, but if the last packet was exactly + with the size MYSQLND_MAX_PACKET_SIZE we need to send additional packet, which has + empty payload. Thus if left == 0 we check for to_be_sent being the max size. If it is + indeed it then loop once more, then to_be_sent will become 0, left will stay 0. Empty + packet will be sent and this loop will end. + */ + } while (bytes_sent && (left > 0 || to_be_sent == MYSQLND_MAX_PACKET_SIZE)); + + DBG_INF_FMT("packet_size="MYSQLND_SZ_T_SPEC" packet_no=%u", left, net->packet_no); + + MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn_stats, + STAT_BYTES_SENT, count + packets_sent * MYSQLND_HEADER_SIZE, + STAT_PROTOCOL_OVERHEAD_OUT, packets_sent * MYSQLND_HEADER_SIZE, + STAT_PACKETS_SENT, packets_sent); + + if (compress_buf) { + mnd_efree(compress_buf); + } + + /* Even for zero size payload we have to send a packet */ + if (!bytes_sent) { + DBG_ERR_FMT("Can't %u send bytes", count); + SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); + } + DBG_RETURN(bytes_sent); +} +/* }}} */ + + +#ifdef MYSQLND_COMPRESSION_ENABLED +/* {{{ php_mysqlnd_read_buffer_is_empty */ +static zend_bool +php_mysqlnd_read_buffer_is_empty(MYSQLND_READ_BUFFER * buffer) +{ + return buffer->len? FALSE:TRUE; +} +/* }}} */ + + +/* {{{ php_mysqlnd_read_buffer_read */ +static void +php_mysqlnd_read_buffer_read(MYSQLND_READ_BUFFER * buffer, size_t count, zend_uchar * dest) +{ + if (buffer->len >= count) { + memcpy(dest, buffer->data + buffer->offset, count); + buffer->offset += count; + buffer->len -= count; + } +} +/* }}} */ + + +/* {{{ php_mysqlnd_read_buffer_bytes_left */ +static size_t +php_mysqlnd_read_buffer_bytes_left(MYSQLND_READ_BUFFER * buffer) +{ + return buffer->len; +} +/* }}} */ + + +/* {{{ php_mysqlnd_read_buffer_free */ +static void +php_mysqlnd_read_buffer_free(MYSQLND_READ_BUFFER ** buffer) +{ + DBG_ENTER("php_mysqlnd_read_buffer_free"); + if (*buffer) { + mnd_efree((*buffer)->data); + mnd_efree(*buffer); + *buffer = NULL; + } + DBG_VOID_RETURN; +} +/* }}} */ + + +/* {{{ php_mysqlnd_create_read_buffer */ +static MYSQLND_READ_BUFFER * +mysqlnd_create_read_buffer(size_t count) +{ + MYSQLND_READ_BUFFER * ret = mnd_emalloc(sizeof(MYSQLND_READ_BUFFER)); + DBG_ENTER("mysqlnd_create_read_buffer"); + ret->is_empty = php_mysqlnd_read_buffer_is_empty; + ret->read = php_mysqlnd_read_buffer_read; + ret->bytes_left = php_mysqlnd_read_buffer_bytes_left; + ret->free_buffer = php_mysqlnd_read_buffer_free; + ret->data = mnd_emalloc(count); + ret->size = ret->len = count; + ret->offset = 0; + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_net::read_compressed_packet_from_stream_and_fill_read_buffer */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, read_compressed_packet_from_stream_and_fill_read_buffer) + (MYSQLND_NET * net, MYSQLND_VIO * vio, size_t net_payload_size, MYSQLND_STATS * conn_stats, MYSQLND_ERROR_INFO * error_info) +{ + size_t decompressed_size; + enum_func_status retval = PASS; + zend_uchar * compressed_data = NULL; + zend_uchar comp_header[COMPRESSED_HEADER_SIZE]; + DBG_ENTER("mysqlnd_net::read_compressed_packet_from_stream_and_fill_read_buffer"); + + /* Read the compressed header */ + if (FAIL == vio->data->m.network_read(vio, comp_header, COMPRESSED_HEADER_SIZE, conn_stats, error_info)) { + DBG_RETURN(FAIL); + } + decompressed_size = uint3korr(comp_header); + + /* When decompressed_size is 0, then the data is not compressed, and we have wasted 3 bytes */ + /* we need to decompress the data */ + + if (decompressed_size) { + compressed_data = mnd_emalloc(net_payload_size); + if (FAIL == vio->data->m.network_read(vio, compressed_data, net_payload_size, conn_stats, error_info)) { + retval = FAIL; + goto end; + } + net->uncompressed_data = mysqlnd_create_read_buffer(decompressed_size); + retval = net->data->m.decode(net->uncompressed_data->data, decompressed_size, compressed_data, net_payload_size); + if (FAIL == retval) { + goto end; + } + } else { + DBG_INF_FMT("The server decided not to compress the data. Our job is easy. Copying %u bytes", net_payload_size); + net->uncompressed_data = mysqlnd_create_read_buffer(net_payload_size); + if (FAIL == vio->data->m.network_read(vio, net->uncompressed_data->data, net_payload_size, conn_stats, error_info)) { + retval = FAIL; + goto end; + } + } +end: + if (compressed_data) { + mnd_efree(compressed_data); + } + DBG_RETURN(retval); +} +/* }}} */ +#endif /* MYSQLND_COMPRESSION_ENABLED */ + + +/* {{{ mysqlnd_net::decode */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, decode)(zend_uchar * uncompressed_data, const size_t uncompressed_data_len, + const zend_uchar * const compressed_data, const size_t compressed_data_len) +{ +#ifdef MYSQLND_COMPRESSION_ENABLED + int error; + uLongf tmp_complen = uncompressed_data_len; + DBG_ENTER("mysqlnd_net::decode"); + error = uncompress(uncompressed_data, &tmp_complen, compressed_data, compressed_data_len); + + DBG_INF_FMT("compressed data: decomp_len=%lu compressed_size="MYSQLND_SZ_T_SPEC, tmp_complen, compressed_data_len); + if (error != Z_OK) { + DBG_INF_FMT("decompression NOT successful. error=%d Z_OK=%d Z_BUF_ERROR=%d Z_MEM_ERROR=%d", error, Z_OK, Z_BUF_ERROR, Z_MEM_ERROR); + } + DBG_RETURN(error == Z_OK? PASS:FAIL); +#else + DBG_ENTER("mysqlnd_net::decode"); + DBG_RETURN(FAIL); +#endif +} +/* }}} */ + + +/* {{{ mysqlnd_net::encode */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, encode)(zend_uchar * compress_buffer, size_t * compress_buffer_len, + const zend_uchar * const uncompressed_data, const size_t uncompressed_data_len) +{ +#ifdef MYSQLND_COMPRESSION_ENABLED + int error; + uLongf tmp_complen = *compress_buffer_len; + DBG_ENTER("mysqlnd_net::encode"); + error = compress(compress_buffer, &tmp_complen, uncompressed_data, uncompressed_data_len); + + if (error != Z_OK) { + DBG_INF_FMT("compression NOT successful. error=%d Z_OK=%d Z_BUF_ERROR=%d Z_MEM_ERROR=%d", error, Z_OK, Z_BUF_ERROR, Z_MEM_ERROR); + } else { + *compress_buffer_len = tmp_complen; + DBG_INF_FMT("compression successful. compressed size=%lu", tmp_complen); + } + + DBG_RETURN(error == Z_OK? PASS:FAIL); +#else + DBG_ENTER("mysqlnd_net::encode"); + DBG_RETURN(FAIL); +#endif +} +/* }}} */ + + +/* {{{ mysqlnd_net::receive */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, receive)(MYSQLND_NET * const net, MYSQLND_VIO * const vio, zend_uchar * const buffer, const size_t count, + MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info) +{ + size_t to_read = count; + zend_uchar * p = buffer; + + DBG_ENTER("mysqlnd_net::receive"); +#ifdef MYSQLND_COMPRESSION_ENABLED + if (net->data->compressed) { + if (net->uncompressed_data) { + size_t to_read_from_buffer = MIN(net->uncompressed_data->bytes_left(net->uncompressed_data), to_read); + DBG_INF_FMT("reading "MYSQLND_SZ_T_SPEC" from uncompressed_data buffer", to_read_from_buffer); + if (to_read_from_buffer) { + net->uncompressed_data->read(net->uncompressed_data, to_read_from_buffer, (zend_uchar *) p); + p += to_read_from_buffer; + to_read -= to_read_from_buffer; + } + DBG_INF_FMT("left "MYSQLND_SZ_T_SPEC" to read", to_read); + if (TRUE == net->uncompressed_data->is_empty(net->uncompressed_data)) { + /* Everything was consumed. This should never happen here, but for security */ + net->uncompressed_data->free_buffer(&net->uncompressed_data); + } + } + if (to_read) { + zend_uchar net_header[MYSQLND_HEADER_SIZE]; + size_t net_payload_size; + zend_uchar packet_no; + + if (FAIL == vio->data->m.network_read(vio, net_header, MYSQLND_HEADER_SIZE, conn_stats, error_info)) { + DBG_RETURN(FAIL); + } + net_payload_size = uint3korr(net_header); + packet_no = uint1korr(net_header + 3); + if (net->compressed_envelope_packet_no != packet_no) { + DBG_ERR_FMT("Transport level: packets out of order. Expected %u received %u. Packet size="MYSQLND_SZ_T_SPEC, + net->compressed_envelope_packet_no, packet_no, net_payload_size); + + php_error(E_WARNING, "Packets out of order. Expected %u received %u. Packet size="MYSQLND_SZ_T_SPEC, + net->compressed_envelope_packet_no, packet_no, net_payload_size); + DBG_RETURN(FAIL); + } + net->compressed_envelope_packet_no++; +#ifdef MYSQLND_DUMP_HEADER_N_BODY + DBG_INF_FMT("HEADER: hwd_packet_no=%u size=%3u", packet_no, (zend_ulong) net_payload_size); +#endif + /* Now let's read from the wire, decompress it and fill the read buffer */ + net->data->m.read_compressed_packet_from_stream_and_fill_read_buffer(net, vio, net_payload_size, conn_stats, error_info); + + /* + Now a bit of recursion - read from the read buffer, + if the data which we have just read from the wire + is not enough, then the recursive call will try to + satisfy it until it is satisfied. + */ + DBG_RETURN(net->data->m.receive(net, vio, p, to_read, conn_stats, error_info)); + } + DBG_RETURN(PASS); + } +#endif /* MYSQLND_COMPRESSION_ENABLED */ + DBG_RETURN(vio->data->m.network_read(vio, p, to_read, conn_stats, error_info)); +} +/* }}} */ + + +/* {{{ mysqlnd_net::set_client_option */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, set_client_option)(MYSQLND_NET * const net, enum_mysqlnd_client_option option, const char * const value) +{ + DBG_ENTER("mysqlnd_net::set_client_option"); + DBG_INF_FMT("option=%u", option); + switch (option) { + case MYSQL_OPT_COMPRESS: + net->data->options.flags |= MYSQLND_NET_FLAG_USE_COMPRESSION; + break; + case MYSQL_SERVER_PUBLIC_KEY: + { + zend_bool pers = net->persistent; + if (net->data->options.sha256_server_public_key) { + mnd_pefree(net->data->options.sha256_server_public_key, pers); + } + net->data->options.sha256_server_public_key = value? mnd_pestrdup(value, pers) : NULL; + break; + } + default: + DBG_RETURN(FAIL); + } + DBG_RETURN(PASS); +} +/* }}} */ + + +/* {{{ mysqlnd_net::free_contents */ +static void +MYSQLND_METHOD(mysqlnd_net, free_contents)(MYSQLND_NET * net) +{ + zend_bool pers = net->persistent; + DBG_ENTER("mysqlnd_net::free_contents"); + +#ifdef MYSQLND_COMPRESSION_ENABLED + if (net->uncompressed_data) { + net->uncompressed_data->free_buffer(&net->uncompressed_data); + } +#endif + if (net->data->options.sha256_server_public_key) { + mnd_pefree(net->data->options.sha256_server_public_key, pers); + net->data->options.sha256_server_public_key = NULL; + } + + DBG_VOID_RETURN; +} +/* }}} */ + + +/* {{{ mysqlnd_net::init */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, init)(MYSQLND_NET * const net, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info) +{ + return PASS; +} +/* }}} */ + + +/* {{{ mysqlnd_net::dtor */ +static void +MYSQLND_METHOD(mysqlnd_net, dtor)(MYSQLND_NET * const net, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info) +{ + DBG_ENTER("mysqlnd_net::dtor"); + if (net) { + net->data->m.free_contents(net); + + mnd_pefree(net->data, net->data->persistent); + mnd_pefree(net, net->persistent); + } + DBG_VOID_RETURN; +} +/* }}} */ + + +MYSQLND_CLASS_METHODS_START(mysqlnd_net) + MYSQLND_METHOD(mysqlnd_net, init), + MYSQLND_METHOD(mysqlnd_net, dtor), + MYSQLND_METHOD(mysqlnd_net, connect), + + MYSQLND_METHOD(mysqlnd_net, set_client_option), + + MYSQLND_METHOD(mysqlnd_net, decode), + MYSQLND_METHOD(mysqlnd_net, encode), + + MYSQLND_METHOD(mysqlnd_net, send), + MYSQLND_METHOD(mysqlnd_net, receive), + +#ifdef MYSQLND_COMPRESSION_ENABLED + MYSQLND_METHOD(mysqlnd_net, read_compressed_packet_from_stream_and_fill_read_buffer), +#else + NULL, +#endif + + MYSQLND_METHOD(mysqlnd_net, free_contents), +MYSQLND_CLASS_METHODS_END; + + +/* {{{ mysqlnd_net_init */ +PHPAPI MYSQLND_NET * +mysqlnd_net_init(zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info) +{ + MYSQLND_NET * net; + DBG_ENTER("mysqlnd_net_init"); + net = MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory).get_net(persistent, stats, error_info); + DBG_RETURN(net); +} +/* }}} */ + + +/* {{{ mysqlnd_net_free */ +PHPAPI void +mysqlnd_net_free(MYSQLND_NET * const net, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info) +{ + DBG_ENTER("mysqlnd_net_free"); + if (net) { + net->data->m.dtor(net, stats, error_info); + } + DBG_VOID_RETURN; +} +/* }}} */ + + + MYSQLND_CLASS_METHODS_START(mysqlnd_protocol_payload_decoder_factory) MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet), MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet), -- cgit v1.2.1 From 654d1a7caf068c67560fd49c86cf6f6354322d6f Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Tue, 10 Nov 2015 11:02:33 +0100 Subject: MNDR: - rename MYSQLND_NET to MYSQLND_PPEC (protocol packet envelope codec). PPEC does only the encoding and decoding to the protocol frame. --- ext/mysqlnd/mysqlnd_wireprotocol.c | 138 ++++++++++++++++++------------------- 1 file changed, 69 insertions(+), 69 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 7199178b2c..86a160bc6b 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -248,7 +248,7 @@ end: /* {{{ mysqlnd_read_header */ static enum_func_status -mysqlnd_read_header(MYSQLND_NET * net, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER * header, +mysqlnd_read_header(MYSQLND_PPEC * net, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER * header, MYSQLND_STATS * conn_stats, MYSQLND_ERROR_INFO * error_info) { zend_uchar buffer[MYSQLND_HEADER_SIZE]; @@ -292,7 +292,7 @@ mysqlnd_read_header(MYSQLND_NET * net, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER /* {{{ mysqlnd_read_packet_header_and_body */ static enum_func_status mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, - MYSQLND_NET * net, + MYSQLND_PPEC * net, MYSQLND_VIO * vio, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info, @@ -340,7 +340,7 @@ php_mysqlnd_greet_read(void * _packet) zend_uchar *pad_start = NULL; MYSQLND_PACKET_GREET *packet= (MYSQLND_PACKET_GREET *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -509,7 +509,7 @@ size_t php_mysqlnd_auth_write(void * _packet) MYSQLND_PACKET_AUTH * packet= (MYSQLND_PACKET_AUTH *) _packet; MYSQLND_CONN_DATA * conn = packet->header.conn; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -671,7 +671,7 @@ php_mysqlnd_auth_response_read(void * _packet) { register MYSQLND_PACKET_AUTH_RESPONSE * packet= (MYSQLND_PACKET_AUTH_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -798,7 +798,7 @@ php_mysqlnd_change_auth_response_write(void * _packet) { MYSQLND_PACKET_CHANGE_AUTH_RESPONSE *packet= (MYSQLND_PACKET_CHANGE_AUTH_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -846,7 +846,7 @@ php_mysqlnd_ok_read(void * _packet) { register MYSQLND_PACKET_OK *packet= (MYSQLND_PACKET_OK *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -944,7 +944,7 @@ php_mysqlnd_eof_read(void * _packet) */ MYSQLND_PACKET_EOF *packet= (MYSQLND_PACKET_EOF *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -1023,7 +1023,7 @@ size_t php_mysqlnd_cmd_write(void * _packet) /* Let's have some space, which we can use, if not enough, we will allocate new buffer */ MYSQLND_PACKET_COMMAND * packet= (MYSQLND_PACKET_COMMAND *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -1104,7 +1104,7 @@ php_mysqlnd_rset_header_read(void * _packet) { MYSQLND_PACKET_RSET_HEADER * packet= (MYSQLND_PACKET_RSET_HEADER *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -1250,7 +1250,7 @@ php_mysqlnd_rset_field_read(void * _packet) /* Should be enough for the metadata of a single row */ MYSQLND_PACKET_RES_FIELD *packet = (MYSQLND_PACKET_RES_FIELD *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -1465,7 +1465,7 @@ void php_mysqlnd_rset_field_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_read_row_ex */ static enum_func_status -php_mysqlnd_read_row_ex(MYSQLND_NET * net, +php_mysqlnd_read_row_ex(MYSQLND_PPEC * net, MYSQLND_VIO * vio, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info, @@ -1825,7 +1825,7 @@ php_mysqlnd_rowp_read(void * _packet) { MYSQLND_PACKET_ROW *packet= (MYSQLND_PACKET_ROW *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; zend_uchar *p; @@ -1950,7 +1950,7 @@ php_mysqlnd_stats_read(void * _packet) { MYSQLND_PACKET_STATS *packet= (MYSQLND_PACKET_STATS *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -1999,7 +1999,7 @@ php_mysqlnd_prepare_read(void * _packet) { MYSQLND_PACKET_PREPARE_RESPONSE *packet= (MYSQLND_PACKET_PREPARE_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -2094,7 +2094,7 @@ php_mysqlnd_chg_user_read(void * _packet) { MYSQLND_PACKET_CHG_USER_RESPONSE *packet= (MYSQLND_PACKET_CHG_USER_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -2189,7 +2189,7 @@ size_t php_mysqlnd_sha256_pk_request_write(void * _packet) { MYSQLND_PACKET_SHA256_PK_REQUEST * packet = (MYSQLND_PACKET_SHA256_PK_REQUEST *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; zend_uchar buffer[MYSQLND_HEADER_SIZE + 1]; @@ -2225,7 +2225,7 @@ php_mysqlnd_sha256_pk_request_response_read(void * _packet) { MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE * packet= (MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_NET * net = packet->header.net; + MYSQLND_PPEC * net = packet->header.net; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -2936,12 +2936,12 @@ MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_response)( -/* {{{ mysqlnd_net::connect */ +/* {{{ mysqlnd_ppec::connect */ static enum_func_status -MYSQLND_METHOD(mysqlnd_net, connect)(MYSQLND_NET * const net, const MYSQLND_CSTRING scheme, const zend_bool persistent, +MYSQLND_METHOD(mysqlnd_ppec, connect)(MYSQLND_PPEC * const net, const MYSQLND_CSTRING scheme, const zend_bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info) { - DBG_ENTER("mysqlnd_net::connect"); + DBG_ENTER("mysqlnd_ppec::connect"); net->packet_no = net->compressed_envelope_packet_no = 0; DBG_RETURN(PASS); } @@ -2958,7 +2958,7 @@ MYSQLND_METHOD(mysqlnd_net, connect)(MYSQLND_NET * const net, const MYSQLND_CSTR #define RESTORE_HEADER_SIZE(buffer, safe_storage) STORE_HEADER_SIZE((safe_storage), (buffer)) -/* {{{ mysqlnd_net::send */ +/* {{{ mysqlnd_ppec::send */ /* IMPORTANT : It's expected that buffer has place in the beginning for MYSQLND_HEADER_SIZE !!!! This is done for performance reasons in the caller of this function. @@ -2970,7 +2970,7 @@ MYSQLND_METHOD(mysqlnd_net, connect)(MYSQLND_NET * const net, const MYSQLND_CSTR count + MYSQLND_HEADER_SIZE = sizeof(buffer) (not the pointer but the actual buffer) */ static size_t -MYSQLND_METHOD(mysqlnd_net, send)(MYSQLND_NET * const net, MYSQLND_VIO * const vio, zend_uchar * const buffer, const size_t count, +MYSQLND_METHOD(mysqlnd_ppec, send)(MYSQLND_PPEC * const net, MYSQLND_VIO * const vio, zend_uchar * const buffer, const size_t count, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info) { zend_uchar safe_buf[((MYSQLND_HEADER_SIZE) + (sizeof(zend_uchar)) - 1) / (sizeof(zend_uchar))]; @@ -2981,7 +2981,7 @@ MYSQLND_METHOD(mysqlnd_net, send)(MYSQLND_NET * const net, MYSQLND_VIO * const v zend_uchar * compress_buf = NULL; size_t to_be_sent; - DBG_ENTER("mysqlnd_net::send"); + DBG_ENTER("mysqlnd_ppec::send"); DBG_INF_FMT("count=" MYSQLND_SZ_T_SPEC " compression=%u", count, net->data->compressed); if (net->data->compressed == TRUE) { @@ -3156,16 +3156,16 @@ mysqlnd_create_read_buffer(size_t count) /* }}} */ -/* {{{ mysqlnd_net::read_compressed_packet_from_stream_and_fill_read_buffer */ +/* {{{ mysqlnd_ppec::read_compressed_packet_from_stream_and_fill_read_buffer */ static enum_func_status -MYSQLND_METHOD(mysqlnd_net, read_compressed_packet_from_stream_and_fill_read_buffer) - (MYSQLND_NET * net, MYSQLND_VIO * vio, size_t net_payload_size, MYSQLND_STATS * conn_stats, MYSQLND_ERROR_INFO * error_info) +MYSQLND_METHOD(mysqlnd_ppec, read_compressed_packet_from_stream_and_fill_read_buffer) + (MYSQLND_PPEC * net, MYSQLND_VIO * vio, size_t net_payload_size, MYSQLND_STATS * conn_stats, MYSQLND_ERROR_INFO * error_info) { size_t decompressed_size; enum_func_status retval = PASS; zend_uchar * compressed_data = NULL; zend_uchar comp_header[COMPRESSED_HEADER_SIZE]; - DBG_ENTER("mysqlnd_net::read_compressed_packet_from_stream_and_fill_read_buffer"); + DBG_ENTER("mysqlnd_ppec::read_compressed_packet_from_stream_and_fill_read_buffer"); /* Read the compressed header */ if (FAIL == vio->data->m.network_read(vio, comp_header, COMPRESSED_HEADER_SIZE, conn_stats, error_info)) { @@ -3205,15 +3205,15 @@ end: #endif /* MYSQLND_COMPRESSION_ENABLED */ -/* {{{ mysqlnd_net::decode */ +/* {{{ mysqlnd_ppec::decode */ static enum_func_status -MYSQLND_METHOD(mysqlnd_net, decode)(zend_uchar * uncompressed_data, const size_t uncompressed_data_len, +MYSQLND_METHOD(mysqlnd_ppec, decode)(zend_uchar * uncompressed_data, const size_t uncompressed_data_len, const zend_uchar * const compressed_data, const size_t compressed_data_len) { #ifdef MYSQLND_COMPRESSION_ENABLED int error; uLongf tmp_complen = uncompressed_data_len; - DBG_ENTER("mysqlnd_net::decode"); + DBG_ENTER("mysqlnd_ppec::decode"); error = uncompress(uncompressed_data, &tmp_complen, compressed_data, compressed_data_len); DBG_INF_FMT("compressed data: decomp_len=%lu compressed_size="MYSQLND_SZ_T_SPEC, tmp_complen, compressed_data_len); @@ -3222,22 +3222,22 @@ MYSQLND_METHOD(mysqlnd_net, decode)(zend_uchar * uncompressed_data, const size_t } DBG_RETURN(error == Z_OK? PASS:FAIL); #else - DBG_ENTER("mysqlnd_net::decode"); + DBG_ENTER("mysqlnd_ppec::decode"); DBG_RETURN(FAIL); #endif } /* }}} */ -/* {{{ mysqlnd_net::encode */ +/* {{{ mysqlnd_ppec::encode */ static enum_func_status -MYSQLND_METHOD(mysqlnd_net, encode)(zend_uchar * compress_buffer, size_t * compress_buffer_len, +MYSQLND_METHOD(mysqlnd_ppec, encode)(zend_uchar * compress_buffer, size_t * compress_buffer_len, const zend_uchar * const uncompressed_data, const size_t uncompressed_data_len) { #ifdef MYSQLND_COMPRESSION_ENABLED int error; uLongf tmp_complen = *compress_buffer_len; - DBG_ENTER("mysqlnd_net::encode"); + DBG_ENTER("mysqlnd_ppec::encode"); error = compress(compress_buffer, &tmp_complen, uncompressed_data, uncompressed_data_len); if (error != Z_OK) { @@ -3249,22 +3249,22 @@ MYSQLND_METHOD(mysqlnd_net, encode)(zend_uchar * compress_buffer, size_t * compr DBG_RETURN(error == Z_OK? PASS:FAIL); #else - DBG_ENTER("mysqlnd_net::encode"); + DBG_ENTER("mysqlnd_ppec::encode"); DBG_RETURN(FAIL); #endif } /* }}} */ -/* {{{ mysqlnd_net::receive */ +/* {{{ mysqlnd_ppec::receive */ static enum_func_status -MYSQLND_METHOD(mysqlnd_net, receive)(MYSQLND_NET * const net, MYSQLND_VIO * const vio, zend_uchar * const buffer, const size_t count, +MYSQLND_METHOD(mysqlnd_ppec, receive)(MYSQLND_PPEC * const net, MYSQLND_VIO * const vio, zend_uchar * const buffer, const size_t count, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info) { size_t to_read = count; zend_uchar * p = buffer; - DBG_ENTER("mysqlnd_net::receive"); + DBG_ENTER("mysqlnd_ppec::receive"); #ifdef MYSQLND_COMPRESSION_ENABLED if (net->data->compressed) { if (net->uncompressed_data) { @@ -3322,11 +3322,11 @@ MYSQLND_METHOD(mysqlnd_net, receive)(MYSQLND_NET * const net, MYSQLND_VIO * cons /* }}} */ -/* {{{ mysqlnd_net::set_client_option */ +/* {{{ mysqlnd_ppec::set_client_option */ static enum_func_status -MYSQLND_METHOD(mysqlnd_net, set_client_option)(MYSQLND_NET * const net, enum_mysqlnd_client_option option, const char * const value) +MYSQLND_METHOD(mysqlnd_ppec, set_client_option)(MYSQLND_PPEC * const net, enum_mysqlnd_client_option option, const char * const value) { - DBG_ENTER("mysqlnd_net::set_client_option"); + DBG_ENTER("mysqlnd_ppec::set_client_option"); DBG_INF_FMT("option=%u", option); switch (option) { case MYSQL_OPT_COMPRESS: @@ -3349,12 +3349,12 @@ MYSQLND_METHOD(mysqlnd_net, set_client_option)(MYSQLND_NET * const net, enum_mys /* }}} */ -/* {{{ mysqlnd_net::free_contents */ +/* {{{ mysqlnd_ppec::free_contents */ static void -MYSQLND_METHOD(mysqlnd_net, free_contents)(MYSQLND_NET * net) +MYSQLND_METHOD(mysqlnd_ppec, free_contents)(MYSQLND_PPEC * net) { zend_bool pers = net->persistent; - DBG_ENTER("mysqlnd_net::free_contents"); + DBG_ENTER("mysqlnd_ppec::free_contents"); #ifdef MYSQLND_COMPRESSION_ENABLED if (net->uncompressed_data) { @@ -3371,20 +3371,20 @@ MYSQLND_METHOD(mysqlnd_net, free_contents)(MYSQLND_NET * net) /* }}} */ -/* {{{ mysqlnd_net::init */ +/* {{{ mysqlnd_ppec::init */ static enum_func_status -MYSQLND_METHOD(mysqlnd_net, init)(MYSQLND_NET * const net, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info) +MYSQLND_METHOD(mysqlnd_ppec, init)(MYSQLND_PPEC * const net, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info) { return PASS; } /* }}} */ -/* {{{ mysqlnd_net::dtor */ +/* {{{ mysqlnd_ppec::dtor */ static void -MYSQLND_METHOD(mysqlnd_net, dtor)(MYSQLND_NET * const net, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info) +MYSQLND_METHOD(mysqlnd_ppec, dtor)(MYSQLND_PPEC * const net, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info) { - DBG_ENTER("mysqlnd_net::dtor"); + DBG_ENTER("mysqlnd_ppec::dtor"); if (net) { net->data->m.free_contents(net); @@ -3396,46 +3396,46 @@ MYSQLND_METHOD(mysqlnd_net, dtor)(MYSQLND_NET * const net, MYSQLND_STATS * const /* }}} */ -MYSQLND_CLASS_METHODS_START(mysqlnd_net) - MYSQLND_METHOD(mysqlnd_net, init), - MYSQLND_METHOD(mysqlnd_net, dtor), - MYSQLND_METHOD(mysqlnd_net, connect), +MYSQLND_CLASS_METHODS_START(mysqlnd_protocol_packet_envelope_codec) + MYSQLND_METHOD(mysqlnd_ppec, init), + MYSQLND_METHOD(mysqlnd_ppec, dtor), + MYSQLND_METHOD(mysqlnd_ppec, connect), - MYSQLND_METHOD(mysqlnd_net, set_client_option), + MYSQLND_METHOD(mysqlnd_ppec, set_client_option), - MYSQLND_METHOD(mysqlnd_net, decode), - MYSQLND_METHOD(mysqlnd_net, encode), + MYSQLND_METHOD(mysqlnd_ppec, decode), + MYSQLND_METHOD(mysqlnd_ppec, encode), - MYSQLND_METHOD(mysqlnd_net, send), - MYSQLND_METHOD(mysqlnd_net, receive), + MYSQLND_METHOD(mysqlnd_ppec, send), + MYSQLND_METHOD(mysqlnd_ppec, receive), #ifdef MYSQLND_COMPRESSION_ENABLED - MYSQLND_METHOD(mysqlnd_net, read_compressed_packet_from_stream_and_fill_read_buffer), + MYSQLND_METHOD(mysqlnd_ppec, read_compressed_packet_from_stream_and_fill_read_buffer), #else NULL, #endif - MYSQLND_METHOD(mysqlnd_net, free_contents), + MYSQLND_METHOD(mysqlnd_ppec, free_contents), MYSQLND_CLASS_METHODS_END; -/* {{{ mysqlnd_net_init */ -PHPAPI MYSQLND_NET * -mysqlnd_net_init(zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info) +/* {{{ mysqlnd_ppec_init */ +PHPAPI MYSQLND_PPEC * +mysqlnd_ppec_init(zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info) { - MYSQLND_NET * net; - DBG_ENTER("mysqlnd_net_init"); + MYSQLND_PPEC * net; + DBG_ENTER("mysqlnd_ppec_init"); net = MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory).get_net(persistent, stats, error_info); DBG_RETURN(net); } /* }}} */ -/* {{{ mysqlnd_net_free */ +/* {{{ mysqlnd_ppec_free */ PHPAPI void -mysqlnd_net_free(MYSQLND_NET * const net, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info) +mysqlnd_ppec_free(MYSQLND_PPEC * const net, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info) { - DBG_ENTER("mysqlnd_net_free"); + DBG_ENTER("mysqlnd_ppec_free"); if (net) { net->data->m.dtor(net, stats, error_info); } -- cgit v1.2.1 From a530ecff978cbf2e67a774cae40899d3934c163a Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Tue, 10 Nov 2015 11:53:19 +0100 Subject: MNDR: - better name for MYSQLND_PPEC - MYSQLND_PFC (protocol frame codec) --- ext/mysqlnd/mysqlnd_wireprotocol.c | 635 ++++--------------------------------- 1 file changed, 60 insertions(+), 575 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 86a160bc6b..af0f01091f 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -18,7 +18,6 @@ +----------------------------------------------------------------------+ */ -/* $Id$ */ #include "php.h" #include "php_globals.h" #include "mysqlnd.h" @@ -27,9 +26,6 @@ #include "mysqlnd_statistics.h" #include "mysqlnd_debug.h" #include "zend_ini.h" -#ifdef MYSQLND_COMPRESSION_ENABLED -#include -#endif #define MYSQLND_SILENT 1 #define MYSQLND_DUMP_HEADER_N_BODY @@ -248,14 +244,14 @@ end: /* {{{ mysqlnd_read_header */ static enum_func_status -mysqlnd_read_header(MYSQLND_PPEC * net, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER * header, +mysqlnd_read_header(MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER * header, MYSQLND_STATS * conn_stats, MYSQLND_ERROR_INFO * error_info) { zend_uchar buffer[MYSQLND_HEADER_SIZE]; DBG_ENTER(mysqlnd_read_header_name); - DBG_INF_FMT("compressed=%u", net->data->compressed); - if (FAIL == net->data->m.receive(net, vio, buffer, MYSQLND_HEADER_SIZE, conn_stats, error_info)) { + DBG_INF_FMT("compressed=%u", pfc->data->compressed); + if (FAIL == pfc->data->m.receive(pfc, vio, buffer, MYSQLND_HEADER_SIZE, conn_stats, error_info)) { DBG_RETURN(FAIL); } @@ -269,21 +265,21 @@ mysqlnd_read_header(MYSQLND_PPEC * net, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER STAT_PROTOCOL_OVERHEAD_IN, MYSQLND_HEADER_SIZE, STAT_PACKETS_RECEIVED, 1); - if (net->data->compressed || net->packet_no == header->packet_no) { + if (pfc->data->compressed || pfc->packet_no == header->packet_no) { /* Have to increase the number, so we can send correct number back. It will round at 255 as this is unsigned char. The server needs this for simple flow control checking. */ - net->packet_no++; + pfc->packet_no++; DBG_RETURN(PASS); } DBG_ERR_FMT("Logical link: packets out of order. Expected %u received %u. Packet size="MYSQLND_SZ_T_SPEC, - net->packet_no, header->packet_no, header->size); + pfc->packet_no, header->packet_no, header->size); php_error(E_WARNING, "Packets out of order. Expected %u received %u. Packet size="MYSQLND_SZ_T_SPEC, - net->packet_no, header->packet_no, header->size); + pfc->packet_no, header->packet_no, header->size); DBG_RETURN(FAIL); } /* }}} */ @@ -292,7 +288,7 @@ mysqlnd_read_header(MYSQLND_PPEC * net, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER /* {{{ mysqlnd_read_packet_header_and_body */ static enum_func_status mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, - MYSQLND_PPEC * net, + MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info, @@ -302,7 +298,7 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, { DBG_ENTER("mysqlnd_read_packet_header_and_body"); DBG_INF_FMT("buf=%p size=%u", buf, buf_size); - if (FAIL == mysqlnd_read_header(net, vio, packet_header, stats, error_info)) { + if (FAIL == mysqlnd_read_header(pfc, vio, packet_header, stats, error_info)) { SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); @@ -314,7 +310,7 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, buf_size, packet_header->size, packet_header->size - buf_size); DBG_RETURN(FAIL); } - if (FAIL == net->data->m.receive(net, vio, buf, packet_header->size, stats, error_info)) { + if (FAIL == pfc->data->m.receive(pfc, vio, buf, packet_header->size, stats, error_info)) { SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); @@ -340,14 +336,14 @@ php_mysqlnd_greet_read(void * _packet) zend_uchar *pad_start = NULL; MYSQLND_PACKET_GREET *packet= (MYSQLND_PACKET_GREET *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; DBG_ENTER("php_mysqlnd_greet_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, sizeof(buf), "greeting", PROT_GREET_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state, buf, sizeof(buf), "greeting", PROT_GREET_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -509,7 +505,7 @@ size_t php_mysqlnd_auth_write(void * _packet) MYSQLND_PACKET_AUTH * packet= (MYSQLND_PACKET_AUTH *) _packet; MYSQLND_CONN_DATA * conn = packet->header.conn; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -641,7 +637,7 @@ size_t php_mysqlnd_auth_write(void * _packet) DBG_RETURN(ret == PASS? (p - buffer - MYSQLND_HEADER_SIZE) : 0); } else { - size_t sent = net->data->m.send(net, vio, buffer, p - buffer - MYSQLND_HEADER_SIZE, stats, error_info); + size_t sent = pfc->data->m.send(pfc, vio, buffer, p - buffer - MYSQLND_HEADER_SIZE, stats, error_info); if (!sent) { SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); } @@ -671,7 +667,7 @@ php_mysqlnd_auth_response_read(void * _packet) { register MYSQLND_PACKET_AUTH_RESPONSE * packet= (MYSQLND_PACKET_AUTH_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -686,7 +682,7 @@ php_mysqlnd_auth_response_read(void * _packet) /* leave space for terminating safety \0 */ buf_len--; - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "OK", PROT_OK_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state, buf, buf_len, "OK", PROT_OK_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -798,7 +794,7 @@ php_mysqlnd_change_auth_response_write(void * _packet) { MYSQLND_PACKET_CHANGE_AUTH_RESPONSE *packet= (MYSQLND_PACKET_CHANGE_AUTH_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -813,7 +809,7 @@ php_mysqlnd_change_auth_response_write(void * _packet) } { - size_t sent = net->data->m.send(net, vio, buffer, p - buffer - MYSQLND_HEADER_SIZE, stats, error_info); + size_t sent = pfc->data->m.send(pfc, vio, buffer, p - buffer - MYSQLND_HEADER_SIZE, stats, error_info); if (buffer != vio->cmd_buffer.buffer) { mnd_efree(buffer); } @@ -846,7 +842,7 @@ php_mysqlnd_ok_read(void * _packet) { register MYSQLND_PACKET_OK *packet= (MYSQLND_PACKET_OK *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -859,7 +855,7 @@ php_mysqlnd_ok_read(void * _packet) DBG_ENTER("php_mysqlnd_ok_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "OK", PROT_OK_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state, buf, buf_len, "OK", PROT_OK_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -944,7 +940,7 @@ php_mysqlnd_eof_read(void * _packet) */ MYSQLND_PACKET_EOF *packet= (MYSQLND_PACKET_EOF *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -955,7 +951,7 @@ php_mysqlnd_eof_read(void * _packet) DBG_ENTER("php_mysqlnd_eof_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "EOF", PROT_EOF_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state, buf, buf_len, "EOF", PROT_EOF_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -1023,7 +1019,7 @@ size_t php_mysqlnd_cmd_write(void * _packet) /* Let's have some space, which we can use, if not enough, we will allocate new buffer */ MYSQLND_PACKET_COMMAND * packet= (MYSQLND_PACKET_COMMAND *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -1035,8 +1031,7 @@ size_t php_mysqlnd_cmd_write(void * _packet) Reset packet_no, or we will get bad handshake! Every command starts a new TX and packet numbers are reset to 0. */ - net->packet_no = 0; - net->compressed_envelope_packet_no = 0; /* this is for the response */ + pfc->data->m.reset(pfc, stats, error_info); if (error_reporting) { EG(error_reporting) = 0; @@ -1052,7 +1047,7 @@ size_t php_mysqlnd_cmd_write(void * _packet) zend_uchar buffer[MYSQLND_HEADER_SIZE + 1]; int1store(buffer + MYSQLND_HEADER_SIZE, packet->command); - sent = net->data->m.send(net, vio, buffer, 1, stats, error_info); + sent = pfc->data->m.send(pfc, vio, buffer, 1, stats, error_info); } else { size_t tmp_len = packet->argument.l + 1 + MYSQLND_HEADER_SIZE; zend_uchar *tmp, *p; @@ -1067,7 +1062,7 @@ size_t php_mysqlnd_cmd_write(void * _packet) memcpy(p, packet->argument.s, packet->argument.l); - sent = net->data->m.send(net, vio, tmp, tmp_len - MYSQLND_HEADER_SIZE, stats, error_info); + sent = pfc->data->m.send(pfc, vio, tmp, tmp_len - MYSQLND_HEADER_SIZE, stats, error_info); if (tmp != vio->cmd_buffer.buffer) { MYSQLND_INC_CONN_STATISTIC(stats, STAT_CMD_BUFFER_TOO_SMALL); mnd_efree(tmp); @@ -1104,7 +1099,7 @@ php_mysqlnd_rset_header_read(void * _packet) { MYSQLND_PACKET_RSET_HEADER * packet= (MYSQLND_PACKET_RSET_HEADER *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -1117,7 +1112,7 @@ php_mysqlnd_rset_header_read(void * _packet) DBG_ENTER("php_mysqlnd_rset_header_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "resultset header", PROT_RSET_HEADER_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state, buf, buf_len, "resultset header", PROT_RSET_HEADER_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -1250,7 +1245,7 @@ php_mysqlnd_rset_field_read(void * _packet) /* Should be enough for the metadata of a single row */ MYSQLND_PACKET_RES_FIELD *packet = (MYSQLND_PACKET_RES_FIELD *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -1265,7 +1260,7 @@ php_mysqlnd_rset_field_read(void * _packet) DBG_ENTER("php_mysqlnd_rset_field_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "field", PROT_RSET_FLD_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state, buf, buf_len, "field", PROT_RSET_FLD_PACKET)) { DBG_RETURN(FAIL); } @@ -1465,7 +1460,7 @@ void php_mysqlnd_rset_field_free_mem(void * _packet, zend_bool stack_allocation) /* {{{ php_mysqlnd_read_row_ex */ static enum_func_status -php_mysqlnd_read_row_ex(MYSQLND_PPEC * net, +php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info, @@ -1491,7 +1486,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PPEC * net, *data_size = prealloc_more_bytes; while (1) { - if (FAIL == mysqlnd_read_header(net, vio, &header, stats, error_info)) { + if (FAIL == mysqlnd_read_header(pfc, vio, &header, stats, error_info)) { ret = FAIL; break; } @@ -1524,7 +1519,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PPEC * net, p = (*buffer)->ptr + (*data_size - header.size); } - if (PASS != (ret = net->data->m.receive(net, vio, p, header.size, stats, error_info))) { + if (PASS != (ret = pfc->data->m.receive(pfc, vio, p, header.size, stats, error_info))) { DBG_ERR("Empty row packet body"); php_error(E_WARNING, "Empty row packet body"); break; @@ -1825,7 +1820,7 @@ php_mysqlnd_rowp_read(void * _packet) { MYSQLND_PACKET_ROW *packet= (MYSQLND_PACKET_ROW *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; zend_uchar *p; @@ -1840,7 +1835,7 @@ php_mysqlnd_rowp_read(void * _packet) post_alloc_for_bit_fields = packet->bit_fields_total_len + packet->bit_fields_count; } - ret = php_mysqlnd_read_row_ex(net, vio, stats, error_info, + ret = php_mysqlnd_read_row_ex(pfc, vio, stats, error_info, packet->result_set_memory_pool, &packet->row_buffer, &data_size, packet->persistent_alloc, post_alloc_for_bit_fields ); @@ -1950,7 +1945,7 @@ php_mysqlnd_stats_read(void * _packet) { MYSQLND_PACKET_STATS *packet= (MYSQLND_PACKET_STATS *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -1959,7 +1954,7 @@ php_mysqlnd_stats_read(void * _packet) DBG_ENTER("php_mysqlnd_stats_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "statistics", PROT_STATS_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state, buf, buf_len, "statistics", PROT_STATS_PACKET)) { DBG_RETURN(FAIL); } @@ -1999,7 +1994,7 @@ php_mysqlnd_prepare_read(void * _packet) { MYSQLND_PACKET_PREPARE_RESPONSE *packet= (MYSQLND_PACKET_PREPARE_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -2012,7 +2007,7 @@ php_mysqlnd_prepare_read(void * _packet) DBG_ENTER("php_mysqlnd_prepare_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "prepare", PROT_PREPARE_RESP_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state, buf, buf_len, "prepare", PROT_PREPARE_RESP_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -2094,7 +2089,7 @@ php_mysqlnd_chg_user_read(void * _packet) { MYSQLND_PACKET_CHG_USER_RESPONSE *packet= (MYSQLND_PACKET_CHG_USER_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -2106,7 +2101,7 @@ php_mysqlnd_chg_user_read(void * _packet) DBG_ENTER("php_mysqlnd_chg_user_read"); - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, buf_len, "change user response", PROT_CHG_USER_RESP_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state, buf, buf_len, "change user response", PROT_CHG_USER_RESP_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -2189,7 +2184,7 @@ size_t php_mysqlnd_sha256_pk_request_write(void * _packet) { MYSQLND_PACKET_SHA256_PK_REQUEST * packet = (MYSQLND_PACKET_SHA256_PK_REQUEST *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; zend_uchar buffer[MYSQLND_HEADER_SIZE + 1]; @@ -2198,7 +2193,7 @@ size_t php_mysqlnd_sha256_pk_request_write(void * _packet) DBG_ENTER("php_mysqlnd_sha256_pk_request_write"); int1store(buffer + MYSQLND_HEADER_SIZE, '\1'); - sent = net->data->m.send(net, vio, buffer, 1, stats, error_info); + sent = pfc->data->m.send(pfc, vio, buffer, 1, stats, error_info); DBG_RETURN(sent); } @@ -2225,7 +2220,7 @@ php_mysqlnd_sha256_pk_request_response_read(void * _packet) { MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE * packet= (MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; - MYSQLND_PPEC * net = packet->header.net; + MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; @@ -2236,7 +2231,7 @@ php_mysqlnd_sha256_pk_request_response_read(void * _packet) DBG_ENTER("php_mysqlnd_sha256_pk_request_response_read"); /* leave space for terminating safety \0 */ - if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), net, vio, stats, error_info, connection_state, buf, sizeof(buf), "SHA256_PK_REQUEST_RESPONSE", PROT_SHA256_PK_REQUEST_RESPONSE_PACKET)) { + if (FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state, buf, sizeof(buf), "SHA256_PK_REQUEST_RESPONSE", PROT_SHA256_PK_REQUEST_RESPONSE_PACKET)) { DBG_RETURN(FAIL); } BAIL_IF_NO_MORE_DATA; @@ -2386,7 +2381,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECO packet->header.m = &packet_methods[PROT_GREET_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2410,7 +2405,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECOD packet->header.factory = factory; packet->header.conn = factory->conn; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2433,7 +2428,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet)(MYSQLND_PROTOCOL_PAYL packet->header.m = &packet_methods[PROT_AUTH_RESP_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2456,7 +2451,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet)(MYSQLND_PROTOC packet->header.m = &packet_methods[PROT_CHANGE_AUTH_RESP_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2479,7 +2474,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER packet->header.m = &packet_methods[PROT_OK_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2502,7 +2497,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODE packet->header.m = &packet_methods[PROT_EOF_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2525,7 +2520,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL_PAYLOAD_DE packet->header.m = &packet_methods[PROT_CMD_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2548,7 +2543,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL_PAYLOA packet->header.m = &packet_methods[PROT_RSET_HEADER_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2571,7 +2566,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL_PAYLO packet->header.m = &packet_methods[PROT_RSET_FLD_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2595,7 +2590,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODE packet->header.factory = factory; packet->header.conn = factory->conn; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2618,7 +2613,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECO packet->header.m = &packet_methods[PROT_STATS_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2641,7 +2636,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL_P packet->header.m = &packet_methods[PROT_PREPARE_RESP_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2664,7 +2659,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOC packet->header.m = &packet_methods[PROT_CHG_USER_RESP_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2687,7 +2682,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet)(MYSQLND_PROTOCOL_ packet->header.m = &packet_methods[PROT_SHA256_PK_REQUEST_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2710,7 +2705,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_ packet->header.m = &packet_methods[PROT_SHA256_PK_REQUEST_RESPONSE_PACKET]; packet->header.factory = factory; - packet->header.net = factory->conn->net; + packet->header.protocol_frame_codec = factory->conn->protocol_frame_codec; packet->header.vio = factory->conn->vio; packet->header.stats = factory->conn->stats; packet->header.error_info = factory->conn->error_info; @@ -2935,516 +2930,6 @@ MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_response)( /* }}} */ - -/* {{{ mysqlnd_ppec::connect */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_ppec, connect)(MYSQLND_PPEC * const net, const MYSQLND_CSTRING scheme, const zend_bool persistent, - MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info) -{ - DBG_ENTER("mysqlnd_ppec::connect"); - net->packet_no = net->compressed_envelope_packet_no = 0; - DBG_RETURN(PASS); -} -/* }}} */ - - -/* We assume that MYSQLND_HEADER_SIZE is 4 bytes !! */ -#define COPY_HEADER(T,A) do { \ - *(((char *)(T))) = *(((char *)(A)));\ - *(((char *)(T))+1) = *(((char *)(A))+1);\ - *(((char *)(T))+2) = *(((char *)(A))+2);\ - *(((char *)(T))+3) = *(((char *)(A))+3); } while (0) -#define STORE_HEADER_SIZE(safe_storage, buffer) COPY_HEADER((safe_storage), (buffer)) -#define RESTORE_HEADER_SIZE(buffer, safe_storage) STORE_HEADER_SIZE((safe_storage), (buffer)) - - -/* {{{ mysqlnd_ppec::send */ -/* - IMPORTANT : It's expected that buffer has place in the beginning for MYSQLND_HEADER_SIZE !!!! - This is done for performance reasons in the caller of this function. - Otherwise we will have to do send two TCP packets, or do new alloc and memcpy. - Neither are quick, thus the clients of this function are obligated to do - what they are asked for. - - `count` is actually the length of the payload data. Thus : - count + MYSQLND_HEADER_SIZE = sizeof(buffer) (not the pointer but the actual buffer) -*/ -static size_t -MYSQLND_METHOD(mysqlnd_ppec, send)(MYSQLND_PPEC * const net, MYSQLND_VIO * const vio, zend_uchar * const buffer, const size_t count, - MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info) -{ - zend_uchar safe_buf[((MYSQLND_HEADER_SIZE) + (sizeof(zend_uchar)) - 1) / (sizeof(zend_uchar))]; - zend_uchar * safe_storage = safe_buf; - size_t bytes_sent, packets_sent = 1; - size_t left = count; - zend_uchar * p = (zend_uchar *) buffer; - zend_uchar * compress_buf = NULL; - size_t to_be_sent; - - DBG_ENTER("mysqlnd_ppec::send"); - DBG_INF_FMT("count=" MYSQLND_SZ_T_SPEC " compression=%u", count, net->data->compressed); - - if (net->data->compressed == TRUE) { - size_t comp_buf_size = MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE + MYSQLND_HEADER_SIZE + MIN(left, MYSQLND_MAX_PACKET_SIZE); - DBG_INF_FMT("compress_buf_size="MYSQLND_SZ_T_SPEC, comp_buf_size); - compress_buf = mnd_emalloc(comp_buf_size); - } - - do { - to_be_sent = MIN(left, MYSQLND_MAX_PACKET_SIZE); - DBG_INF_FMT("to_be_sent=%u", to_be_sent); - DBG_INF_FMT("packets_sent=%u", packets_sent); - DBG_INF_FMT("compressed_envelope_packet_no=%u", net->compressed_envelope_packet_no); - DBG_INF_FMT("packet_no=%u", net->packet_no); -#ifdef MYSQLND_COMPRESSION_ENABLED - if (net->data->compressed == TRUE) { - /* here we need to compress the data and then write it, first comes the compressed header */ - size_t tmp_complen = to_be_sent; - size_t payload_size; - zend_uchar * uncompressed_payload = p; /* should include the header */ - - STORE_HEADER_SIZE(safe_storage, uncompressed_payload); - int3store(uncompressed_payload, to_be_sent); - int1store(uncompressed_payload + 3, net->packet_no); - if (PASS == net->data->m.encode((compress_buf + COMPRESSED_HEADER_SIZE + MYSQLND_HEADER_SIZE), &tmp_complen, - uncompressed_payload, to_be_sent + MYSQLND_HEADER_SIZE)) - { - int3store(compress_buf + MYSQLND_HEADER_SIZE, to_be_sent + MYSQLND_HEADER_SIZE); - payload_size = tmp_complen; - } else { - int3store(compress_buf + MYSQLND_HEADER_SIZE, 0); - memcpy(compress_buf + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE, uncompressed_payload, to_be_sent + MYSQLND_HEADER_SIZE); - payload_size = to_be_sent + MYSQLND_HEADER_SIZE; - } - RESTORE_HEADER_SIZE(uncompressed_payload, safe_storage); - - int3store(compress_buf, payload_size); - int1store(compress_buf + 3, net->packet_no); - DBG_INF_FMT("writing "MYSQLND_SZ_T_SPEC" bytes to the network", payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE); - bytes_sent = vio->data->m.network_write(vio, compress_buf, payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE, conn_stats, error_info); - net->compressed_envelope_packet_no++; - #if WHEN_WE_NEED_TO_CHECK_WHETHER_COMPRESSION_WORKS_CORRECTLY - if (res == Z_OK) { - size_t decompressed_size = left + MYSQLND_HEADER_SIZE; - zend_uchar * decompressed_data = mnd_malloc(decompressed_size); - int error = net->data->m.decode(decompressed_data, decompressed_size, - compress_buf + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE, payload_size); - if (error == Z_OK) { - int i; - DBG_INF("success decompressing"); - for (i = 0 ; i < decompressed_size; i++) { - if (i && (i % 30 == 0)) { - printf("\n\t\t"); - } - printf("%.2X ", (int)*((char*)&(decompressed_data[i]))); - DBG_INF_FMT("%.2X ", (int)*((char*)&(decompressed_data[i]))); - } - } else { - DBG_INF("error decompressing"); - } - mnd_free(decompressed_data); - } - #endif /* WHEN_WE_NEED_TO_CHECK_WHETHER_COMPRESSION_WORKS_CORRECTLY */ - } else -#endif /* MYSQLND_COMPRESSION_ENABLED */ - { - DBG_INF("no compression"); - STORE_HEADER_SIZE(safe_storage, p); - int3store(p, to_be_sent); - int1store(p + 3, net->packet_no); - bytes_sent = vio->data->m.network_write(vio, p, to_be_sent + MYSQLND_HEADER_SIZE, conn_stats, error_info); - RESTORE_HEADER_SIZE(p, safe_storage); - net->compressed_envelope_packet_no++; - } - net->packet_no++; - - p += to_be_sent; - left -= to_be_sent; - packets_sent++; - /* - if left is 0 then there is nothing more to send, but if the last packet was exactly - with the size MYSQLND_MAX_PACKET_SIZE we need to send additional packet, which has - empty payload. Thus if left == 0 we check for to_be_sent being the max size. If it is - indeed it then loop once more, then to_be_sent will become 0, left will stay 0. Empty - packet will be sent and this loop will end. - */ - } while (bytes_sent && (left > 0 || to_be_sent == MYSQLND_MAX_PACKET_SIZE)); - - DBG_INF_FMT("packet_size="MYSQLND_SZ_T_SPEC" packet_no=%u", left, net->packet_no); - - MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn_stats, - STAT_BYTES_SENT, count + packets_sent * MYSQLND_HEADER_SIZE, - STAT_PROTOCOL_OVERHEAD_OUT, packets_sent * MYSQLND_HEADER_SIZE, - STAT_PACKETS_SENT, packets_sent); - - if (compress_buf) { - mnd_efree(compress_buf); - } - - /* Even for zero size payload we have to send a packet */ - if (!bytes_sent) { - DBG_ERR_FMT("Can't %u send bytes", count); - SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); - } - DBG_RETURN(bytes_sent); -} -/* }}} */ - - -#ifdef MYSQLND_COMPRESSION_ENABLED -/* {{{ php_mysqlnd_read_buffer_is_empty */ -static zend_bool -php_mysqlnd_read_buffer_is_empty(MYSQLND_READ_BUFFER * buffer) -{ - return buffer->len? FALSE:TRUE; -} -/* }}} */ - - -/* {{{ php_mysqlnd_read_buffer_read */ -static void -php_mysqlnd_read_buffer_read(MYSQLND_READ_BUFFER * buffer, size_t count, zend_uchar * dest) -{ - if (buffer->len >= count) { - memcpy(dest, buffer->data + buffer->offset, count); - buffer->offset += count; - buffer->len -= count; - } -} -/* }}} */ - - -/* {{{ php_mysqlnd_read_buffer_bytes_left */ -static size_t -php_mysqlnd_read_buffer_bytes_left(MYSQLND_READ_BUFFER * buffer) -{ - return buffer->len; -} -/* }}} */ - - -/* {{{ php_mysqlnd_read_buffer_free */ -static void -php_mysqlnd_read_buffer_free(MYSQLND_READ_BUFFER ** buffer) -{ - DBG_ENTER("php_mysqlnd_read_buffer_free"); - if (*buffer) { - mnd_efree((*buffer)->data); - mnd_efree(*buffer); - *buffer = NULL; - } - DBG_VOID_RETURN; -} -/* }}} */ - - -/* {{{ php_mysqlnd_create_read_buffer */ -static MYSQLND_READ_BUFFER * -mysqlnd_create_read_buffer(size_t count) -{ - MYSQLND_READ_BUFFER * ret = mnd_emalloc(sizeof(MYSQLND_READ_BUFFER)); - DBG_ENTER("mysqlnd_create_read_buffer"); - ret->is_empty = php_mysqlnd_read_buffer_is_empty; - ret->read = php_mysqlnd_read_buffer_read; - ret->bytes_left = php_mysqlnd_read_buffer_bytes_left; - ret->free_buffer = php_mysqlnd_read_buffer_free; - ret->data = mnd_emalloc(count); - ret->size = ret->len = count; - ret->offset = 0; - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_ppec::read_compressed_packet_from_stream_and_fill_read_buffer */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_ppec, read_compressed_packet_from_stream_and_fill_read_buffer) - (MYSQLND_PPEC * net, MYSQLND_VIO * vio, size_t net_payload_size, MYSQLND_STATS * conn_stats, MYSQLND_ERROR_INFO * error_info) -{ - size_t decompressed_size; - enum_func_status retval = PASS; - zend_uchar * compressed_data = NULL; - zend_uchar comp_header[COMPRESSED_HEADER_SIZE]; - DBG_ENTER("mysqlnd_ppec::read_compressed_packet_from_stream_and_fill_read_buffer"); - - /* Read the compressed header */ - if (FAIL == vio->data->m.network_read(vio, comp_header, COMPRESSED_HEADER_SIZE, conn_stats, error_info)) { - DBG_RETURN(FAIL); - } - decompressed_size = uint3korr(comp_header); - - /* When decompressed_size is 0, then the data is not compressed, and we have wasted 3 bytes */ - /* we need to decompress the data */ - - if (decompressed_size) { - compressed_data = mnd_emalloc(net_payload_size); - if (FAIL == vio->data->m.network_read(vio, compressed_data, net_payload_size, conn_stats, error_info)) { - retval = FAIL; - goto end; - } - net->uncompressed_data = mysqlnd_create_read_buffer(decompressed_size); - retval = net->data->m.decode(net->uncompressed_data->data, decompressed_size, compressed_data, net_payload_size); - if (FAIL == retval) { - goto end; - } - } else { - DBG_INF_FMT("The server decided not to compress the data. Our job is easy. Copying %u bytes", net_payload_size); - net->uncompressed_data = mysqlnd_create_read_buffer(net_payload_size); - if (FAIL == vio->data->m.network_read(vio, net->uncompressed_data->data, net_payload_size, conn_stats, error_info)) { - retval = FAIL; - goto end; - } - } -end: - if (compressed_data) { - mnd_efree(compressed_data); - } - DBG_RETURN(retval); -} -/* }}} */ -#endif /* MYSQLND_COMPRESSION_ENABLED */ - - -/* {{{ mysqlnd_ppec::decode */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_ppec, decode)(zend_uchar * uncompressed_data, const size_t uncompressed_data_len, - const zend_uchar * const compressed_data, const size_t compressed_data_len) -{ -#ifdef MYSQLND_COMPRESSION_ENABLED - int error; - uLongf tmp_complen = uncompressed_data_len; - DBG_ENTER("mysqlnd_ppec::decode"); - error = uncompress(uncompressed_data, &tmp_complen, compressed_data, compressed_data_len); - - DBG_INF_FMT("compressed data: decomp_len=%lu compressed_size="MYSQLND_SZ_T_SPEC, tmp_complen, compressed_data_len); - if (error != Z_OK) { - DBG_INF_FMT("decompression NOT successful. error=%d Z_OK=%d Z_BUF_ERROR=%d Z_MEM_ERROR=%d", error, Z_OK, Z_BUF_ERROR, Z_MEM_ERROR); - } - DBG_RETURN(error == Z_OK? PASS:FAIL); -#else - DBG_ENTER("mysqlnd_ppec::decode"); - DBG_RETURN(FAIL); -#endif -} -/* }}} */ - - -/* {{{ mysqlnd_ppec::encode */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_ppec, encode)(zend_uchar * compress_buffer, size_t * compress_buffer_len, - const zend_uchar * const uncompressed_data, const size_t uncompressed_data_len) -{ -#ifdef MYSQLND_COMPRESSION_ENABLED - int error; - uLongf tmp_complen = *compress_buffer_len; - DBG_ENTER("mysqlnd_ppec::encode"); - error = compress(compress_buffer, &tmp_complen, uncompressed_data, uncompressed_data_len); - - if (error != Z_OK) { - DBG_INF_FMT("compression NOT successful. error=%d Z_OK=%d Z_BUF_ERROR=%d Z_MEM_ERROR=%d", error, Z_OK, Z_BUF_ERROR, Z_MEM_ERROR); - } else { - *compress_buffer_len = tmp_complen; - DBG_INF_FMT("compression successful. compressed size=%lu", tmp_complen); - } - - DBG_RETURN(error == Z_OK? PASS:FAIL); -#else - DBG_ENTER("mysqlnd_ppec::encode"); - DBG_RETURN(FAIL); -#endif -} -/* }}} */ - - -/* {{{ mysqlnd_ppec::receive */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_ppec, receive)(MYSQLND_PPEC * const net, MYSQLND_VIO * const vio, zend_uchar * const buffer, const size_t count, - MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info) -{ - size_t to_read = count; - zend_uchar * p = buffer; - - DBG_ENTER("mysqlnd_ppec::receive"); -#ifdef MYSQLND_COMPRESSION_ENABLED - if (net->data->compressed) { - if (net->uncompressed_data) { - size_t to_read_from_buffer = MIN(net->uncompressed_data->bytes_left(net->uncompressed_data), to_read); - DBG_INF_FMT("reading "MYSQLND_SZ_T_SPEC" from uncompressed_data buffer", to_read_from_buffer); - if (to_read_from_buffer) { - net->uncompressed_data->read(net->uncompressed_data, to_read_from_buffer, (zend_uchar *) p); - p += to_read_from_buffer; - to_read -= to_read_from_buffer; - } - DBG_INF_FMT("left "MYSQLND_SZ_T_SPEC" to read", to_read); - if (TRUE == net->uncompressed_data->is_empty(net->uncompressed_data)) { - /* Everything was consumed. This should never happen here, but for security */ - net->uncompressed_data->free_buffer(&net->uncompressed_data); - } - } - if (to_read) { - zend_uchar net_header[MYSQLND_HEADER_SIZE]; - size_t net_payload_size; - zend_uchar packet_no; - - if (FAIL == vio->data->m.network_read(vio, net_header, MYSQLND_HEADER_SIZE, conn_stats, error_info)) { - DBG_RETURN(FAIL); - } - net_payload_size = uint3korr(net_header); - packet_no = uint1korr(net_header + 3); - if (net->compressed_envelope_packet_no != packet_no) { - DBG_ERR_FMT("Transport level: packets out of order. Expected %u received %u. Packet size="MYSQLND_SZ_T_SPEC, - net->compressed_envelope_packet_no, packet_no, net_payload_size); - - php_error(E_WARNING, "Packets out of order. Expected %u received %u. Packet size="MYSQLND_SZ_T_SPEC, - net->compressed_envelope_packet_no, packet_no, net_payload_size); - DBG_RETURN(FAIL); - } - net->compressed_envelope_packet_no++; -#ifdef MYSQLND_DUMP_HEADER_N_BODY - DBG_INF_FMT("HEADER: hwd_packet_no=%u size=%3u", packet_no, (zend_ulong) net_payload_size); -#endif - /* Now let's read from the wire, decompress it and fill the read buffer */ - net->data->m.read_compressed_packet_from_stream_and_fill_read_buffer(net, vio, net_payload_size, conn_stats, error_info); - - /* - Now a bit of recursion - read from the read buffer, - if the data which we have just read from the wire - is not enough, then the recursive call will try to - satisfy it until it is satisfied. - */ - DBG_RETURN(net->data->m.receive(net, vio, p, to_read, conn_stats, error_info)); - } - DBG_RETURN(PASS); - } -#endif /* MYSQLND_COMPRESSION_ENABLED */ - DBG_RETURN(vio->data->m.network_read(vio, p, to_read, conn_stats, error_info)); -} -/* }}} */ - - -/* {{{ mysqlnd_ppec::set_client_option */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_ppec, set_client_option)(MYSQLND_PPEC * const net, enum_mysqlnd_client_option option, const char * const value) -{ - DBG_ENTER("mysqlnd_ppec::set_client_option"); - DBG_INF_FMT("option=%u", option); - switch (option) { - case MYSQL_OPT_COMPRESS: - net->data->options.flags |= MYSQLND_NET_FLAG_USE_COMPRESSION; - break; - case MYSQL_SERVER_PUBLIC_KEY: - { - zend_bool pers = net->persistent; - if (net->data->options.sha256_server_public_key) { - mnd_pefree(net->data->options.sha256_server_public_key, pers); - } - net->data->options.sha256_server_public_key = value? mnd_pestrdup(value, pers) : NULL; - break; - } - default: - DBG_RETURN(FAIL); - } - DBG_RETURN(PASS); -} -/* }}} */ - - -/* {{{ mysqlnd_ppec::free_contents */ -static void -MYSQLND_METHOD(mysqlnd_ppec, free_contents)(MYSQLND_PPEC * net) -{ - zend_bool pers = net->persistent; - DBG_ENTER("mysqlnd_ppec::free_contents"); - -#ifdef MYSQLND_COMPRESSION_ENABLED - if (net->uncompressed_data) { - net->uncompressed_data->free_buffer(&net->uncompressed_data); - } -#endif - if (net->data->options.sha256_server_public_key) { - mnd_pefree(net->data->options.sha256_server_public_key, pers); - net->data->options.sha256_server_public_key = NULL; - } - - DBG_VOID_RETURN; -} -/* }}} */ - - -/* {{{ mysqlnd_ppec::init */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_ppec, init)(MYSQLND_PPEC * const net, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info) -{ - return PASS; -} -/* }}} */ - - -/* {{{ mysqlnd_ppec::dtor */ -static void -MYSQLND_METHOD(mysqlnd_ppec, dtor)(MYSQLND_PPEC * const net, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info) -{ - DBG_ENTER("mysqlnd_ppec::dtor"); - if (net) { - net->data->m.free_contents(net); - - mnd_pefree(net->data, net->data->persistent); - mnd_pefree(net, net->persistent); - } - DBG_VOID_RETURN; -} -/* }}} */ - - -MYSQLND_CLASS_METHODS_START(mysqlnd_protocol_packet_envelope_codec) - MYSQLND_METHOD(mysqlnd_ppec, init), - MYSQLND_METHOD(mysqlnd_ppec, dtor), - MYSQLND_METHOD(mysqlnd_ppec, connect), - - MYSQLND_METHOD(mysqlnd_ppec, set_client_option), - - MYSQLND_METHOD(mysqlnd_ppec, decode), - MYSQLND_METHOD(mysqlnd_ppec, encode), - - MYSQLND_METHOD(mysqlnd_ppec, send), - MYSQLND_METHOD(mysqlnd_ppec, receive), - -#ifdef MYSQLND_COMPRESSION_ENABLED - MYSQLND_METHOD(mysqlnd_ppec, read_compressed_packet_from_stream_and_fill_read_buffer), -#else - NULL, -#endif - - MYSQLND_METHOD(mysqlnd_ppec, free_contents), -MYSQLND_CLASS_METHODS_END; - - -/* {{{ mysqlnd_ppec_init */ -PHPAPI MYSQLND_PPEC * -mysqlnd_ppec_init(zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info) -{ - MYSQLND_PPEC * net; - DBG_ENTER("mysqlnd_ppec_init"); - net = MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory).get_net(persistent, stats, error_info); - DBG_RETURN(net); -} -/* }}} */ - - -/* {{{ mysqlnd_ppec_free */ -PHPAPI void -mysqlnd_ppec_free(MYSQLND_PPEC * const net, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info) -{ - DBG_ENTER("mysqlnd_ppec_free"); - if (net) { - net->data->m.dtor(net, stats, error_info); - } - DBG_VOID_RETURN; -} -/* }}} */ - - - MYSQLND_CLASS_METHODS_START(mysqlnd_protocol_payload_decoder_factory) MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet), MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet), -- cgit v1.2.1 From 2cea04165ca4b40d091554a01c4a6f922896ef9b Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Tue, 10 Nov 2015 12:56:07 +0100 Subject: MNDR: - move all data members from MYSQLND_PFC to MYSQLND_PFC_DATA --- ext/mysqlnd/mysqlnd_wireprotocol.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index af0f01091f..204c8fbe7f 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -265,21 +265,21 @@ mysqlnd_read_header(MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER STAT_PROTOCOL_OVERHEAD_IN, MYSQLND_HEADER_SIZE, STAT_PACKETS_RECEIVED, 1); - if (pfc->data->compressed || pfc->packet_no == header->packet_no) { + if (pfc->data->compressed || pfc->data->packet_no == header->packet_no) { /* Have to increase the number, so we can send correct number back. It will round at 255 as this is unsigned char. The server needs this for simple flow control checking. */ - pfc->packet_no++; + pfc->data->packet_no++; DBG_RETURN(PASS); } DBG_ERR_FMT("Logical link: packets out of order. Expected %u received %u. Packet size="MYSQLND_SZ_T_SPEC, - pfc->packet_no, header->packet_no, header->size); + pfc->data->packet_no, header->packet_no, header->size); php_error(E_WARNING, "Packets out of order. Expected %u received %u. Packet size="MYSQLND_SZ_T_SPEC, - pfc->packet_no, header->packet_no, header->size); + pfc->data->packet_no, header->packet_no, header->size); DBG_RETURN(FAIL); } /* }}} */ -- cgit v1.2.1 From 4248240648810fedf5d421f28a4f35936104657c Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Tue, 10 Nov 2015 13:14:39 +0100 Subject: MNDR: - move the command factory to own file - mysqlnd_commands.c --- ext/mysqlnd/mysqlnd_wireprotocol.c | 1436 ------------------------------------ 1 file changed, 1436 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 204c8fbe7f..dd239d5545 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -25,7 +25,6 @@ #include "mysqlnd_wireprotocol.h" #include "mysqlnd_statistics.h" #include "mysqlnd_debug.h" -#include "zend_ini.h" #define MYSQLND_SILENT 1 #define MYSQLND_DUMP_HEADER_N_BODY @@ -2981,1441 +2980,6 @@ mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_F /* }}} */ - - -struct st_mysqlnd_protocol_no_params_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_protocol_no_params_command_context - { - MYSQLND_CONN_DATA * conn; - } context; -}; - -/* {{{ mysqlnd_com_no_params_free_command */ -static void -mysqlnd_com_no_params_free_command(void * command) -{ - DBG_ENTER("mysqlnd_com_no_params_free_command"); - mnd_efree(command); - DBG_VOID_RETURN; -} -/* }}} */ - - -/************************** COM_SET_OPTION ******************************************/ -struct st_mysqlnd_protocol_com_set_option_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_set_option_context - { - MYSQLND_CONN_DATA * conn; - enum_mysqlnd_server_option option; - } context; -}; - - -/* {{{ mysqlnd_com_set_option_run */ -enum_func_status -mysqlnd_com_set_option_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_set_option_command * command = (struct st_mysqlnd_protocol_com_set_option_command *) cmd; - zend_uchar buffer[2]; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - enum_mysqlnd_server_option option = command->context.option; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; - - DBG_ENTER("mysqlnd_com_set_option_run"); - int2store(buffer, (unsigned int) option); - - ret = send_command(conn->payload_decoder_factory, COM_SET_OPTION, buffer, sizeof(buffer), FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - if (PASS == ret) { - ret = send_command_handle_response(conn->payload_decoder_factory, PROT_EOF_PACKET, FALSE, COM_SET_OPTION, TRUE, - conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); - } - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_set_option_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_set_option_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_set_option_command * command; - DBG_ENTER("mysqlnd_com_set_option_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_set_option_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.option = va_arg(args, enum_mysqlnd_server_option); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_set_option_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_DEBUG ******************************************/ -/* {{{ mysqlnd_com_debug_run */ -static enum_func_status -mysqlnd_com_debug_run(void *cmd) -{ - struct st_mysqlnd_protocol_no_params_command * command = (struct st_mysqlnd_protocol_no_params_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; - - DBG_ENTER("mysqlnd_com_debug_run"); - - ret = send_command(conn->payload_decoder_factory, COM_DEBUG, NULL, 0, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - if (PASS == ret) { - ret = send_command_handle_response(conn->payload_decoder_factory, PROT_EOF_PACKET, FALSE, COM_DEBUG, TRUE, - conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); - } - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_debug_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_debug_create_command(va_list args) -{ - struct st_mysqlnd_protocol_no_params_command * command; - DBG_ENTER("mysqlnd_com_debug_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_no_params_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->parent.free_command = mysqlnd_com_no_params_free_command; - - command->parent.run = mysqlnd_com_debug_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_INIT_DB ******************************************/ -struct st_mysqlnd_protocol_com_init_db_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_init_db_context - { - MYSQLND_CONN_DATA * conn; - MYSQLND_CSTRING db; - } context; -}; - - -/* {{{ mysqlnd_com_init_db_run */ -static enum_func_status -mysqlnd_com_init_db_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_init_db_command * command = (struct st_mysqlnd_protocol_com_init_db_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - const MYSQLND_CSTRING db = command->context.db; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; - - DBG_ENTER("mysqlnd_com_init_db_run"); - - ret = send_command(conn->payload_decoder_factory, COM_INIT_DB, (zend_uchar*) command->context.db.s, command->context.db.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - if (PASS == ret) { - ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_INIT_DB, TRUE, - conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); - } - - /* - The server sends 0 but libmysql doesn't read it and has established - a protocol of giving back -1. Thus we have to follow it :( - */ - UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); - if (ret == PASS) { - if (conn->connect_or_select_db.s) { - mnd_pefree(conn->connect_or_select_db.s, conn->persistent); - } - conn->connect_or_select_db.s = mnd_pestrndup(db.s, db.l, conn->persistent); - conn->connect_or_select_db.l = db.l; - if (!conn->connect_or_select_db.s) { - /* OOM */ - SET_OOM_ERROR(conn->error_info); - ret = FAIL; - } - } - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_init_db_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_init_db_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_init_db_command * command; - DBG_ENTER("mysqlnd_com_init_db_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_init_db_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.db = va_arg(args, MYSQLND_CSTRING); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_init_db_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_PING ******************************************/ -/* {{{ mysqlnd_com_ping_run */ -static enum_func_status -mysqlnd_com_ping_run(void *cmd) -{ - struct st_mysqlnd_protocol_no_params_command * command = (struct st_mysqlnd_protocol_no_params_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; - - DBG_ENTER("mysqlnd_com_ping_run"); - - ret = send_command(conn->payload_decoder_factory, COM_PING, NULL, 0, TRUE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - if (PASS == ret) { - ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, TRUE, COM_PING, TRUE, - conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); - } - /* - The server sends 0 but libmysql doesn't read it and has established - a protocol of giving back -1. Thus we have to follow it :( - */ - UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_ping_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_ping_create_command(va_list args) -{ - struct st_mysqlnd_protocol_no_params_command * command; - DBG_ENTER("mysqlnd_com_ping_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_no_params_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->parent.free_command = mysqlnd_com_no_params_free_command; - - command->parent.run = mysqlnd_com_ping_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_STATISTICS ******************************************/ -struct st_mysqlnd_protocol_com_statistics_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_statistics_context - { - MYSQLND_CONN_DATA * conn; - zend_string ** message; - } context; -}; - - -/* {{{ mysqlnd_com_statistics_run */ -static enum_func_status -mysqlnd_com_statistics_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_statistics_command * command = (struct st_mysqlnd_protocol_com_statistics_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - zend_string **message = command->context.message; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - - DBG_ENTER("mysqlnd_com_statistics_run"); - - ret = send_command(conn->payload_decoder_factory, COM_STATISTICS, NULL, 0, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - - if (PASS == ret) { - MYSQLND_PACKET_STATS * stats_header = conn->payload_decoder_factory->m.get_stats_packet(conn->payload_decoder_factory, FALSE); - if (!stats_header) { - SET_OOM_ERROR(conn->error_info); - } else { - if (PASS == (ret = PACKET_READ(stats_header))) { - /* will be freed by Zend, thus don't use the mnd_ allocator */ - *message = zend_string_init(stats_header->message.s, stats_header->message.l, 0); - DBG_INF(ZSTR_VAL(*message)); - } - PACKET_FREE(stats_header); - } - } - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_statistics_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_statistics_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_statistics_command * command; - DBG_ENTER("mysqlnd_com_statistics_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_statistics_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.message = va_arg(args, zend_string **); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_statistics_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - -/************************** COM_PROCESS_KILL ******************************************/ -struct st_mysqlnd_protocol_com_process_kill_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_process_kill_context - { - MYSQLND_CONN_DATA * conn; - unsigned int process_id; - zend_bool read_response; - } context; -}; - - -/* {{{ mysqlnd_com_process_kill_run */ -enum_func_status -mysqlnd_com_process_kill_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_process_kill_command * command = (struct st_mysqlnd_protocol_com_process_kill_command *) cmd; - zend_uchar buff[4]; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - zend_bool read_response = command->context.read_response; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; - - DBG_ENTER("mysqlnd_com_process_kill_run"); - int4store(buff, command->context.process_id); - - ret = send_command(conn->payload_decoder_factory, COM_PROCESS_KILL, buff, 4, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - if (PASS == ret && read_response) { - ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE, - conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); - } - - if (read_response) { - /* - The server sends 0 but libmysql doesn't read it and has established - a protocol of giving back -1. Thus we have to follow it :( - */ - UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); - } else if (PASS == ret) { - SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); - conn->m->send_close(conn); - } - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_process_kill_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_process_kill_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_process_kill_command * command; - DBG_ENTER("mysqlnd_com_process_kill_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_process_kill_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.process_id = va_arg(args, unsigned int); - command->context.read_response = va_arg(args, unsigned int)? TRUE:FALSE; - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_process_kill_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - -/************************** COM_REFRESH ******************************************/ -struct st_mysqlnd_protocol_com_refresh_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_refresh_context - { - MYSQLND_CONN_DATA * conn; - uint8_t options; - } context; -}; - - -/* {{{ mysqlnd_com_refresh_run */ -enum_func_status -mysqlnd_com_refresh_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_refresh_command * command = (struct st_mysqlnd_protocol_com_refresh_command *) cmd; - zend_uchar bits[1]; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; - - DBG_ENTER("mysqlnd_com_refresh_run"); - int1store(bits, command->context.options); - - ret = send_command(conn->payload_decoder_factory, COM_REFRESH, bits, 1, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - if (PASS == ret) { - ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_REFRESH, TRUE, - conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); - } - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_refresh_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_refresh_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_refresh_command * command; - DBG_ENTER("mysqlnd_com_refresh_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_refresh_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.options = va_arg(args, unsigned int); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_refresh_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_SHUTDOWN ******************************************/ -struct st_mysqlnd_protocol_com_shutdown_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_shutdown_context - { - MYSQLND_CONN_DATA * conn; - uint8_t level; - } context; -}; - - -/* {{{ mysqlnd_com_shutdown_run */ -enum_func_status -mysqlnd_com_shutdown_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_shutdown_command * command = (struct st_mysqlnd_protocol_com_shutdown_command *) cmd; - zend_uchar bits[1]; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; - - DBG_ENTER("mysqlnd_com_shutdown_run"); - int1store(bits, command->context.level); - - ret = send_command(conn->payload_decoder_factory, COM_SHUTDOWN, bits, 1, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - if (PASS == ret) { - ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_SHUTDOWN, TRUE, - conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); - } - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_shutdown_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_shutdown_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_shutdown_command * command; - DBG_ENTER("mysqlnd_com_shutdown_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_shutdown_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.level = va_arg(args, unsigned int); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_shutdown_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_QUIT ******************************************/ -struct st_mysqlnd_protocol_com_quit_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_quit_context - { - MYSQLND_CONN_DATA * conn; - } context; -}; - - -/* {{{ mysqlnd_com_quit_run */ -enum_func_status -mysqlnd_com_quit_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_quit_command * command = (struct st_mysqlnd_protocol_com_quit_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - - DBG_ENTER("mysqlnd_com_quit_run"); - - ret = send_command(conn->payload_decoder_factory, COM_QUIT, NULL, 0, TRUE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_quit_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_quit_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_quit_command * command; - DBG_ENTER("mysqlnd_com_quit_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_quit_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_quit_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - -/************************** COM_QUERY ******************************************/ -struct st_mysqlnd_protocol_com_query_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_query_context - { - MYSQLND_CONN_DATA * conn; - MYSQLND_CSTRING query; - } context; -}; - - -/* {{{ mysqlnd_com_query_run */ -static enum_func_status -mysqlnd_com_query_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_query_command * command = (struct st_mysqlnd_protocol_com_query_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - - DBG_ENTER("mysqlnd_com_query_run"); - - ret = send_command(conn->payload_decoder_factory, COM_QUERY, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - - if (PASS == ret) { - SET_CONNECTION_STATE(&conn->state, CONN_QUERY_SENT); - } - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_query_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_query_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_query_command * command; - DBG_ENTER("mysqlnd_com_query_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_query_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.query = va_arg(args, MYSQLND_CSTRING); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_query_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - -/************************** COM_CHANGE_USER ******************************************/ -struct st_mysqlnd_protocol_com_change_user_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_change_user_context - { - MYSQLND_CONN_DATA * conn; - MYSQLND_CSTRING payload; - zend_bool silent; - } context; -}; - - -/* {{{ mysqlnd_com_change_user_run */ -static enum_func_status -mysqlnd_com_change_user_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_change_user_command * command = (struct st_mysqlnd_protocol_com_change_user_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - - DBG_ENTER("mysqlnd_com_change_user_run"); - - ret = send_command(conn->payload_decoder_factory, COM_CHANGE_USER, (zend_uchar*) command->context.payload.s, command->context.payload.l, command->context.silent, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_change_user_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_change_user_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_change_user_command * command; - DBG_ENTER("mysqlnd_com_change_user_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_change_user_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.payload = va_arg(args, MYSQLND_CSTRING); - command->context.silent = va_arg(args, unsigned int); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_change_user_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_REAP_RESULT ******************************************/ -struct st_mysqlnd_protocol_com_reap_result_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_reap_result_context - { - MYSQLND_CONN_DATA * conn; - } context; -}; - - -/* {{{ mysqlnd_com_reap_result_run */ -static enum_func_status -mysqlnd_com_reap_result_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_reap_result_command * command = (struct st_mysqlnd_protocol_com_reap_result_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - const enum_mysqlnd_connection_state state = GET_CONNECTION_STATE(&conn->state); - - DBG_ENTER("mysqlnd_com_reap_result_run"); - if (state <= CONN_READY || state == CONN_QUIT_SENT) { - php_error_docref(NULL, E_WARNING, "Connection not opened, clear or has been closed"); - DBG_ERR_FMT("Connection not opened, clear or has been closed. State=%u", state); - DBG_RETURN(ret); - } - ret = conn->m->query_read_result_set_header(conn, NULL); - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_reap_result_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_reap_result_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_reap_result_command * command; - DBG_ENTER("mysqlnd_com_reap_result_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_reap_result_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_reap_result_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_STMT_PREPARE ******************************************/ -struct st_mysqlnd_protocol_com_stmt_prepare_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_stmt_prepare_context - { - MYSQLND_CONN_DATA * conn; - MYSQLND_CSTRING query; - } context; -}; - - -/* {{{ mysqlnd_com_stmt_prepare_run */ -static enum_func_status -mysqlnd_com_stmt_prepare_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_stmt_prepare_command * command = (struct st_mysqlnd_protocol_com_stmt_prepare_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - - DBG_ENTER("mysqlnd_com_stmt_prepare_run"); - - ret = send_command(conn->payload_decoder_factory, COM_STMT_PREPARE, (zend_uchar*) command->context.query.s, command->context.query.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_stmt_prepare_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_stmt_prepare_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_stmt_prepare_command * command; - DBG_ENTER("mysqlnd_com_stmt_prepare_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_prepare_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.query = va_arg(args, MYSQLND_CSTRING); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_stmt_prepare_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_STMT_EXECUTE ******************************************/ -struct st_mysqlnd_protocol_com_stmt_execute_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_stmt_execute_context - { - MYSQLND_CONN_DATA * conn; - MYSQLND_CSTRING payload; - } context; -}; - - -/* {{{ mysqlnd_com_stmt_execute_run */ -static enum_func_status -mysqlnd_com_stmt_execute_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_stmt_execute_command * command = (struct st_mysqlnd_protocol_com_stmt_execute_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - - DBG_ENTER("mysqlnd_com_stmt_execute_run"); - - ret = send_command(conn->payload_decoder_factory, COM_STMT_EXECUTE, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_stmt_execute_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_stmt_execute_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_stmt_execute_command * command; - DBG_ENTER("mysqlnd_com_stmt_execute_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_execute_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.payload = va_arg(args, MYSQLND_CSTRING); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_stmt_execute_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_STMT_FETCH ******************************************/ -struct st_mysqlnd_protocol_com_stmt_fetch_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_stmt_fetch_context - { - MYSQLND_CONN_DATA * conn; - MYSQLND_CSTRING payload; - } context; -}; - - -/* {{{ mysqlnd_com_stmt_fetch_run */ -static enum_func_status -mysqlnd_com_stmt_fetch_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_stmt_fetch_command * command = (struct st_mysqlnd_protocol_com_stmt_fetch_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - - DBG_ENTER("mysqlnd_com_stmt_fetch_run"); - - ret = send_command(conn->payload_decoder_factory, COM_STMT_FETCH, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_stmt_fetch_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_stmt_fetch_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_stmt_fetch_command * command; - DBG_ENTER("mysqlnd_com_stmt_fetch_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_fetch_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.payload = va_arg(args, MYSQLND_CSTRING); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_stmt_fetch_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_STMT_RESET ******************************************/ -struct st_mysqlnd_protocol_com_stmt_reset_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_stmt_reset_context - { - MYSQLND_CONN_DATA * conn; - zend_ulong stmt_id; - } context; -}; - - -/* {{{ mysqlnd_com_stmt_reset_run */ -static enum_func_status -mysqlnd_com_stmt_reset_run(void *cmd) -{ - zend_uchar cmd_buf[MYSQLND_STMT_ID_LENGTH /* statement id */]; - struct st_mysqlnd_protocol_com_stmt_reset_command * command = (struct st_mysqlnd_protocol_com_stmt_reset_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response = conn->payload_decoder_factory->m.send_command_handle_response; - - DBG_ENTER("mysqlnd_com_stmt_reset_run"); - - int4store(cmd_buf, command->context.stmt_id); - ret = send_command(conn->payload_decoder_factory, COM_STMT_RESET, cmd_buf, sizeof(cmd_buf), FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - if (PASS == ret) { - ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_STMT_RESET, TRUE, - conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent); - } - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_stmt_reset_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_stmt_reset_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_stmt_reset_command * command; - DBG_ENTER("mysqlnd_com_stmt_reset_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_reset_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.stmt_id = va_arg(args, size_t); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_stmt_reset_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_STMT_SEND_LONG_DATA ******************************************/ -struct st_mysqlnd_protocol_com_stmt_send_long_data_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_stmt_send_long_data_context - { - MYSQLND_CONN_DATA * conn; - MYSQLND_CSTRING payload; - } context; -}; - - -/* {{{ mysqlnd_com_stmt_send_long_data_run */ -static enum_func_status -mysqlnd_com_stmt_send_long_data_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_stmt_send_long_data_command * command = (struct st_mysqlnd_protocol_com_stmt_send_long_data_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - - DBG_ENTER("mysqlnd_com_stmt_send_long_data_run"); - - ret = send_command(conn->payload_decoder_factory, COM_STMT_SEND_LONG_DATA, (zend_uchar*) command->context.payload.s, command->context.payload.l, FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_stmt_send_long_data_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_stmt_send_long_data_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_stmt_send_long_data_command * command; - DBG_ENTER("mysqlnd_com_stmt_send_long_data_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_send_long_data_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.payload = va_arg(args, MYSQLND_CSTRING); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_stmt_send_long_data_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - -/************************** COM_STMT_CLOSE ******************************************/ -struct st_mysqlnd_protocol_com_stmt_close_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_stmt_close_context - { - MYSQLND_CONN_DATA * conn; - zend_ulong stmt_id; - } context; -}; - - -/* {{{ mysqlnd_com_stmt_close_run */ -static enum_func_status -mysqlnd_com_stmt_close_run(void *cmd) -{ - zend_uchar cmd_buf[MYSQLND_STMT_ID_LENGTH /* statement id */]; - struct st_mysqlnd_protocol_com_stmt_close_command * command = (struct st_mysqlnd_protocol_com_stmt_close_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - func_mysqlnd_protocol_payload_decoder_factory__send_command send_command = conn->payload_decoder_factory->m.send_command; - - DBG_ENTER("mysqlnd_com_stmt_close_run"); - - int4store(cmd_buf, command->context.stmt_id); - ret = send_command(conn->payload_decoder_factory, COM_STMT_CLOSE, cmd_buf, sizeof(cmd_buf), FALSE, - &conn->state, - conn->error_info, - conn->upsert_status, - conn->stats, - conn->m->send_close, - conn); - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_stmt_close_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_stmt_close_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_stmt_close_command * command; - DBG_ENTER("mysqlnd_com_stmt_close_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_stmt_close_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.stmt_id = va_arg(args, size_t); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_stmt_close_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - - -/************************** COM_ENABLE_SSL ******************************************/ -struct st_mysqlnd_protocol_com_enable_ssl_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_enable_ssl_context - { - MYSQLND_CONN_DATA * conn; - size_t client_capabilities; - size_t server_capabilities; - unsigned int charset_no; - } context; -}; - - -/* {{{ mysqlnd_com_enable_ssl_run */ -static enum_func_status -mysqlnd_com_enable_ssl_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_enable_ssl_command * command = (struct st_mysqlnd_protocol_com_enable_ssl_command *) cmd; - enum_func_status ret = FAIL; - MYSQLND_CONN_DATA * conn = command->context.conn; - MYSQLND_PACKET_AUTH * auth_packet; - size_t client_capabilities = command->context.client_capabilities; - size_t server_capabilities = command->context.server_capabilities; - - DBG_ENTER("mysqlnd_com_enable_ssl_run"); - DBG_INF_FMT("client_capability_flags=%lu", client_capabilities); - DBG_INF_FMT("CLIENT_LONG_PASSWORD= %d", client_capabilities & CLIENT_LONG_PASSWORD? 1:0); - DBG_INF_FMT("CLIENT_FOUND_ROWS= %d", client_capabilities & CLIENT_FOUND_ROWS? 1:0); - DBG_INF_FMT("CLIENT_LONG_FLAG= %d", client_capabilities & CLIENT_LONG_FLAG? 1:0); - DBG_INF_FMT("CLIENT_NO_SCHEMA= %d", client_capabilities & CLIENT_NO_SCHEMA? 1:0); - DBG_INF_FMT("CLIENT_COMPRESS= %d", client_capabilities & CLIENT_COMPRESS? 1:0); - DBG_INF_FMT("CLIENT_ODBC= %d", client_capabilities & CLIENT_ODBC? 1:0); - DBG_INF_FMT("CLIENT_LOCAL_FILES= %d", client_capabilities & CLIENT_LOCAL_FILES? 1:0); - DBG_INF_FMT("CLIENT_IGNORE_SPACE= %d", client_capabilities & CLIENT_IGNORE_SPACE? 1:0); - DBG_INF_FMT("CLIENT_PROTOCOL_41= %d", client_capabilities & CLIENT_PROTOCOL_41? 1:0); - DBG_INF_FMT("CLIENT_INTERACTIVE= %d", client_capabilities & CLIENT_INTERACTIVE? 1:0); - DBG_INF_FMT("CLIENT_SSL= %d", client_capabilities & CLIENT_SSL? 1:0); - DBG_INF_FMT("CLIENT_IGNORE_SIGPIPE= %d", client_capabilities & CLIENT_IGNORE_SIGPIPE? 1:0); - DBG_INF_FMT("CLIENT_TRANSACTIONS= %d", client_capabilities & CLIENT_TRANSACTIONS? 1:0); - DBG_INF_FMT("CLIENT_RESERVED= %d", client_capabilities & CLIENT_RESERVED? 1:0); - DBG_INF_FMT("CLIENT_SECURE_CONNECTION=%d", client_capabilities & CLIENT_SECURE_CONNECTION? 1:0); - DBG_INF_FMT("CLIENT_MULTI_STATEMENTS=%d", client_capabilities & CLIENT_MULTI_STATEMENTS? 1:0); - DBG_INF_FMT("CLIENT_MULTI_RESULTS= %d", client_capabilities & CLIENT_MULTI_RESULTS? 1:0); - DBG_INF_FMT("CLIENT_PS_MULTI_RESULTS=%d", client_capabilities & CLIENT_PS_MULTI_RESULTS? 1:0); - DBG_INF_FMT("CLIENT_CONNECT_ATTRS= %d", client_capabilities & CLIENT_PLUGIN_AUTH? 1:0); - DBG_INF_FMT("CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA= %d", client_capabilities & CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA? 1:0); - DBG_INF_FMT("CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS= %d", client_capabilities & CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS? 1:0); - DBG_INF_FMT("CLIENT_SESSION_TRACK= %d", client_capabilities & CLIENT_SESSION_TRACK? 1:0); - DBG_INF_FMT("CLIENT_SSL_VERIFY_SERVER_CERT= %d", client_capabilities & CLIENT_SSL_VERIFY_SERVER_CERT? 1:0); - DBG_INF_FMT("CLIENT_REMEMBER_OPTIONS= %d", client_capabilities & CLIENT_REMEMBER_OPTIONS? 1:0); - - auth_packet = conn->payload_decoder_factory->m.get_auth_packet(conn->payload_decoder_factory, FALSE); - if (!auth_packet) { - SET_OOM_ERROR(conn->error_info); - goto end; - } - auth_packet->client_flags = client_capabilities; - auth_packet->max_packet_size = MYSQLND_ASSEMBLED_PACKET_MAX_SIZE; - - auth_packet->charset_no = command->context.charset_no; - -#ifdef MYSQLND_SSL_SUPPORTED - if (client_capabilities & CLIENT_SSL) { - const zend_bool server_has_ssl = (server_capabilities & CLIENT_SSL)? TRUE:FALSE; - if (server_has_ssl == FALSE) { - goto close_conn; - } else { - enum mysqlnd_ssl_peer verify = client_capabilities & CLIENT_SSL_VERIFY_SERVER_CERT? - MYSQLND_SSL_PEER_VERIFY: - (client_capabilities & CLIENT_SSL_DONT_VERIFY_SERVER_CERT? - MYSQLND_SSL_PEER_DONT_VERIFY: - MYSQLND_SSL_PEER_DEFAULT); - DBG_INF("Switching to SSL"); - if (!PACKET_WRITE(auth_packet)) { - goto close_conn; - } - - conn->vio->data->m.set_client_option(conn->vio, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, (const char *) &verify); - - if (FAIL == conn->vio->data->m.enable_ssl(conn->vio)) { - goto end; - } - } - } -#else - auth_packet->client_flags &= ~CLIENT_SSL; - if (!PACKET_WRITE(auth_packet)) { - goto close_conn; - } -#endif - ret = PASS; -end: - PACKET_FREE(auth_packet); - DBG_RETURN(ret); - -close_conn: - SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT); - conn->m->send_close(conn); - SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); - PACKET_FREE(auth_packet); - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_com_enable_ssl_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_enable_ssl_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_enable_ssl_command * command; - DBG_ENTER("mysqlnd_com_enable_ssl_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_enable_ssl_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.client_capabilities = va_arg(args, size_t); - command->context.server_capabilities = va_arg(args, size_t); - command->context.charset_no = va_arg(args, unsigned int); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_enable_ssl_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - -/************************** COM_READ_HANDSHAKE ******************************************/ -struct st_mysqlnd_protocol_com_handshake_command -{ - struct st_mysqlnd_protocol_command parent; - struct st_mysqlnd_com_handshake_context - { - MYSQLND_CONN_DATA * conn; - MYSQLND_CSTRING user; - MYSQLND_CSTRING passwd; - MYSQLND_CSTRING database; - size_t client_flags; - } context; -}; - - -/* {{{ mysqlnd_com_handshake_run */ -static enum_func_status -mysqlnd_com_handshake_run(void *cmd) -{ - struct st_mysqlnd_protocol_com_handshake_command * command = (struct st_mysqlnd_protocol_com_handshake_command *) cmd; - const char * user = command->context.user.s; - - const char * passwd = command->context.passwd.s; - size_t passwd_len = command->context.passwd.l; - - const char * db = command->context.database.s; - size_t db_len = command->context.database.l; - - size_t mysql_flags = command->context.client_flags; - - MYSQLND_CONN_DATA * conn = command->context.conn; - MYSQLND_PACKET_GREET * greet_packet; - - DBG_ENTER("mysqlnd_conn_data::connect_handshake"); - DBG_INF_FMT("stream=%p", conn->vio->data->m.get_stream(conn->vio)); - DBG_INF_FMT("[user=%s] [db=%s:%d] [flags=%llu]", user, db, db_len, mysql_flags); - - greet_packet = conn->payload_decoder_factory->m.get_greet_packet(conn->payload_decoder_factory, FALSE); - if (!greet_packet) { - SET_OOM_ERROR(conn->error_info); - DBG_RETURN(FAIL); /* OOM */ - } - - if (FAIL == PACKET_READ(greet_packet)) { - DBG_ERR("Error while reading greeting packet"); - php_error_docref(NULL, E_WARNING, "Error while reading greeting packet. PID=%d", getpid()); - goto err; - } else if (greet_packet->error_no) { - DBG_ERR_FMT("errorno=%u error=%s", greet_packet->error_no, greet_packet->error); - SET_CLIENT_ERROR(conn->error_info, greet_packet->error_no, greet_packet->sqlstate, greet_packet->error); - goto err; - } else if (greet_packet->pre41) { - DBG_ERR_FMT("Connecting to 3.22, 3.23 & 4.0 is not supported. Server is %-.32s", greet_packet->server_version); - php_error_docref(NULL, E_WARNING, "Connecting to 3.22, 3.23 & 4.0 " - " is not supported. Server is %-.32s", greet_packet->server_version); - SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, - "Connecting to 3.22, 3.23 & 4.0 servers is not supported"); - goto err; - } - - conn->thread_id = greet_packet->thread_id; - conn->protocol_version = greet_packet->protocol_version; - conn->server_version = mnd_pestrdup(greet_packet->server_version, conn->persistent); - - conn->greet_charset = mysqlnd_find_charset_nr(greet_packet->charset_no); - if (!conn->greet_charset) { - php_error_docref(NULL, E_WARNING, - "Server sent charset (%d) unknown to the client. Please, report to the developers", greet_packet->charset_no); - SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, - "Server sent charset unknown to the client. Please, report to the developers"); - goto err; - } - - conn->server_capabilities = greet_packet->server_capabilities; - - if (FAIL == mysqlnd_connect_run_authentication(conn, user, passwd, db, db_len, (size_t) passwd_len, - greet_packet->authentication_plugin_data, greet_packet->auth_protocol, - greet_packet->charset_no, greet_packet->server_capabilities, - conn->options, mysql_flags)) - { - goto err; - } - - UPSERT_STATUS_RESET(conn->upsert_status); - UPSERT_STATUS_SET_SERVER_STATUS(conn->upsert_status, greet_packet->server_status); - - PACKET_FREE(greet_packet); - DBG_RETURN(PASS); -err: - conn->server_capabilities = 0; - PACKET_FREE(greet_packet); - DBG_RETURN(FAIL); -} -/* }}} */ - - -/* {{{ mysqlnd_com_handshake_create_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_com_handshake_create_command(va_list args) -{ - struct st_mysqlnd_protocol_com_handshake_command * command; - DBG_ENTER("mysqlnd_com_handshake_create_command"); - command = mnd_ecalloc(1, sizeof(struct st_mysqlnd_protocol_com_handshake_command)); - if (command) { - command->context.conn = va_arg(args, MYSQLND_CONN_DATA *); - command->context.user = *va_arg(args, const MYSQLND_CSTRING *); - command->context.passwd = *va_arg(args, const MYSQLND_CSTRING *); - command->context.database = *va_arg(args, const MYSQLND_CSTRING *); - command->context.client_flags = va_arg(args, size_t); - - command->parent.free_command = mysqlnd_com_no_params_free_command; - command->parent.run = mysqlnd_com_handshake_run; - } - - DBG_RETURN((struct st_mysqlnd_protocol_command *) command); -} -/* }}} */ - - - -/* {{{ mysqlnd_get_command */ -static struct st_mysqlnd_protocol_command * -mysqlnd_get_command(enum php_mysqlnd_server_command command, ...) -{ - struct st_mysqlnd_protocol_command * ret; - va_list args; - DBG_ENTER("mysqlnd_get_command"); - - va_start(args, command); - switch (command) { - case COM_SET_OPTION: - ret = mysqlnd_com_set_option_create_command(args); - break; - case COM_DEBUG: - ret = mysqlnd_com_debug_create_command(args); - break; - case COM_INIT_DB: - ret = mysqlnd_com_init_db_create_command(args); - break; - case COM_PING: - ret = mysqlnd_com_ping_create_command(args); - break; - case COM_STATISTICS: - ret = mysqlnd_com_statistics_create_command(args); - break; - case COM_PROCESS_KILL: - ret = mysqlnd_com_process_kill_create_command(args); - break; - case COM_REFRESH: - ret = mysqlnd_com_refresh_create_command(args); - break; - case COM_SHUTDOWN: - ret = mysqlnd_com_shutdown_create_command(args); - break; - case COM_QUIT: - ret = mysqlnd_com_quit_create_command(args); - break; - case COM_QUERY: - ret = mysqlnd_com_query_create_command(args); - break; - case COM_REAP_RESULT: - ret = mysqlnd_com_reap_result_create_command(args); - break; - case COM_CHANGE_USER: - ret = mysqlnd_com_change_user_create_command(args); - break; - case COM_STMT_PREPARE: - ret = mysqlnd_com_stmt_prepare_create_command(args); - break; - case COM_STMT_EXECUTE: - ret = mysqlnd_com_stmt_execute_create_command(args); - break; - case COM_STMT_FETCH: - ret = mysqlnd_com_stmt_fetch_create_command(args); - break; - case COM_STMT_RESET: - ret = mysqlnd_com_stmt_reset_create_command(args); - break; - case COM_STMT_SEND_LONG_DATA: - ret = mysqlnd_com_stmt_send_long_data_create_command(args); - break; - case COM_STMT_CLOSE: - ret = mysqlnd_com_stmt_close_create_command(args); - break; - case COM_ENABLE_SSL: - ret = mysqlnd_com_enable_ssl_create_command(args); - break; - case COM_HANDSHAKE: - ret = mysqlnd_com_handshake_create_command(args); - break; - default: - break; - } - va_end(args); - DBG_RETURN(ret); -} -/* }}} */ - -func_mysqlnd__command_factory mysqlnd_command_factory = mysqlnd_get_command; - /* * Local variables: * tab-width: 4 -- cgit v1.2.1 From e8ace2d4db77789f1d8ae452c008a2b952dbe29d Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Tue, 10 Nov 2015 13:32:59 +0100 Subject: MNDR: - remove inclusion of uneeded headers --- ext/mysqlnd/mysqlnd_wireprotocol.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index dd239d5545..221b089442 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -17,9 +17,7 @@ | Georg Richter | +----------------------------------------------------------------------+ */ - #include "php.h" -#include "php_globals.h" #include "mysqlnd.h" #include "mysqlnd_priv.h" #include "mysqlnd_wireprotocol.h" -- cgit v1.2.1 From 2e3fc57c5c205e352a805830fd3ec4c7dbfa2efa Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Tue, 10 Nov 2015 14:25:06 +0100 Subject: MNDR: - move things out of mysqlnd_priv.h --- ext/mysqlnd/mysqlnd_wireprotocol.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 221b089442..868e383052 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -19,6 +19,8 @@ */ #include "php.h" #include "mysqlnd.h" +#include "mysqlnd_connection.h" +#include "mysqlnd_ps.h" #include "mysqlnd_priv.h" #include "mysqlnd_wireprotocol.h" #include "mysqlnd_statistics.h" -- cgit v1.2.1 From 94ce013bff1e81b218bbb4100cd3267e23f90158 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Tue, 10 Nov 2015 14:28:44 +0100 Subject: MNDR: - remove unused macros --- ext/mysqlnd/mysqlnd_wireprotocol.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 868e383052..08bb762ae5 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -26,9 +26,6 @@ #include "mysqlnd_statistics.h" #include "mysqlnd_debug.h" -#define MYSQLND_SILENT 1 -#define MYSQLND_DUMP_HEADER_N_BODY - #define BAIL_IF_NO_MORE_DATA \ if ((size_t)(p - begin) > packet->header.size) { \ php_error_docref(NULL, E_WARNING, "Premature end of data (mysqlnd_wireprotocol.c:%u)", __LINE__); \ @@ -257,9 +254,7 @@ mysqlnd_read_header(MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER header->size = uint3korr(buffer); header->packet_no = uint1korr(buffer + 3); -#ifdef MYSQLND_DUMP_HEADER_N_BODY DBG_INF_FMT("HEADER: prot_packet_no=%u size=%3u", header->packet_no, header->size); -#endif MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, STAT_PROTOCOL_OVERHEAD_IN, MYSQLND_HEADER_SIZE, STAT_PACKETS_RECEIVED, 1); -- cgit v1.2.1 From c24d452f6046b5d1b415aa0438ef71fa35ae843f Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Tue, 10 Nov 2015 16:59:34 +0100 Subject: MNDR: - less dereferencing in mysqlnd_ps . Dereference stmt->conn only once and use a stack variable. Also make the source cleaner. --- ext/mysqlnd/mysqlnd_wireprotocol.c | 89 +++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 44 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 08bb762ae5..ca7c19ede8 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -92,9 +92,9 @@ static enum_mysqlnd_collected_stats packet_type_to_statistic_packet_count[PROT_L /* {{{ php_mysqlnd_net_field_length Get next field's length */ zend_ulong -php_mysqlnd_net_field_length(zend_uchar **packet) +php_mysqlnd_net_field_length(const zend_uchar **packet) { - register zend_uchar *p= (zend_uchar *)*packet; + register const zend_uchar *p= (const zend_uchar *)*packet; if (*p < 251) { (*packet)++; @@ -122,9 +122,9 @@ php_mysqlnd_net_field_length(zend_uchar **packet) /* {{{ php_mysqlnd_net_field_length_ll Get next field's length */ uint64_t -php_mysqlnd_net_field_length_ll(zend_uchar **packet) +php_mysqlnd_net_field_length_ll(const zend_uchar **packet) { - register zend_uchar *p = (zend_uchar *)*packet; + register const zend_uchar *p = (zend_uchar *)*packet; if (*p < 251) { (*packet)++; @@ -151,7 +151,7 @@ php_mysqlnd_net_field_length_ll(zend_uchar **packet) /* {{{ php_mysqlnd_net_store_length */ zend_uchar * -php_mysqlnd_net_store_length(zend_uchar *packet, uint64_t length) +php_mysqlnd_net_store_length(zend_uchar *packet, const uint64_t length) { if (length < (uint64_t) L64(251)) { *packet = (zend_uchar) length; @@ -196,12 +196,12 @@ php_mysqlnd_net_store_length_size(uint64_t length) /* {{{ php_mysqlnd_read_error_from_line */ static enum_func_status -php_mysqlnd_read_error_from_line(zend_uchar *buf, size_t buf_len, - char *error, int error_buf_len, - unsigned int *error_no, char *sqlstate) +php_mysqlnd_read_error_from_line(const zend_uchar * const buf, const size_t buf_len, + char *error, const size_t error_buf_len, + unsigned int *error_no, char *sqlstate) { - zend_uchar *p = buf; - int error_msg_len= 0; + const zend_uchar *p = buf; + size_t error_msg_len = 0; DBG_ENTER("php_mysqlnd_read_error_from_line"); @@ -325,9 +325,9 @@ static enum_func_status php_mysqlnd_greet_read(void * _packet) { zend_uchar buf[2048]; - zend_uchar *p = buf; - zend_uchar *begin = buf; - zend_uchar *pad_start = NULL; + const zend_uchar * p = buf; + const zend_uchar * const begin = buf; + const zend_uchar * pad_start = NULL; MYSQLND_PACKET_GREET *packet= (MYSQLND_PACKET_GREET *) _packet; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; MYSQLND_PFC * pfc = packet->header.protocol_frame_codec; @@ -495,7 +495,7 @@ size_t php_mysqlnd_auth_write(void * _packet) { zend_uchar buffer[AUTH_WRITE_BUFFER_LEN]; zend_uchar *p = buffer + MYSQLND_HEADER_SIZE; /* start after the header */ - int len; + size_t len; MYSQLND_PACKET_AUTH * packet= (MYSQLND_PACKET_AUTH *) _packet; MYSQLND_CONN_DATA * conn = packet->header.conn; MYSQLND_ERROR_INFO * error_info = packet->header.error_info; @@ -569,7 +569,7 @@ size_t php_mysqlnd_auth_write(void * _packet) } if (packet->auth_plugin_name) { - size_t len = MIN(strlen(packet->auth_plugin_name), sizeof(buffer) - (p - buffer) - 1); + len = MIN(strlen(packet->auth_plugin_name), sizeof(buffer) - (p - buffer) - 1); memcpy(p, packet->auth_plugin_name, len); p+= len; *p++= '\0'; @@ -668,9 +668,8 @@ php_mysqlnd_auth_response_read(void * _packet) zend_uchar local_buf[AUTH_RESP_BUFFER_SIZE]; size_t buf_len = vio->cmd_buffer.buffer? vio->cmd_buffer.length: AUTH_RESP_BUFFER_SIZE; zend_uchar *buf = vio->cmd_buffer.buffer? (zend_uchar *) vio->cmd_buffer.buffer : local_buf; - zend_uchar *p = buf; - zend_uchar *begin = buf; - zend_ulong i; + const zend_uchar * p = buf; + const zend_uchar * const begin = buf; DBG_ENTER("php_mysqlnd_auth_response_read"); @@ -715,6 +714,7 @@ php_mysqlnd_auth_response_read(void * _packet) DBG_INF_FMT("Server salt : [%d][%.*s]", packet->new_auth_protocol_data_len, packet->new_auth_protocol_data_len, packet->new_auth_protocol_data); } } else { + zend_ulong net_len; /* Everything was fine! */ packet->affected_rows = php_mysqlnd_net_field_length_ll(&p); BAIL_IF_NO_MORE_DATA; @@ -731,8 +731,8 @@ php_mysqlnd_auth_response_read(void * _packet) BAIL_IF_NO_MORE_DATA; /* There is a message */ - if (packet->header.size > (size_t) (p - buf) && (i = php_mysqlnd_net_field_length(&p))) { - packet->message_len = MIN(i, buf_len - (p - begin)); + if (packet->header.size > (size_t) (p - buf) && (net_len = php_mysqlnd_net_field_length(&p))) { + packet->message_len = MIN(net_len, buf_len - (p - begin)); packet->message = mnd_pestrndup((char *)p, packet->message_len, FALSE); } else { packet->message = NULL; @@ -793,7 +793,7 @@ php_mysqlnd_change_auth_response_write(void * _packet) MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; zend_uchar * buffer = vio->cmd_buffer.length >= packet->auth_data_len? vio->cmd_buffer.buffer : mnd_emalloc(packet->auth_data_len); - zend_uchar *p = buffer + MYSQLND_HEADER_SIZE; /* start after the header */ + zend_uchar * p = buffer + MYSQLND_HEADER_SIZE; /* start after the header */ DBG_ENTER("php_mysqlnd_change_auth_response_write"); @@ -842,10 +842,10 @@ php_mysqlnd_ok_read(void * _packet) MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; zend_uchar local_buf[OK_BUFFER_SIZE]; size_t buf_len = vio->cmd_buffer.buffer? vio->cmd_buffer.length : OK_BUFFER_SIZE; - zend_uchar *buf = vio->cmd_buffer.buffer? (zend_uchar *) vio->cmd_buffer.buffer : local_buf; - zend_uchar *p = buf; - zend_uchar *begin = buf; - zend_ulong i; + zend_uchar * buf = vio->cmd_buffer.buffer? (zend_uchar *) vio->cmd_buffer.buffer : local_buf; + const zend_uchar * p = buf; + const zend_uchar * const begin = buf; + zend_ulong net_len; DBG_ENTER("php_mysqlnd_ok_read"); @@ -882,8 +882,8 @@ php_mysqlnd_ok_read(void * _packet) BAIL_IF_NO_MORE_DATA; /* There is a message */ - if (packet->header.size > (size_t) (p - buf) && (i = php_mysqlnd_net_field_length(&p))) { - packet->message_len = MIN(i, buf_len - (p - begin)); + if (packet->header.size > (size_t) (p - buf) && (net_len = php_mysqlnd_net_field_length(&p))) { + packet->message_len = MIN(net_len, buf_len - (p - begin)); packet->message = mnd_pestrndup((char *)p, packet->message_len, FALSE); } else { packet->message = NULL; @@ -939,9 +939,9 @@ php_mysqlnd_eof_read(void * _packet) MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; size_t buf_len = vio->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; - zend_uchar *p = buf; - zend_uchar *begin = buf; + zend_uchar * buf = (zend_uchar *) vio->cmd_buffer.buffer; + const zend_uchar * p = buf; + const zend_uchar * const begin = buf; DBG_ENTER("php_mysqlnd_eof_read"); @@ -1099,9 +1099,9 @@ php_mysqlnd_rset_header_read(void * _packet) MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; enum_func_status ret = PASS; size_t buf_len = vio->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; - zend_uchar *p = buf; - zend_uchar *begin = buf; + zend_uchar * buf = (zend_uchar *) vio->cmd_buffer.buffer; + const zend_uchar * p = buf; + const zend_uchar * const begin = buf; size_t len; DBG_ENTER("php_mysqlnd_rset_header_read"); @@ -1244,9 +1244,9 @@ php_mysqlnd_rset_field_read(void * _packet) MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; size_t buf_len = vio->cmd_buffer.length, total_len = 0; - zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; - zend_uchar *p = buf; - zend_uchar *begin = buf; + zend_uchar * buf = (zend_uchar *) vio->cmd_buffer.buffer; + const zend_uchar * p = buf; + const zend_uchar * const begin = buf; char *root_ptr; zend_ulong len; MYSQLND_FIELD *meta; @@ -1540,8 +1540,9 @@ php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zv zend_bool as_int_or_float, MYSQLND_STATS * stats) { unsigned int i; - zend_uchar *p = row_buffer->ptr; - zend_uchar *null_ptr, bit; + const zend_uchar * p = row_buffer->ptr; + const zend_uchar * null_ptr; + zend_uchar bit; zval *current_field, *end_field, *start_field; DBG_ENTER("php_mysqlnd_rowp_read_binary_protocol"); @@ -1560,7 +1561,7 @@ php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zv for (i = 0, current_field = start_field; current_field < end_field; current_field++, i++) { enum_mysqlnd_collected_stats statistic; - zend_uchar * orig_p = p; + const zend_uchar * orig_p = p; DBG_INF_FMT("Into zval=%p decoding column %u [%s.%s.%s] type=%u field->flags&unsigned=%u flags=%u is_bit=%u", current_field, i, @@ -1645,7 +1646,7 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, for (i = 0, current_field = start_field; current_field < end_field; current_field++, i++) { /* php_mysqlnd_net_field_length() call should be after *this_field_len_pos = p; */ - zend_ulong len = php_mysqlnd_net_field_length(&p); + const zend_ulong len = php_mysqlnd_net_field_length((const zend_uchar **) &p); /* NULL or NOT NULL, this is the question! */ if (len == MYSQLND_NULL_LENGTH) { @@ -1748,7 +1749,7 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, Definitely not nice, _hackish_ :(, but works. */ zend_uchar *start = bit_area; - ps_fetch_from_1_to_8_bytes(current_field, &(fields_metadata[i]), 0, &p, len); + ps_fetch_from_1_to_8_bytes(current_field, &(fields_metadata[i]), 0, (const zend_uchar **) &p, len); /* We have advanced in ps_fetch_from_1_to_8_bytes. We should go back because later in this function there will be an advancement. @@ -1996,7 +1997,7 @@ php_mysqlnd_prepare_read(void * _packet) size_t buf_len = vio->cmd_buffer.length; zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; zend_uchar *p = buf; - zend_uchar *begin = buf; + const zend_uchar * const begin = buf; unsigned int data_size; DBG_ENTER("php_mysqlnd_prepare_read"); @@ -2091,7 +2092,7 @@ php_mysqlnd_chg_user_read(void * _packet) size_t buf_len = vio->cmd_buffer.length; zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; zend_uchar *p = buf; - zend_uchar *begin = buf; + const zend_uchar * const begin = buf; DBG_ENTER("php_mysqlnd_chg_user_read"); @@ -2220,7 +2221,7 @@ php_mysqlnd_sha256_pk_request_response_read(void * _packet) MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; zend_uchar buf[SHA256_PK_REQUEST_RESP_BUFFER_SIZE]; zend_uchar *p = buf; - zend_uchar *begin = buf; + const zend_uchar * const begin = buf; DBG_ENTER("php_mysqlnd_sha256_pk_request_response_read"); -- cgit v1.2.1 From 4fed8a28d0778459a4adfb774d7d73334b19a1c1 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Mon, 16 Nov 2015 15:37:11 +0100 Subject: mysqlnd refactoring : - move the command buffer out of the networking code to the protocol frame codec. --- ext/mysqlnd/mysqlnd_wireprotocol.c | 40 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index ca7c19ede8..c671dc8a57 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -666,8 +666,8 @@ php_mysqlnd_auth_response_read(void * _packet) MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; zend_uchar local_buf[AUTH_RESP_BUFFER_SIZE]; - size_t buf_len = vio->cmd_buffer.buffer? vio->cmd_buffer.length: AUTH_RESP_BUFFER_SIZE; - zend_uchar *buf = vio->cmd_buffer.buffer? (zend_uchar *) vio->cmd_buffer.buffer : local_buf; + size_t buf_len = pfc->cmd_buffer.buffer? pfc->cmd_buffer.length: AUTH_RESP_BUFFER_SIZE; + zend_uchar *buf = pfc->cmd_buffer.buffer? (zend_uchar *) pfc->cmd_buffer.buffer : local_buf; const zend_uchar * p = buf; const zend_uchar * const begin = buf; @@ -792,7 +792,7 @@ php_mysqlnd_change_auth_response_write(void * _packet) MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; - zend_uchar * buffer = vio->cmd_buffer.length >= packet->auth_data_len? vio->cmd_buffer.buffer : mnd_emalloc(packet->auth_data_len); + zend_uchar * buffer = pfc->cmd_buffer.length >= packet->auth_data_len? pfc->cmd_buffer.buffer : mnd_emalloc(packet->auth_data_len); zend_uchar * p = buffer + MYSQLND_HEADER_SIZE; /* start after the header */ DBG_ENTER("php_mysqlnd_change_auth_response_write"); @@ -804,7 +804,7 @@ php_mysqlnd_change_auth_response_write(void * _packet) { size_t sent = pfc->data->m.send(pfc, vio, buffer, p - buffer - MYSQLND_HEADER_SIZE, stats, error_info); - if (buffer != vio->cmd_buffer.buffer) { + if (buffer != pfc->cmd_buffer.buffer) { mnd_efree(buffer); } if (!sent) { @@ -841,8 +841,8 @@ php_mysqlnd_ok_read(void * _packet) MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; zend_uchar local_buf[OK_BUFFER_SIZE]; - size_t buf_len = vio->cmd_buffer.buffer? vio->cmd_buffer.length : OK_BUFFER_SIZE; - zend_uchar * buf = vio->cmd_buffer.buffer? (zend_uchar *) vio->cmd_buffer.buffer : local_buf; + size_t buf_len = pfc->cmd_buffer.buffer? pfc->cmd_buffer.length : OK_BUFFER_SIZE; + zend_uchar * buf = pfc->cmd_buffer.buffer? (zend_uchar *) pfc->cmd_buffer.buffer : local_buf; const zend_uchar * p = buf; const zend_uchar * const begin = buf; zend_ulong net_len; @@ -938,8 +938,8 @@ php_mysqlnd_eof_read(void * _packet) MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; - size_t buf_len = vio->cmd_buffer.length; - zend_uchar * buf = (zend_uchar *) vio->cmd_buffer.buffer; + size_t buf_len = pfc->cmd_buffer.length; + zend_uchar * buf = (zend_uchar *) pfc->cmd_buffer.buffer; const zend_uchar * p = buf; const zend_uchar * const begin = buf; @@ -1045,7 +1045,7 @@ size_t php_mysqlnd_cmd_write(void * _packet) } else { size_t tmp_len = packet->argument.l + 1 + MYSQLND_HEADER_SIZE; zend_uchar *tmp, *p; - tmp = (tmp_len > vio->cmd_buffer.length)? mnd_emalloc(tmp_len):vio->cmd_buffer.buffer; + tmp = (tmp_len > pfc->cmd_buffer.length)? mnd_emalloc(tmp_len):pfc->cmd_buffer.buffer; if (!tmp) { goto end; } @@ -1057,7 +1057,7 @@ size_t php_mysqlnd_cmd_write(void * _packet) memcpy(p, packet->argument.s, packet->argument.l); sent = pfc->data->m.send(pfc, vio, tmp, tmp_len - MYSQLND_HEADER_SIZE, stats, error_info); - if (tmp != vio->cmd_buffer.buffer) { + if (tmp != pfc->cmd_buffer.buffer) { MYSQLND_INC_CONN_STATISTIC(stats, STAT_CMD_BUFFER_TOO_SMALL); mnd_efree(tmp); } @@ -1098,8 +1098,8 @@ php_mysqlnd_rset_header_read(void * _packet) MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; enum_func_status ret = PASS; - size_t buf_len = vio->cmd_buffer.length; - zend_uchar * buf = (zend_uchar *) vio->cmd_buffer.buffer; + size_t buf_len = pfc->cmd_buffer.length; + zend_uchar * buf = (zend_uchar *) pfc->cmd_buffer.buffer; const zend_uchar * p = buf; const zend_uchar * const begin = buf; size_t len; @@ -1243,8 +1243,8 @@ php_mysqlnd_rset_field_read(void * _packet) MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; - size_t buf_len = vio->cmd_buffer.length, total_len = 0; - zend_uchar * buf = (zend_uchar *) vio->cmd_buffer.buffer; + size_t buf_len = pfc->cmd_buffer.length, total_len = 0; + zend_uchar * buf = (zend_uchar *) pfc->cmd_buffer.buffer; const zend_uchar * p = buf; const zend_uchar * const begin = buf; char *root_ptr; @@ -1944,8 +1944,8 @@ php_mysqlnd_stats_read(void * _packet) MYSQLND_VIO * vio = packet->header.vio; MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; - size_t buf_len = vio->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; + size_t buf_len = pfc->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) pfc->cmd_buffer.buffer; DBG_ENTER("php_mysqlnd_stats_read"); @@ -1994,8 +1994,8 @@ php_mysqlnd_prepare_read(void * _packet) MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; /* In case of an error, we should have place to put it */ - size_t buf_len = vio->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; + size_t buf_len = pfc->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) pfc->cmd_buffer.buffer; zend_uchar *p = buf; const zend_uchar * const begin = buf; unsigned int data_size; @@ -2089,8 +2089,8 @@ php_mysqlnd_chg_user_read(void * _packet) MYSQLND_STATS * stats = packet->header.stats; MYSQLND_CONNECTION_STATE * connection_state = packet->header.connection_state; /* There could be an error message */ - size_t buf_len = vio->cmd_buffer.length; - zend_uchar *buf = (zend_uchar *) vio->cmd_buffer.buffer; + size_t buf_len = pfc->cmd_buffer.length; + zend_uchar *buf = (zend_uchar *) pfc->cmd_buffer.buffer; zend_uchar *p = buf; const zend_uchar * const begin = buf; -- cgit v1.2.1 From a6b79f08b32ac1a25d855ea72458788f7d10c204 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Tue, 17 Nov 2015 14:59:59 +0100 Subject: More const and moved the declaration of php_mysqlnd_scramble() to mysqlnd_auth.h --- ext/mysqlnd/mysqlnd_wireprotocol.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index c671dc8a57..63b12c677b 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -2368,7 +2368,7 @@ mysqlnd_packet_methods packet_methods[PROT_LAST] = /* {{{ mysqlnd_protocol::get_greet_packet */ static struct st_mysqlnd_packet_greet * -MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_greet * packet = mnd_pecalloc(1, packet_methods[PROT_GREET_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_greet_packet"); @@ -2391,7 +2391,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECO /* {{{ mysqlnd_protocol::get_auth_packet */ static struct st_mysqlnd_packet_auth * -MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_auth * packet = mnd_pecalloc(1, packet_methods[PROT_AUTH_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_auth_packet"); @@ -2415,7 +2415,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECOD /* {{{ mysqlnd_protocol::get_auth_response_packet */ static struct st_mysqlnd_packet_auth_response * -MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_auth_response * packet = mnd_pecalloc(1, packet_methods[PROT_AUTH_RESP_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_auth_response_packet"); @@ -2438,7 +2438,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_auth_response_packet)(MYSQLND_PROTOCOL_PAYL /* {{{ mysqlnd_protocol::get_change_auth_response_packet */ static struct st_mysqlnd_packet_change_auth_response * -MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_change_auth_response * packet = mnd_pecalloc(1, packet_methods[PROT_CHANGE_AUTH_RESP_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_change_auth_response_packet"); @@ -2461,7 +2461,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_auth_response_packet)(MYSQLND_PROTOC /* {{{ mysqlnd_protocol::get_ok_packet */ static struct st_mysqlnd_packet_ok * -MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_ok * packet = mnd_pecalloc(1, packet_methods[PROT_OK_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_ok_packet"); @@ -2484,7 +2484,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER /* {{{ mysqlnd_protocol::get_eof_packet */ static struct st_mysqlnd_packet_eof * -MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_eof * packet = mnd_pecalloc(1, packet_methods[PROT_EOF_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_eof_packet"); @@ -2507,7 +2507,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODE /* {{{ mysqlnd_protocol::get_command_packet */ static struct st_mysqlnd_packet_command * -MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_command * packet = mnd_pecalloc(1, packet_methods[PROT_CMD_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_command_packet"); @@ -2530,7 +2530,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL_PAYLOAD_DE /* {{{ mysqlnd_protocol::get_rset_packet */ static struct st_mysqlnd_packet_rset_header * -MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_rset_header * packet = mnd_pecalloc(1, packet_methods[PROT_RSET_HEADER_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_rset_header_packet"); @@ -2553,7 +2553,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL_PAYLOA /* {{{ mysqlnd_protocol::get_result_field_packet */ static struct st_mysqlnd_packet_res_field * -MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_res_field * packet = mnd_pecalloc(1, packet_methods[PROT_RSET_FLD_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_result_field_packet"); @@ -2576,7 +2576,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL_PAYLO /* {{{ mysqlnd_protocol::get_row_packet */ static struct st_mysqlnd_packet_row * -MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_row * packet = mnd_pecalloc(1, packet_methods[PROT_ROW_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_row_packet"); @@ -2600,7 +2600,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODE /* {{{ mysqlnd_protocol::get_stats_packet */ static struct st_mysqlnd_packet_stats * -MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_stats * packet = mnd_pecalloc(1, packet_methods[PROT_STATS_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_stats_packet"); @@ -2623,7 +2623,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECO /* {{{ mysqlnd_protocol::get_prepare_response_packet */ static struct st_mysqlnd_packet_prepare_response * -MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_prepare_response * packet = mnd_pecalloc(1, packet_methods[PROT_PREPARE_RESP_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_prepare_response_packet"); @@ -2646,7 +2646,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL_P /* {{{ mysqlnd_protocol::get_change_user_response_packet */ static struct st_mysqlnd_packet_chg_user_resp* -MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_chg_user_resp * packet = mnd_pecalloc(1, packet_methods[PROT_CHG_USER_RESP_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_change_user_response_packet"); @@ -2669,7 +2669,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOC /* {{{ mysqlnd_protocol::get_sha256_pk_request_packet */ static struct st_mysqlnd_packet_sha256_pk_request * -MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_sha256_pk_request * packet = mnd_pecalloc(1, packet_methods[PROT_SHA256_PK_REQUEST_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_sha256_pk_request_packet"); @@ -2692,7 +2692,7 @@ MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_packet)(MYSQLND_PROTOCOL_ /* {{{ mysqlnd_protocol::get_sha256_pk_request_response_packet */ static struct st_mysqlnd_packet_sha256_pk_request_response * -MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent) +MYSQLND_METHOD(mysqlnd_protocol, get_sha256_pk_request_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, const zend_bool persistent) { struct st_mysqlnd_packet_sha256_pk_request_response * packet = mnd_pecalloc(1, packet_methods[PROT_SHA256_PK_REQUEST_RESPONSE_PACKET].struct_size, persistent); DBG_ENTER("mysqlnd_protocol::get_sha256_pk_request_response_packet"); @@ -2951,7 +2951,7 @@ MYSQLND_CLASS_METHODS_END; /* {{{ mysqlnd_protocol_payload_decoder_factory_init */ PHPAPI MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * -mysqlnd_protocol_payload_decoder_factory_init(MYSQLND_CONN_DATA * conn, zend_bool persistent) +mysqlnd_protocol_payload_decoder_factory_init(MYSQLND_CONN_DATA * conn, const zend_bool persistent) { MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * ret; DBG_ENTER("mysqlnd_protocol_payload_decoder_factory_init"); -- cgit v1.2.1 From 2d1559f827477963a3f8a40af64212a409ba9457 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 22 Feb 2016 18:40:45 +0100 Subject: Move free_chunk and resize_chunk into memory pool Drops 24 bytes from each chunk. For the example in bug #71468 it reduces memory usage by 30%. --- ext/mysqlnd/mysqlnd_wireprotocol.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index b174e62687..9e96d508e9 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1458,7 +1458,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info, - MYSQLND_MEMORY_POOL * result_set_memory_pool, + MYSQLND_MEMORY_POOL * pool, MYSQLND_MEMORY_POOL_CHUNK ** buffer, size_t * data_size, zend_bool persistent_alloc, unsigned int prealloc_more_bytes) @@ -1489,7 +1489,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc, if (first_iteration) { first_iteration = FALSE; - *buffer = result_set_memory_pool->get_chunk(result_set_memory_pool, *data_size); + *buffer = pool->get_chunk(pool, *data_size); if (!*buffer) { ret = FAIL; break; @@ -1504,7 +1504,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc, /* We have to realloc the buffer. */ - if (FAIL == (*buffer)->resize_chunk((*buffer), *data_size)) { + if (FAIL == pool->resize_chunk(pool, *buffer, *data_size)) { SET_OOM_ERROR(error_info); ret = FAIL; break; @@ -1524,7 +1524,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc, } } if (ret == FAIL && *buffer) { - (*buffer)->free_chunk((*buffer)); + pool->free_chunk(pool, *buffer); *buffer = NULL; } *data_size -= prealloc_more_bytes; @@ -1915,7 +1915,7 @@ php_mysqlnd_rowp_free_mem(void * _packet, zend_bool stack_allocation) DBG_ENTER("php_mysqlnd_rowp_free_mem"); p = (MYSQLND_PACKET_ROW *) _packet; if (p->row_buffer) { - p->row_buffer->free_chunk(p->row_buffer); + p->result_set_memory_pool->free_chunk(p->result_set_memory_pool, p->row_buffer); p->row_buffer = NULL; } DBG_INF_FMT("stack_allocation=%u persistent=%u", (int)stack_allocation, (int)p->header.persistent); -- cgit v1.2.1 From 9a83a679efc55b586fb97eb79002ae11ee74b821 Mon Sep 17 00:00:00 2001 From: Kalle Sommer Nielsen Date: Thu, 17 Mar 2016 03:45:04 +0100 Subject: Fix build --- ext/mysqlnd/mysqlnd_wireprotocol.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'ext/mysqlnd/mysqlnd_wireprotocol.c') diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index e92bf0b949..825c56feae 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -2730,11 +2730,12 @@ MYSQLND_METHOD(mysqlnd_protocol, send_command)( { enum_func_status ret = PASS; MYSQLND_PACKET_COMMAND * cmd_packet = NULL; + enum mysqlnd_connection_state state; DBG_ENTER("mysqlnd_protocol::send_command"); DBG_INF_FMT("command=%s silent=%u", mysqlnd_command_to_text[command], silent); DBG_INF_FMT("server_status=%u", UPSERT_STATUS_GET_SERVER_STATUS(upsert_status)); DBG_INF_FMT("sending %u bytes", arg_len + 1); /* + 1 is for the command */ - enum mysqlnd_connection_state state = connection_state->m->get(connection_state); + state = connection_state->m->get(connection_state); switch (state) { case CONN_READY: -- cgit v1.2.1