andrey Tue, 15 Dec 2009 13:13:51 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=292165
Log: refactor: move code that belongs to MYSQLND_NET out of MYSQLND Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd.c U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h U php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c U php/php-src/trunk/ext/mysqlnd/mysqlnd.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h U php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c
Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd.c 2009-12-15 12:51:46 UTC (rev 292164) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd.c 2009-12-15 13:13:51 UTC (rev 292165) @@ -145,11 +145,8 @@ conn->current_result = NULL; } -#ifdef MYSQLND_COMPRESSION_ENABLED - if (conn->net->uncompressed_data) { - conn->net->uncompressed_data->free_buffer(&conn->net->uncompressed_data TSRMLS_CC); - } -#endif + conn->net->m.free_contents(conn->net TSRMLS_CC); + DBG_INF("Freeing memory of members"); if (conn->host) { @@ -546,8 +543,8 @@ CONN_SET_STATE(conn, CONN_ALLOCED); conn->net->packet_no = conn->net->compressed_envelope_packet_no = 0; - if (conn->options.timeout_connect) { - tv.tv_sec = conn->options.timeout_connect; + if (conn->net->options.timeout_connect) { + tv.tv_sec = conn->net->options.timeout_connect; tv.tv_usec = 0; } if (conn->persistent) { @@ -560,7 +557,7 @@ DBG_INF(conn->scheme); conn->net->stream = php_stream_xport_create(conn->scheme, transport_len, streams_options, streams_flags, hashed_details, - (conn->options.timeout_connect) ? &tv : NULL, + (conn->net->options.timeout_connect) ? &tv : NULL, NULL /*ctx*/, &errstr, &errcode); DBG_INF_FMT("stream=%p", conn->net->stream); @@ -598,13 +595,13 @@ mnd_efree(hashed_details); } - if (!conn->options.timeout_read) { + if (!conn->net->options.timeout_read) { /* should always happen because read_timeout cannot be set via API */ - conn->options.timeout_read = (unsigned int) MYSQLND_G(net_read_timeout); + conn->net->options.timeout_read = (unsigned int) MYSQLND_G(net_read_timeout); } - if (conn->options.timeout_read) + if (conn->net->options.timeout_read) { - tv.tv_sec = conn->options.timeout_read; + tv.tv_sec = conn->net->options.timeout_read; tv.tv_usec = 0; php_stream_set_option(conn->net->stream, PHP_STREAM_OPTION_READ_TIMEOUT, 0, &tv); } @@ -1937,51 +1934,29 @@ DBG_ENTER("mysqlnd_conn::set_client_option"); DBG_INF_FMT("conn=%llu option=%d", conn->thread_id, option); switch (option) { +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_COMPRESS: +#endif +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_READ_TIMEOUT: + case MYSQL_OPT_WRITE_TIMEOUT: +#endif + case MYSQL_OPT_CONNECT_TIMEOUT: + case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: + case MYSQLND_OPT_NET_READ_BUFFER_SIZE: + conn->net->m.set_client_option(conn->net, option, value TSRMLS_CC); + break; #if PHP_MAJOR_VERSION >= 6 case MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE: conn->options.numeric_and_datetime_as_unicode = *(unsigned int*) value; break; #endif - case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: - DBG_INF("MYSQLND_OPT_NET_CMD_BUFFER_SIZE"); - if (*(unsigned int*) value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) { - DBG_RETURN(FAIL); - } - conn->net->cmd_buffer.length = *(unsigned int*) value; - DBG_INF_FMT("new_length=%u", conn->net->cmd_buffer.length); - if (!conn->net->cmd_buffer.buffer) { - conn->net->cmd_buffer.buffer = mnd_pemalloc(conn->net->cmd_buffer.length, conn->net->persistent); - } else { - conn->net->cmd_buffer.buffer = mnd_perealloc(conn->net->cmd_buffer.buffer, - conn->net->cmd_buffer.length, - conn->net->persistent); - } - break; - case MYSQLND_OPT_NET_READ_BUFFER_SIZE: - DBG_INF("MYSQLND_OPT_NET_READ_BUFFER_SIZE"); - conn->options.net_read_buffer_size = *(unsigned int*) value; - DBG_INF_FMT("new_length=%u", conn->options.net_read_buffer_size); - break; #ifdef MYSQLND_STRING_TO_INT_CONVERSION case MYSQLND_OPT_INT_AND_FLOAT_NATIVE: DBG_INF("MYSQLND_OPT_INT_AND_FLOAT_NATIVE"); conn->options.int_and_float_native = *(unsigned int*) value; break; #endif - case MYSQL_OPT_CONNECT_TIMEOUT: - DBG_INF("MYSQL_OPT_CONNECT_TIMEOUT"); - conn->options.timeout_connect = *(unsigned int*) value; - break; -#ifdef WHEN_SUPPORTED_BY_MYSQLI - case MYSQL_OPT_READ_TIMEOUT: - DBG_INF("MYSQL_OPT_READ_TIMEOUT"); - conn->options.timeout_read = *(unsigned int*) value; - break; - case MYSQL_OPT_WRITE_TIMEOUT: - DBG_INF("MYSQL_OPT_WRITE_TIMEOUT"); - conn->options.timeout_write = *(unsigned int*) value; - break; -#endif case MYSQL_OPT_LOCAL_INFILE: DBG_INF("MYSQL_OPT_LOCAL_INFILE"); if (!value || (*(unsigned int*) value) ? 1 : 0) { @@ -1999,9 +1974,6 @@ conn->options.init_commands[conn->options.num_commands] = pestrdup(value, conn->persistent); ++conn->options.num_commands; break; -#ifdef WHEN_SUPPORTED_BY_MYSQLI - case MYSQL_OPT_COMPRESS: -#endif case MYSQL_READ_DEFAULT_FILE: case MYSQL_READ_DEFAULT_GROUP: #ifdef WHEN_SUPPORTED_BY_MYSQLI Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h 2009-12-15 12:51:46 UTC (rev 292164) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h 2009-12-15 13:13:51 UTC (rev 292165) @@ -141,13 +141,8 @@ void *userdata; } MYSQLND_INFILE; -typedef struct st_mysqlnd_option +typedef struct st_mysqlnd_options { - /* timeouts */ - unsigned int timeout_connect; - unsigned int timeout_read; - unsigned int timeout_write; - ulong flags; /* init commands - we need to send them to server directly after connect */ @@ -174,11 +169,21 @@ #ifdef MYSQLND_STRING_TO_INT_CONVERSION zend_bool int_and_float_native; #endif +} MYSQLND_OPTIONS; + +typedef struct st_mysqlnd_net_options +{ + /* timeouts */ + unsigned int timeout_connect; + unsigned int timeout_read; + unsigned int timeout_write; + unsigned int net_read_buffer_size; -} MYSQLND_OPTION; +} MYSQLND_NET_OPTIONS; typedef struct st_mysqlnd_connection MYSQLND; +typedef struct st_mysqlnd_net MYSQLND_NET; typedef struct st_mysqlnd_res MYSQLND_RES; typedef char** MYSQLND_ROW_C; /* return data as array of strings */ typedef struct st_mysqlnd_stmt MYSQLND_STMT; @@ -223,29 +228,15 @@ } MYSQLND_READ_BUFFER; -typedef struct st_mysqlnd_net +struct st_mysqlnd_net_methods { - php_stream *stream; enum_func_status (*stream_read)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC); size_t (*stream_write)(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC); + enum_func_status (*set_client_option)(MYSQLND_NET * const net, enum_mysqlnd_option option, const char * const value TSRMLS_DC); + void (*free_contents)(MYSQLND_NET * net TSRMLS_DC); +}; - /* sequence for simple checking of correct packets */ - zend_uchar packet_no; - zend_bool compressed; - zend_uchar compressed_envelope_packet_no; -#ifdef MYSQLND_COMPRESSION_ENABLED - MYSQLND_READ_BUFFER * uncompressed_data; -#endif -#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND - zend_uchar last_command; -#endif - /* cmd buffer */ - MYSQLND_CMD_BUFFER cmd_buffer; - zend_bool persistent; -} MYSQLND_NET; - - struct st_mysqlnd_conn_methods { enum_func_status (*connect)(MYSQLND *conn, const char *host, const char * user, const char * passwd, unsigned int passwd_len, const char * db, unsigned int db_len, unsigned int port, const char * socket, unsigned int mysql_flags TSRMLS_DC); @@ -412,6 +403,30 @@ }; +struct st_mysqlnd_net +{ + php_stream *stream; + struct st_mysqlnd_net_methods m; + + /* sequence for simple checking of correct packets */ + zend_uchar packet_no; + zend_bool compressed; + zend_uchar compressed_envelope_packet_no; +#ifdef MYSQLND_COMPRESSION_ENABLED + MYSQLND_READ_BUFFER * uncompressed_data; +#endif +#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND + zend_uchar last_command; +#endif + /* cmd buffer */ + MYSQLND_CMD_BUFFER cmd_buffer; + + MYSQLND_NET_OPTIONS options; + + zend_bool persistent; +}; + + struct st_mysqlnd_connection { /* Operation related */ @@ -476,7 +491,7 @@ zend_bool persistent; /* options */ - MYSQLND_OPTION options; + MYSQLND_OPTIONS options; /* stats */ MYSQLND_STATS stats; Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c 2009-12-15 12:51:46 UTC (rev 292164) +++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c 2009-12-15 13:13:51 UTC (rev 292165) @@ -382,12 +382,12 @@ /* }}} */ -/* {{{ mysqlnd_stream_write */ +/* {{{ mysqlnd_net::stream_write */ static size_t -mysqlnd_stream_write(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_net, stream_write)(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC) { size_t ret; - DBG_ENTER("mysqlnd_stream_write"); + DBG_ENTER("mysqlnd_net::stream_write"); ret = php_stream_write(conn->net->stream, (char *)buf, count); DBG_RETURN(ret); } @@ -463,7 +463,7 @@ int3store(compress_buf, payload_size); int1store(compress_buf + 3, net->packet_no); DBG_INF_FMT("writing %d bytes to the network", payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE); - ret = conn->net->stream_write(conn, compress_buf, payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE TSRMLS_CC); + ret = conn->net->m.stream_write(conn, compress_buf, payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE TSRMLS_CC); net->compressed_envelope_packet_no++; } else #endif /* MYSQLND_COMPRESSION_ENABLED */ @@ -472,7 +472,7 @@ STORE_HEADER_SIZE(safe_storage, p); int3store(p, MYSQLND_MAX_PACKET_SIZE); int1store(p + 3, net->packet_no); - ret = conn->net->stream_write(conn, p, MYSQLND_MAX_PACKET_SIZE + MYSQLND_HEADER_SIZE TSRMLS_CC); + ret = conn->net->m.stream_write(conn, p, MYSQLND_MAX_PACKET_SIZE + MYSQLND_HEADER_SIZE TSRMLS_CC); RESTORE_HEADER_SIZE(p, safe_storage); net->compressed_envelope_packet_no++; } @@ -520,7 +520,7 @@ int3store(compress_buf, payload_size); int1store(compress_buf + 3, net->packet_no); DBG_INF_FMT("writing %d bytes to the network", payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE); - ret = conn->net->stream_write(conn, compress_buf, payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE TSRMLS_CC); + ret = conn->net->m.stream_write(conn, compress_buf, payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE TSRMLS_CC); net->compressed_envelope_packet_no++; #if WHEN_WE_NEED_TO_CHECK_WHETHER_COMPRESSION_WORKS_CORRECTLY @@ -553,7 +553,7 @@ STORE_HEADER_SIZE(safe_storage, p); int3store(p, left); int1store(p + 3, net->packet_no); - ret = conn->net->stream_write(conn, p, left + MYSQLND_HEADER_SIZE TSRMLS_CC); + ret = conn->net->m.stream_write(conn, p, left + MYSQLND_HEADER_SIZE TSRMLS_CC); RESTORE_HEADER_SIZE(p, safe_storage); } net->packet_no++; @@ -578,15 +578,15 @@ /* }}} */ -/* {{{ mysqlnd_read_from_stream */ +/* {{{ mysqlnd_net::read_from_stream */ static enum_func_status -mysqlnd_read_from_stream(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_net, read_from_stream)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC) { size_t to_read = count, ret; size_t old_chunk_size = conn->net->stream->chunk_size; - DBG_ENTER("mysqlnd_read_from_stream"); + DBG_ENTER("mysqlnd_net::read_from_stream"); DBG_INF_FMT("count=%u", count); - conn->net->stream->chunk_size = MIN(to_read, conn->options.net_read_buffer_size); + conn->net->stream->chunk_size = MIN(to_read, conn->net->options.net_read_buffer_size); while (to_read) { if (!(ret = php_stream_read(conn->net->stream, (char *) buffer, to_read))) { DBG_ERR_FMT("Error while reading header from socket"); @@ -615,7 +615,7 @@ DBG_ENTER("mysqlnd_read_compressed_packet_from_stream_and_fill_read_buffer"); /* Read the compressed header */ - if (FAIL == conn->net->stream_read(conn, comp_header, COMPRESSED_HEADER_SIZE TSRMLS_CC)) { + if (FAIL == conn->net->m.stream_read(conn, comp_header, COMPRESSED_HEADER_SIZE TSRMLS_CC)) { DBG_RETURN(FAIL); } decompressed_size = uint3korr(comp_header); @@ -627,7 +627,7 @@ int error; uLongf tmp_complen = decompressed_size; compressed_data = emalloc(net_payload_size); - if (FAIL == conn->net->stream_read(conn, compressed_data, net_payload_size TSRMLS_CC)) { + if (FAIL == conn->net->m.stream_read(conn, compressed_data, net_payload_size TSRMLS_CC)) { ret = FAIL; goto end; } @@ -644,7 +644,7 @@ } 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 TSRMLS_CC); - if (FAIL == conn->net->stream_read(conn, net->uncompressed_data->data, net_payload_size TSRMLS_CC)) { + if (FAIL == conn->net->m.stream_read(conn, net->uncompressed_data->data, net_payload_size TSRMLS_CC)) { ret = FAIL; goto end; } @@ -688,7 +688,7 @@ size_t net_payload_size; zend_uchar packet_no; - if (FAIL == conn->net->stream_read(conn, net_header, MYSQLND_HEADER_SIZE TSRMLS_CC)) { + if (FAIL == conn->net->m.stream_read(conn, net_header, MYSQLND_HEADER_SIZE TSRMLS_CC)) { DBG_RETURN(FAIL); } net_payload_size = uint3korr(net_header); @@ -722,7 +722,7 @@ DBG_RETURN(PASS); } #endif /* MYSQLND_COMPRESSION_ENABLED */ - DBG_RETURN(conn->net->stream_read(conn, p, to_read TSRMLS_CC)); + DBG_RETURN(conn->net->m.stream_read(conn, p, to_read TSRMLS_CC)); } /* }}} */ @@ -2290,6 +2290,74 @@ /* }}} */ +/* {{{ mysqlnd_net::set_client_option */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, set_client_option)(MYSQLND_NET * const net, enum mysqlnd_option option, const char * const value TSRMLS_DC) +{ + DBG_ENTER("mysqlnd_net::set_client_option"); + DBG_INF_FMT("option=%d", option); + switch (option) { + case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: + DBG_INF("MYSQLND_OPT_NET_CMD_BUFFER_SIZE"); + if (*(unsigned int*) value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) { + DBG_RETURN(FAIL); + } + net->cmd_buffer.length = *(unsigned int*) value; + DBG_INF_FMT("new_length=%u", net->cmd_buffer.length); + if (!net->cmd_buffer.buffer) { + net->cmd_buffer.buffer = mnd_pemalloc(net->cmd_buffer.length, net->persistent); + } else { + net->cmd_buffer.buffer = mnd_perealloc(net->cmd_buffer.buffer, net->cmd_buffer.length, net->persistent); + } + break; + case MYSQLND_OPT_NET_READ_BUFFER_SIZE: + DBG_INF("MYSQLND_OPT_NET_READ_BUFFER_SIZE"); + net->options.net_read_buffer_size = *(unsigned int*) value; + DBG_INF_FMT("new_length=%u", net->options.net_read_buffer_size); + break; + case MYSQL_OPT_CONNECT_TIMEOUT: + DBG_INF("MYSQL_OPT_CONNECT_TIMEOUT"); + net->options.timeout_connect = *(unsigned int*) value; + break; +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_READ_TIMEOUT: + DBG_INF("MYSQL_OPT_READ_TIMEOUT"); + net->options.timeout_read = *(unsigned int*) value; + break; + case MYSQL_OPT_WRITE_TIMEOUT: + DBG_INF("MYSQL_OPT_WRITE_TIMEOUT"); + net->options.timeout_write = *(unsigned int*) value; + break; +#endif +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_COMPRESS: +#endif + /* currently not supported. Todo!! */ + break; + default: + DBG_RETURN(FAIL); + } + DBG_RETURN(PASS); +} +/* }}} */ + + +/* {{{ mysqlnd_net::set_client_option */ +static void +MYSQLND_METHOD(mysqlnd_net, free_contents)(MYSQLND_NET * net TSRMLS_DC) +{ + DBG_ENTER("mysqlnd_net::free_contents"); + +#ifdef MYSQLND_COMPRESSION_ENABLED + if (net->uncompressed_data) { + net->uncompressed_data->free_buffer(&net->uncompressed_data TSRMLS_CC); + } +#endif + DBG_VOID_RETURN; +} +/* }}} */ + + /* {{{ mysqlnd_net_init */ MYSQLND_NET * mysqlnd_net_init(zend_bool persistent TSRMLS_DC) @@ -2300,15 +2368,14 @@ DBG_INF_FMT("persistent=%d", persistent); net->persistent = persistent; - net->stream_read = mysqlnd_read_from_stream; - net->stream_write = mysqlnd_stream_write; + net->m.stream_read = MYSQLND_METHOD(mysqlnd_net, read_from_stream); + net->m.stream_write = MYSQLND_METHOD(mysqlnd_net, stream_write); + net->m.set_client_option = MYSQLND_METHOD(mysqlnd_net, set_client_option); + net->m.free_contents = MYSQLND_METHOD(mysqlnd_net, free_contents); { - size_t buffer_size = MYSQLND_G(net_cmd_buffer_size) > MYSQLND_NET_CMD_BUFFER_MIN_SIZE? - MYSQLND_G(net_cmd_buffer_size): - MYSQLND_NET_CMD_BUFFER_MIN_SIZE; - net->cmd_buffer.length = buffer_size; - net->cmd_buffer.buffer = mnd_pemalloc(buffer_size, persistent); + unsigned int buf_size = MYSQLND_G(net_read_buffer_size); /* this is long, cast to unsigned int*/ + net->m.set_client_option(net, MYSQLND_OPT_NET_CMD_BUFFER_SIZE, (char *) &buf_size TSRMLS_CC); } DBG_RETURN(net); } Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd.c =================================================================== --- php/php-src/trunk/ext/mysqlnd/mysqlnd.c 2009-12-15 12:51:46 UTC (rev 292164) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd.c 2009-12-15 13:13:51 UTC (rev 292165) @@ -145,11 +145,8 @@ conn->current_result = NULL; } -#ifdef MYSQLND_COMPRESSION_ENABLED - if (conn->net->uncompressed_data) { - conn->net->uncompressed_data->free_buffer(&conn->net->uncompressed_data TSRMLS_CC); - } -#endif + conn->net->m.free_contents(conn->net TSRMLS_CC); + DBG_INF("Freeing memory of members"); if (conn->host) { @@ -546,8 +543,8 @@ CONN_SET_STATE(conn, CONN_ALLOCED); conn->net->packet_no = conn->net->compressed_envelope_packet_no = 0; - if (conn->options.timeout_connect) { - tv.tv_sec = conn->options.timeout_connect; + if (conn->net->options.timeout_connect) { + tv.tv_sec = conn->net->options.timeout_connect; tv.tv_usec = 0; } if (conn->persistent) { @@ -560,7 +557,7 @@ DBG_INF(conn->scheme); conn->net->stream = php_stream_xport_create(conn->scheme, transport_len, streams_options, streams_flags, hashed_details, - (conn->options.timeout_connect) ? &tv : NULL, + (conn->net->options.timeout_connect) ? &tv : NULL, NULL /*ctx*/, &errstr, &errcode); DBG_INF_FMT("stream=%p", conn->net->stream); @@ -598,13 +595,13 @@ mnd_efree(hashed_details); } - if (!conn->options.timeout_read) { + if (!conn->net->options.timeout_read) { /* should always happen because read_timeout cannot be set via API */ - conn->options.timeout_read = (unsigned int) MYSQLND_G(net_read_timeout); + conn->net->options.timeout_read = (unsigned int) MYSQLND_G(net_read_timeout); } - if (conn->options.timeout_read) + if (conn->net->options.timeout_read) { - tv.tv_sec = conn->options.timeout_read; + tv.tv_sec = conn->net->options.timeout_read; tv.tv_usec = 0; php_stream_set_option(conn->net->stream, PHP_STREAM_OPTION_READ_TIMEOUT, 0, &tv); } @@ -1937,51 +1934,29 @@ DBG_ENTER("mysqlnd_conn::set_client_option"); DBG_INF_FMT("conn=%llu option=%d", conn->thread_id, option); switch (option) { +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_COMPRESS: +#endif +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_READ_TIMEOUT: + case MYSQL_OPT_WRITE_TIMEOUT: +#endif + case MYSQL_OPT_CONNECT_TIMEOUT: + case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: + case MYSQLND_OPT_NET_READ_BUFFER_SIZE: + conn->net->m.set_client_option(conn->net, option, value TSRMLS_CC); + break; #if PHP_MAJOR_VERSION >= 6 case MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE: conn->options.numeric_and_datetime_as_unicode = *(unsigned int*) value; break; #endif - case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: - DBG_INF("MYSQLND_OPT_NET_CMD_BUFFER_SIZE"); - if (*(unsigned int*) value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) { - DBG_RETURN(FAIL); - } - conn->net->cmd_buffer.length = *(unsigned int*) value; - DBG_INF_FMT("new_length=%u", conn->net->cmd_buffer.length); - if (!conn->net->cmd_buffer.buffer) { - conn->net->cmd_buffer.buffer = mnd_pemalloc(conn->net->cmd_buffer.length, conn->net->persistent); - } else { - conn->net->cmd_buffer.buffer = mnd_perealloc(conn->net->cmd_buffer.buffer, - conn->net->cmd_buffer.length, - conn->net->persistent); - } - break; - case MYSQLND_OPT_NET_READ_BUFFER_SIZE: - DBG_INF("MYSQLND_OPT_NET_READ_BUFFER_SIZE"); - conn->options.net_read_buffer_size = *(unsigned int*) value; - DBG_INF_FMT("new_length=%u", conn->options.net_read_buffer_size); - break; #ifdef MYSQLND_STRING_TO_INT_CONVERSION case MYSQLND_OPT_INT_AND_FLOAT_NATIVE: DBG_INF("MYSQLND_OPT_INT_AND_FLOAT_NATIVE"); conn->options.int_and_float_native = *(unsigned int*) value; break; #endif - case MYSQL_OPT_CONNECT_TIMEOUT: - DBG_INF("MYSQL_OPT_CONNECT_TIMEOUT"); - conn->options.timeout_connect = *(unsigned int*) value; - break; -#ifdef WHEN_SUPPORTED_BY_MYSQLI - case MYSQL_OPT_READ_TIMEOUT: - DBG_INF("MYSQL_OPT_READ_TIMEOUT"); - conn->options.timeout_read = *(unsigned int*) value; - break; - case MYSQL_OPT_WRITE_TIMEOUT: - DBG_INF("MYSQL_OPT_WRITE_TIMEOUT"); - conn->options.timeout_write = *(unsigned int*) value; - break; -#endif case MYSQL_OPT_LOCAL_INFILE: DBG_INF("MYSQL_OPT_LOCAL_INFILE"); if (!value || (*(unsigned int*) value) ? 1 : 0) { @@ -1999,9 +1974,6 @@ conn->options.init_commands[conn->options.num_commands] = pestrdup(value, conn->persistent); ++conn->options.num_commands; break; -#ifdef WHEN_SUPPORTED_BY_MYSQLI - case MYSQL_OPT_COMPRESS: -#endif case MYSQL_READ_DEFAULT_FILE: case MYSQL_READ_DEFAULT_GROUP: #ifdef WHEN_SUPPORTED_BY_MYSQLI Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h =================================================================== --- php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h 2009-12-15 12:51:46 UTC (rev 292164) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h 2009-12-15 13:13:51 UTC (rev 292165) @@ -141,13 +141,8 @@ void *userdata; } MYSQLND_INFILE; -typedef struct st_mysqlnd_option +typedef struct st_mysqlnd_options { - /* timeouts */ - unsigned int timeout_connect; - unsigned int timeout_read; - unsigned int timeout_write; - ulong flags; /* init commands - we need to send them to server directly after connect */ @@ -174,11 +169,21 @@ #ifdef MYSQLND_STRING_TO_INT_CONVERSION zend_bool int_and_float_native; #endif +} MYSQLND_OPTIONS; + +typedef struct st_mysqlnd_net_options +{ + /* timeouts */ + unsigned int timeout_connect; + unsigned int timeout_read; + unsigned int timeout_write; + unsigned int net_read_buffer_size; -} MYSQLND_OPTION; +} MYSQLND_NET_OPTIONS; typedef struct st_mysqlnd_connection MYSQLND; +typedef struct st_mysqlnd_net MYSQLND_NET; typedef struct st_mysqlnd_res MYSQLND_RES; typedef char** MYSQLND_ROW_C; /* return data as array of strings */ typedef struct st_mysqlnd_stmt MYSQLND_STMT; @@ -223,29 +228,15 @@ } MYSQLND_READ_BUFFER; -typedef struct st_mysqlnd_net +struct st_mysqlnd_net_methods { - php_stream *stream; enum_func_status (*stream_read)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC); size_t (*stream_write)(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC); + enum_func_status (*set_client_option)(MYSQLND_NET * const net, enum_mysqlnd_option option, const char * const value TSRMLS_DC); + void (*free_contents)(MYSQLND_NET * net TSRMLS_DC); +}; - /* sequence for simple checking of correct packets */ - zend_uchar packet_no; - zend_bool compressed; - zend_uchar compressed_envelope_packet_no; -#ifdef MYSQLND_COMPRESSION_ENABLED - MYSQLND_READ_BUFFER * uncompressed_data; -#endif -#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND - zend_uchar last_command; -#endif - /* cmd buffer */ - MYSQLND_CMD_BUFFER cmd_buffer; - zend_bool persistent; -} MYSQLND_NET; - - struct st_mysqlnd_conn_methods { enum_func_status (*connect)(MYSQLND *conn, const char *host, const char * user, const char * passwd, unsigned int passwd_len, const char * db, unsigned int db_len, unsigned int port, const char * socket, unsigned int mysql_flags TSRMLS_DC); @@ -412,6 +403,30 @@ }; +struct st_mysqlnd_net +{ + php_stream *stream; + struct st_mysqlnd_net_methods m; + + /* sequence for simple checking of correct packets */ + zend_uchar packet_no; + zend_bool compressed; + zend_uchar compressed_envelope_packet_no; +#ifdef MYSQLND_COMPRESSION_ENABLED + MYSQLND_READ_BUFFER * uncompressed_data; +#endif +#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND + zend_uchar last_command; +#endif + /* cmd buffer */ + MYSQLND_CMD_BUFFER cmd_buffer; + + MYSQLND_NET_OPTIONS options; + + zend_bool persistent; +}; + + struct st_mysqlnd_connection { /* Operation related */ @@ -476,7 +491,7 @@ zend_bool persistent; /* options */ - MYSQLND_OPTION options; + MYSQLND_OPTIONS options; /* stats */ MYSQLND_STATS stats; Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c =================================================================== --- php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c 2009-12-15 12:51:46 UTC (rev 292164) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c 2009-12-15 13:13:51 UTC (rev 292165) @@ -382,12 +382,12 @@ /* }}} */ -/* {{{ mysqlnd_stream_write */ +/* {{{ mysqlnd_net::stream_write */ static size_t -mysqlnd_stream_write(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_net, stream_write)(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC) { size_t ret; - DBG_ENTER("mysqlnd_stream_write"); + DBG_ENTER("mysqlnd_net::stream_write"); ret = php_stream_write(conn->net->stream, (char *)buf, count); DBG_RETURN(ret); } @@ -463,7 +463,7 @@ int3store(compress_buf, payload_size); int1store(compress_buf + 3, net->packet_no); DBG_INF_FMT("writing %d bytes to the network", payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE); - ret = conn->net->stream_write(conn, compress_buf, payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE TSRMLS_CC); + ret = conn->net->m.stream_write(conn, compress_buf, payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE TSRMLS_CC); net->compressed_envelope_packet_no++; } else #endif /* MYSQLND_COMPRESSION_ENABLED */ @@ -472,7 +472,7 @@ STORE_HEADER_SIZE(safe_storage, p); int3store(p, MYSQLND_MAX_PACKET_SIZE); int1store(p + 3, net->packet_no); - ret = conn->net->stream_write(conn, p, MYSQLND_MAX_PACKET_SIZE + MYSQLND_HEADER_SIZE TSRMLS_CC); + ret = conn->net->m.stream_write(conn, p, MYSQLND_MAX_PACKET_SIZE + MYSQLND_HEADER_SIZE TSRMLS_CC); RESTORE_HEADER_SIZE(p, safe_storage); net->compressed_envelope_packet_no++; } @@ -520,7 +520,7 @@ int3store(compress_buf, payload_size); int1store(compress_buf + 3, net->packet_no); DBG_INF_FMT("writing %d bytes to the network", payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE); - ret = conn->net->stream_write(conn, compress_buf, payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE TSRMLS_CC); + ret = conn->net->m.stream_write(conn, compress_buf, payload_size + MYSQLND_HEADER_SIZE + COMPRESSED_HEADER_SIZE TSRMLS_CC); net->compressed_envelope_packet_no++; #if WHEN_WE_NEED_TO_CHECK_WHETHER_COMPRESSION_WORKS_CORRECTLY @@ -553,7 +553,7 @@ STORE_HEADER_SIZE(safe_storage, p); int3store(p, left); int1store(p + 3, net->packet_no); - ret = conn->net->stream_write(conn, p, left + MYSQLND_HEADER_SIZE TSRMLS_CC); + ret = conn->net->m.stream_write(conn, p, left + MYSQLND_HEADER_SIZE TSRMLS_CC); RESTORE_HEADER_SIZE(p, safe_storage); } net->packet_no++; @@ -578,15 +578,15 @@ /* }}} */ -/* {{{ mysqlnd_read_from_stream */ +/* {{{ mysqlnd_net::read_from_stream */ static enum_func_status -mysqlnd_read_from_stream(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_net, read_from_stream)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC) { size_t to_read = count, ret; size_t old_chunk_size = conn->net->stream->chunk_size; - DBG_ENTER("mysqlnd_read_from_stream"); + DBG_ENTER("mysqlnd_net::read_from_stream"); DBG_INF_FMT("count=%u", count); - conn->net->stream->chunk_size = MIN(to_read, conn->options.net_read_buffer_size); + conn->net->stream->chunk_size = MIN(to_read, conn->net->options.net_read_buffer_size); while (to_read) { if (!(ret = php_stream_read(conn->net->stream, (char *) buffer, to_read))) { DBG_ERR_FMT("Error while reading header from socket"); @@ -615,7 +615,7 @@ DBG_ENTER("mysqlnd_read_compressed_packet_from_stream_and_fill_read_buffer"); /* Read the compressed header */ - if (FAIL == conn->net->stream_read(conn, comp_header, COMPRESSED_HEADER_SIZE TSRMLS_CC)) { + if (FAIL == conn->net->m.stream_read(conn, comp_header, COMPRESSED_HEADER_SIZE TSRMLS_CC)) { DBG_RETURN(FAIL); } decompressed_size = uint3korr(comp_header); @@ -627,7 +627,7 @@ int error; uLongf tmp_complen = decompressed_size; compressed_data = emalloc(net_payload_size); - if (FAIL == conn->net->stream_read(conn, compressed_data, net_payload_size TSRMLS_CC)) { + if (FAIL == conn->net->m.stream_read(conn, compressed_data, net_payload_size TSRMLS_CC)) { ret = FAIL; goto end; } @@ -644,7 +644,7 @@ } 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 TSRMLS_CC); - if (FAIL == conn->net->stream_read(conn, net->uncompressed_data->data, net_payload_size TSRMLS_CC)) { + if (FAIL == conn->net->m.stream_read(conn, net->uncompressed_data->data, net_payload_size TSRMLS_CC)) { ret = FAIL; goto end; } @@ -688,7 +688,7 @@ size_t net_payload_size; zend_uchar packet_no; - if (FAIL == conn->net->stream_read(conn, net_header, MYSQLND_HEADER_SIZE TSRMLS_CC)) { + if (FAIL == conn->net->m.stream_read(conn, net_header, MYSQLND_HEADER_SIZE TSRMLS_CC)) { DBG_RETURN(FAIL); } net_payload_size = uint3korr(net_header); @@ -722,7 +722,7 @@ DBG_RETURN(PASS); } #endif /* MYSQLND_COMPRESSION_ENABLED */ - DBG_RETURN(conn->net->stream_read(conn, p, to_read TSRMLS_CC)); + DBG_RETURN(conn->net->m.stream_read(conn, p, to_read TSRMLS_CC)); } /* }}} */ @@ -2290,6 +2290,74 @@ /* }}} */ +/* {{{ mysqlnd_net::set_client_option */ +static enum_func_status +MYSQLND_METHOD(mysqlnd_net, set_client_option)(MYSQLND_NET * const net, enum mysqlnd_option option, const char * const value TSRMLS_DC) +{ + DBG_ENTER("mysqlnd_net::set_client_option"); + DBG_INF_FMT("option=%d", option); + switch (option) { + case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: + DBG_INF("MYSQLND_OPT_NET_CMD_BUFFER_SIZE"); + if (*(unsigned int*) value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) { + DBG_RETURN(FAIL); + } + net->cmd_buffer.length = *(unsigned int*) value; + DBG_INF_FMT("new_length=%u", net->cmd_buffer.length); + if (!net->cmd_buffer.buffer) { + net->cmd_buffer.buffer = mnd_pemalloc(net->cmd_buffer.length, net->persistent); + } else { + net->cmd_buffer.buffer = mnd_perealloc(net->cmd_buffer.buffer, net->cmd_buffer.length, net->persistent); + } + break; + case MYSQLND_OPT_NET_READ_BUFFER_SIZE: + DBG_INF("MYSQLND_OPT_NET_READ_BUFFER_SIZE"); + net->options.net_read_buffer_size = *(unsigned int*) value; + DBG_INF_FMT("new_length=%u", net->options.net_read_buffer_size); + break; + case MYSQL_OPT_CONNECT_TIMEOUT: + DBG_INF("MYSQL_OPT_CONNECT_TIMEOUT"); + net->options.timeout_connect = *(unsigned int*) value; + break; +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_READ_TIMEOUT: + DBG_INF("MYSQL_OPT_READ_TIMEOUT"); + net->options.timeout_read = *(unsigned int*) value; + break; + case MYSQL_OPT_WRITE_TIMEOUT: + DBG_INF("MYSQL_OPT_WRITE_TIMEOUT"); + net->options.timeout_write = *(unsigned int*) value; + break; +#endif +#ifdef WHEN_SUPPORTED_BY_MYSQLI + case MYSQL_OPT_COMPRESS: +#endif + /* currently not supported. Todo!! */ + break; + default: + DBG_RETURN(FAIL); + } + DBG_RETURN(PASS); +} +/* }}} */ + + +/* {{{ mysqlnd_net::set_client_option */ +static void +MYSQLND_METHOD(mysqlnd_net, free_contents)(MYSQLND_NET * net TSRMLS_DC) +{ + DBG_ENTER("mysqlnd_net::free_contents"); + +#ifdef MYSQLND_COMPRESSION_ENABLED + if (net->uncompressed_data) { + net->uncompressed_data->free_buffer(&net->uncompressed_data TSRMLS_CC); + } +#endif + DBG_VOID_RETURN; +} +/* }}} */ + + /* {{{ mysqlnd_net_init */ MYSQLND_NET * mysqlnd_net_init(zend_bool persistent TSRMLS_DC) @@ -2300,15 +2368,14 @@ DBG_INF_FMT("persistent=%d", persistent); net->persistent = persistent; - net->stream_read = mysqlnd_read_from_stream; - net->stream_write = mysqlnd_stream_write; + net->m.stream_read = MYSQLND_METHOD(mysqlnd_net, read_from_stream); + net->m.stream_write = MYSQLND_METHOD(mysqlnd_net, stream_write); + net->m.set_client_option = MYSQLND_METHOD(mysqlnd_net, set_client_option); + net->m.free_contents = MYSQLND_METHOD(mysqlnd_net, free_contents); { - size_t buffer_size = MYSQLND_G(net_cmd_buffer_size) > MYSQLND_NET_CMD_BUFFER_MIN_SIZE? - MYSQLND_G(net_cmd_buffer_size): - MYSQLND_NET_CMD_BUFFER_MIN_SIZE; - net->cmd_buffer.length = buffer_size; - net->cmd_buffer.buffer = mnd_pemalloc(buffer_size, persistent); + unsigned int buf_size = MYSQLND_G(net_read_buffer_size); /* this is long, cast to unsigned int*/ + net->m.set_client_option(net, MYSQLND_OPT_NET_CMD_BUFFER_SIZE, (char *) &buf_size TSRMLS_CC); } DBG_RETURN(net); }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php