From f06bee27f013cfa233162da7bf29e1aebd68b87a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Johannes=20Schl=C3=BCter?= Date: Thu, 4 Feb 2010 20:28:55 +0000 Subject: [PATCH] Merge mysql changes 293815 Add possibility to restrain the number of levels (andrey) 293816 decrement correctly! (andrey) 293976 Fix for bug#50772 (andrey) 294302 Tests related to #50727 (uw) 294313 Fix a bug in mysqlnd where a pointer was not incremented (andrey) 294317 Fix second bug in that code, + instead of += thus not increasing (andrey) 294337 No idea which recent change has cause this little API change, however it is not (uw) 294421 Pass tsrmls to all functions, which might need it in the future. (andrey) --- ext/mysqli/mysqli_api.c | 15 +- ext/mysqli/mysqli_nonapi.c | 3 +- ext/mysqli/php_mysqli_structs.h | 2 + ext/mysqli/tests/bug50772.phpt | 36 +++ ...ysqli_class_mysqli_properties_no_conn.phpt | 282 ++++++++++++++++++ ext/mysqlnd/mysqlnd.c | 41 ++- ext/mysqlnd/mysqlnd.h | 65 ++-- ext/mysqlnd/mysqlnd_debug.c | 32 +- ext/mysqlnd/mysqlnd_debug.h | 2 +- ext/mysqlnd/mysqlnd_ps.c | 38 +-- ext/mysqlnd/mysqlnd_result.c | 34 +-- ext/mysqlnd/mysqlnd_result_meta.c | 11 +- ext/mysqlnd/mysqlnd_statistics.h | 53 +--- ext/mysqlnd/mysqlnd_structs.h | 76 ++--- ext/mysqlnd/mysqlnd_wireprotocol.c | 3 +- ext/pdo_mysql/mysql_driver.c | 2 +- ext/pdo_mysql/mysql_statement.c | 6 +- 17 files changed, 506 insertions(+), 195 deletions(-) create mode 100644 ext/mysqli/tests/bug50772.phpt create mode 100644 ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 43b60848ca..5c9cd6e0a2 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1333,9 +1333,9 @@ PHP_FUNCTION(mysqli_info) } /* }}} */ -/* {{{ proto resource mysqli_init(void) - Initialize mysqli and return a resource for use with mysql_real_connect */ -PHP_FUNCTION(mysqli_init) + +/* {{{ php_mysqli_init() */ +void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS) { MYSQLI_RESOURCE *mysqli_resource; MY_MYSQL *mysql; @@ -1372,6 +1372,15 @@ PHP_FUNCTION(mysqli_init) } /* }}} */ + +/* {{{ proto resource mysqli_init(void) + Initialize mysqli and return a resource for use with mysql_real_connect */ +PHP_FUNCTION(mysqli_init) +{ + php_mysqli_init(INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + /* {{{ proto mixed mysqli_insert_id(object link) Get the ID generated from the previous INSERT operation */ PHP_FUNCTION(mysqli_insert_id) diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index 9cbf8d2607..b3b0dded08 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -80,7 +80,8 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne #endif if (getThis() && !ZEND_NUM_ARGS() && in_ctor) { - RETURN_NULL(); + php_mysqli_init(INTERNAL_FUNCTION_PARAM_PASSTHRU); + return; } hostname = username = dbname = passwd = socket = NULL; diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h index 7625378579..ecf91518fb 100644 --- a/ext/mysqli/php_mysqli_structs.h +++ b/ext/mysqli/php_mysqli_structs.h @@ -338,6 +338,8 @@ if ((MyG(report_mode) & MYSQLI_REPORT_ERROR) && mysql_stmt_errno(stmt)) { \ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_connect, zend_bool in_ctor); +void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS); + ZEND_BEGIN_MODULE_GLOBALS(mysqli) long default_link; diff --git a/ext/mysqli/tests/bug50772.phpt b/ext/mysqli/tests/bug50772.phpt new file mode 100644 index 0000000000..4724d0f29e --- /dev/null +++ b/ext/mysqli/tests/bug50772.phpt @@ -0,0 +1,36 @@ +--TEST-- +Bug #50772 (mysqli constructor without parameters does not return a working mysqli object) +--SKIPIF-- + +--FILE-- +options(MYSQLI_OPT_CONNECT_TIMEOUT, 3); + $db1->real_connect($host, $user, $passwd); + if(mysqli_connect_error()) { + echo "error 1\n"; + } else { + echo "ok 1\n"; + } + + $db2 = mysqli_init(); + + $db2->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3); + $db2->real_connect($host, $user, $passwd); + if(mysqli_connect_error()) { + echo "error 2\n"; + } else { + echo "ok 2\n"; + } + echo "done\n"; +?> +--EXPECTF-- +ok 1 +ok 2 +done \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt b/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt new file mode 100644 index 0000000000..d0940a7561 --- /dev/null +++ b/ext/mysqli/tests/mysqli_class_mysqli_properties_no_conn.phpt @@ -0,0 +1,282 @@ +--TEST-- +Interface of the class mysqli +--SKIPIF-- + +--FILE-- + $var) { + printf("%s = '%s'\n", $var, var_export(@$mysqli->$var, true)); + } + + printf("\nObject variables:\n"); + $variables = array_keys(get_object_vars($mysqli)); + foreach ($variables as $k => $var) { + printf("%s = '%s'\n", $var, var_export(@$mysqli->$var, true)); + } + + printf("\nMagic, magic properties:\n"); + + assert(@mysqli_affected_rows($mysqli) === @$mysqli->affected_rows); + printf("mysqli->affected_rows = '%s'/%s ('%s'/%s)\n", + @$mysqli->affected_rows, gettype(@$mysqli->affected_rows), + @mysqli_affected_rows($mysqli), gettype(@mysqli_affected_rows($mysqli))); + + assert(@mysqli_get_client_info() === @$mysqli->client_info); + printf("mysqli->client_info = '%s'/%s ('%s'/%s)\n", + @$mysqli->client_info, gettype(@$mysqli->client_info), + @mysqli_get_client_info(), gettype(@mysqli_get_client_info())); + + assert(@mysqli_get_client_version() === @$mysqli->client_version); + printf("mysqli->client_version = '%s'/%s ('%s'/%s)\n", + @$mysqli->client_version, gettype(@$mysqli->client_version), + @mysqli_get_client_version(), gettype(@mysqli_get_client_version())); + + assert(@mysqli_errno($mysqli) === @$mysqli->errno); + printf("mysqli->errno = '%s'/%s ('%s'/%s)\n", + @$mysqli->errno, gettype(@$mysqli->errno), + + @mysqli_errno($mysqli), gettype(@mysqli_errno($mysqli))); + + assert(@mysqli_error($mysqli) === @$mysqli->error); + printf("mysqli->error = '%s'/%s ('%s'/%s)\n", + @$mysqli->error, gettype(@$mysqli->error), + @mysqli_error($mysqli), gettype(@mysqli_error($mysqli))); + + assert(@mysqli_field_count($mysqli) === @$mysqli->field_count); + printf("mysqli->field_count = '%s'/%s ('%s'/%s)\n", + @$mysqli->field_count, gettype(@$mysqli->field_count), + @mysqli_field_count($mysqli), gettype(@mysqli_field_count($mysqli))); + + assert(@mysqli_insert_id($mysqli) === @$mysqli->insert_id); + printf("mysqli->insert_id = '%s'/%s ('%s'/%s)\n", + @$mysqli->insert_id, gettype(@$mysqli->insert_id), + @mysqli_insert_id($mysqli), gettype(@mysqli_insert_id($mysqli))); + + assert(@mysqli_sqlstate($mysqli) === @$mysqli->sqlstate); + printf("mysqli->sqlstate = '%s'/%s ('%s'/%s)\n", + @$mysqli->sqlstate, gettype(@$mysqli->sqlstate), + @mysqli_sqlstate($mysqli), gettype(@mysqli_sqlstate($mysqli))); + + assert(@mysqli_get_host_info($mysqli) === @$mysqli->host_info); + printf("mysqli->host_info = '%s'/%s ('%s'/%s)\n", + @$mysqli->host_info, gettype(@$mysqli->host_info), + @mysqli_get_host_info($mysqli), gettype(@mysqli_get_host_info($mysqli))); + + /* note that the data types are different */ + assert(@mysqli_info($mysqli) == @$mysqli->info); + printf("mysqli->info = '%s'/%s ('%s'/%s)\n", + @$mysqli->info, gettype(@$mysqli->info), + @mysqli_info($mysqli), gettype(@mysqli_info($mysqli))); + + assert(@mysqli_thread_id($mysqli) > @$mysqli->thread_id); + assert(gettype(@$mysqli->thread_id) == gettype(@mysqli_thread_id($mysqli))); + printf("mysqli->thread_id = '%s'/%s ('%s'/%s)\n", + @$mysqli->thread_id, gettype(@$mysqli->thread_id), + @mysqli_thread_id($mysqli), gettype(@mysqli_thread_id($mysqli))); + + assert(@mysqli_get_proto_info($mysqli) === @$mysqli->protocol_version); + printf("mysqli->protocol_version = '%s'/%s ('%s'/%s)\n", + @$mysqli->protocol_version, gettype(@$mysqli->protocol_version), + @mysqli_get_proto_info($mysqli), gettype(@mysqli_get_proto_info($mysqli))); + + assert(@mysqli_get_server_info($mysqli) === @$mysqli->server_info); + printf("mysqli->server_info = '%s'/%s ('%s'/%s)\n", + @$mysqli->server_info, gettype(@$mysqli->server_info), + @mysqli_get_server_info($mysqli), gettype(@mysqli_get_server_info($mysqli))); + + assert(@mysqli_get_server_version($mysqli) === @$mysqli->server_version); + printf("mysqli->server_version = '%s'/%s ('%s'/%s)\n", + @$mysqli->server_version, gettype(@$mysqli->server_version), + @mysqli_get_server_version($mysqli), gettype(@mysqli_get_server_version($mysqli))); + + assert(@mysqli_warning_count($mysqli) === @$mysqli->warning_count); + printf("mysqli->warning_count = '%s'/%s ('%s'/%s)\n", + @$mysqli->warning_count, gettype(@$mysqli->warning_count), + @mysqli_warning_count($mysqli), gettype(@mysqli_warning_count($mysqli))); + + printf("\nAccess to undefined properties:\n"); + printf("mysqli->unknown = '%s'\n", @$mysqli->unknown); + + @$mysqli->unknown = 13; + printf("setting mysqli->unknown, @mysqli_unknown = '%s'\n", @$mysqli->unknown); + + $unknown = 'friday'; + @$mysqli->unknown = $unknown; + printf("setting mysqli->unknown, @mysqli_unknown = '%s'\n", @$mysqli->unknown); + + printf("\nAccess hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation):\n"); + assert(@mysqli_connect_error() === @$mysqli->connect_error); + printf("mysqli->connect_error = '%s'/%s ('%s'/%s)\n", + @$mysqli->connect_error, gettype(@$mysqli->connect_error), + @mysqli_connect_error(), gettype(@mysqli_connect_error())); + + assert(@mysqli_connect_errno() === @$mysqli->connect_errno); + printf("mysqli->connect_errno = '%s'/%s ('%s'/%s)\n", + @$mysqli->connect_errno, gettype(@$mysqli->connect_errno), + @mysqli_connect_errno(), gettype(@mysqli_connect_errno())); + } + + printf("Without RS\n"); + $mysqli = @new mysqli($host, $user, $passwd . "invalid", $db, $port, $socket); + dump_properties($mysqli); + + printf("With RS\n"); + $mysqli = @new mysqli($host, $user, $passwd . "invalid", $db, $port, $socket); + $res = @$mysqli->query("SELECT * FROM test"); + dump_properties($mysqli); + + print "done!"; +?> +--CLEAN-- + +--EXPECTF-- +Without RS + +Class variables: +affected_rows = 'NULL' +client_info = 'NULL' +client_version = '%s' +connect_errno = '%s' +connect_error = ''%s' +errno = 'NULL' +error = 'NULL' +field_count = 'NULL' +host_info = 'NULL' +info = 'NULL' +insert_id = 'NULL' +protocol_version = 'NULL' +server_info = 'NULL' +server_version = 'NULL' +sqlstate = 'NULL' +thread_id = 'NULL' +warning_count = 'NULL' + +Object variables: +affected_rows = 'NULL' +client_info = 'NULL' +client_version = '%s' +connect_errno = '%s' +connect_error = '%s' +errno = 'NULL' +error = 'NULL' +field_count = 'NULL' +host_info = 'NULL' +info = 'NULL' +insert_id = 'NULL' +server_info = 'NULL' +server_version = 'NULL' +sqlstate = 'NULL' +protocol_version = 'NULL' +thread_id = 'NULL' +warning_count = 'NULL' + +Magic, magic properties: +mysqli->affected_rows = ''/NULL (''/NULL) + +Warning: assert(): Assertion failed in %s on line %d +mysqli->client_info = ''/NULL ('%s'/%s) +mysqli->client_version = '%s'/integer ('%s'/integer) +mysqli->errno = ''/NULL (''/NULL) +mysqli->error = ''/NULL (''/NULL) +mysqli->field_count = ''/NULL (''/NULL) +mysqli->insert_id = ''/NULL (''/NULL) +mysqli->sqlstate = ''/NULL (''/NULL) +mysqli->host_info = ''/NULL (''/NULL) +mysqli->info = ''/NULL (''/NULL) + +Warning: assert(): Assertion failed in %s on line %d +mysqli->thread_id = ''/NULL (''/NULL) +mysqli->protocol_version = ''/NULL (''/NULL) +mysqli->server_info = ''/NULL (''/NULL) +mysqli->server_version = ''/NULL (''/NULL) +mysqli->warning_count = ''/NULL (''/NULL) + +Access to undefined properties: +mysqli->unknown = '' +setting mysqli->unknown, @mysqli_unknown = '13' +setting mysqli->unknown, @mysqli_unknown = 'friday' + +Access hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation): +mysqli->connect_error = '%s'/%s) +mysqli->connect_errno = '%s'/integer ('%s'/integer) +With RS + +Class variables: +affected_rows = 'NULL' +client_info = 'NULL' +client_version = '%s' +connect_errno = '%s' +connect_error = '%s' +errno = 'NULL' +error = 'NULL' +field_count = 'NULL' +host_info = 'NULL' +info = 'NULL' +insert_id = 'NULL' +protocol_version = 'NULL' +server_info = 'NULL' +server_version = 'NULL' +sqlstate = 'NULL' +thread_id = 'NULL' +warning_count = 'NULL' + +Object variables: +affected_rows = 'NULL' +client_info = 'NULL' +client_version = '%s' +connect_errno = '%s' +connect_error = '%s' +errno = 'NULL' +error = 'NULL' +field_count = 'NULL' +host_info = 'NULL' +info = 'NULL' +insert_id = 'NULL' +server_info = 'NULL' +server_version = 'NULL' +sqlstate = 'NULL' +protocol_version = 'NULL' +thread_id = 'NULL' +warning_count = 'NULL' + +Magic, magic properties: +mysqli->affected_rows = ''/NULL (''/NULL) + +Warning: assert(): Assertion failed in %s on line %d +mysqli->client_info = ''/NULL ('%s'/%s) +mysqli->client_version = '%s'/integer ('%s'/integer) +mysqli->errno = ''/NULL (''/NULL) +mysqli->error = ''/NULL (''/NULL) +mysqli->field_count = ''/NULL (''/NULL) +mysqli->insert_id = ''/NULL (''/NULL) +mysqli->sqlstate = ''/NULL (''/NULL) +mysqli->host_info = ''/NULL (''/NULL) +mysqli->info = ''/NULL (''/NULL) + +Warning: assert(): Assertion failed in %s on line %d +mysqli->thread_id = ''/NULL (''/NULL) +mysqli->protocol_version = ''/NULL (''/NULL) +mysqli->server_info = ''/NULL (''/NULL) +mysqli->server_version = ''/NULL (''/NULL) +mysqli->warning_count = ''/NULL (''/NULL) + +Access to undefined properties: +mysqli->unknown = '' +setting mysqli->unknown, @mysqli_unknown = '13' +setting mysqli->unknown, @mysqli_unknown = 'friday' + +Access hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation): +mysqli->connect_error = '%s'/%s) +mysqli->connect_errno = '%s'/integer ('%s'/integer) +done! \ No newline at end of file diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index bf3f475a5a..6fa5eae5c0 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -397,8 +397,7 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command)(MYSQLND *conn, enum php_mysqlnd_ser /* {{{ mysqlnd_conn::set_server_option */ static enum_func_status -MYSQLND_METHOD(mysqlnd_conn, set_server_option)(MYSQLND * const conn, - enum_mysqlnd_server_option option TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_conn, set_server_option)(MYSQLND * const conn, enum_mysqlnd_server_option option TSRMLS_DC) { enum_func_status ret; char buffer[2]; @@ -1108,8 +1107,7 @@ MYSQLND_METHOD(mysqlnd_conn, list_fields)(MYSQLND *conn, const char *table, cons /* {{{ mysqlnd_conn::list_method */ MYSQLND_RES * -MYSQLND_METHOD(mysqlnd_conn, list_method)(MYSQLND *conn, const char *query, - const char *achtung_wild, char *par1 TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_conn, list_method)(MYSQLND *conn, const char *query, const char *achtung_wild, char *par1 TSRMLS_DC) { char *show_query = NULL; size_t show_query_len; @@ -1145,7 +1143,7 @@ MYSQLND_METHOD(mysqlnd_conn, list_method)(MYSQLND *conn, const char *query, /* {{{ mysqlnd_conn::errno */ static unsigned int -MYSQLND_METHOD(mysqlnd_conn, errno)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, errno)(const MYSQLND * const conn TSRMLS_DC) { return conn->error_info.error_no; } @@ -1154,7 +1152,7 @@ MYSQLND_METHOD(mysqlnd_conn, errno)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::error */ static const char * -MYSQLND_METHOD(mysqlnd_conn, error)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, error)(const MYSQLND * const conn TSRMLS_DC) { return conn->error_info.error; } @@ -1163,7 +1161,7 @@ MYSQLND_METHOD(mysqlnd_conn, error)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::sqlstate */ static const char * -MYSQLND_METHOD(mysqlnd_conn, sqlstate)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, sqlstate)(const MYSQLND * const conn TSRMLS_DC) { return conn->error_info.sqlstate[0] ? conn->error_info.sqlstate:MYSQLND_SQLSTATE_NULL; } @@ -1182,8 +1180,7 @@ PHPAPI ulong mysqlnd_old_escape_string(char *newstr, const char *escapestr, size /* {{{ mysqlnd_conn::escape_string */ static ulong -MYSQLND_METHOD(mysqlnd_conn, escape_string)(const MYSQLND * const conn, char *newstr, - const char *escapestr, size_t escapestr_len TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_conn, escape_string)(const MYSQLND * const conn, char *newstr, const char *escapestr, size_t escapestr_len TSRMLS_DC) { DBG_ENTER("mysqlnd_conn::escape_string"); DBG_INF_FMT("conn=%llu", conn->thread_id); @@ -1208,9 +1205,7 @@ MYSQLND_METHOD(mysqlnd_conn, dump_debug_info)(MYSQLND * const conn TSRMLS_DC) /* {{{ mysqlnd_conn::select_db */ static enum_func_status -MYSQLND_METHOD(mysqlnd_conn, select_db)(MYSQLND * const conn, - const char * const db, - unsigned int db_len TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_conn, select_db)(MYSQLND * const conn, const char * const db, unsigned int db_len TSRMLS_DC) { enum_func_status ret; @@ -1529,7 +1524,7 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_conn, set_state)(MYSQLND * const conn, enum mysql /* {{{ mysqlnd_conn::field_count */ static unsigned int -MYSQLND_METHOD(mysqlnd_conn, field_count)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, field_count)(const MYSQLND * const conn TSRMLS_DC) { return conn->field_count; } @@ -1538,7 +1533,7 @@ MYSQLND_METHOD(mysqlnd_conn, field_count)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::insert_id */ static uint64_t -MYSQLND_METHOD(mysqlnd_conn, insert_id)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, insert_id)(const MYSQLND * const conn TSRMLS_DC) { return conn->upsert_status.last_insert_id; } @@ -1547,7 +1542,7 @@ MYSQLND_METHOD(mysqlnd_conn, insert_id)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::affected_rows */ static uint64_t -MYSQLND_METHOD(mysqlnd_conn, affected_rows)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, affected_rows)(const MYSQLND * const conn TSRMLS_DC) { return conn->upsert_status.affected_rows; } @@ -1556,7 +1551,7 @@ MYSQLND_METHOD(mysqlnd_conn, affected_rows)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::warning_count */ static unsigned int -MYSQLND_METHOD(mysqlnd_conn, warning_count)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, warning_count)(const MYSQLND * const conn TSRMLS_DC) { return conn->upsert_status.warning_count; } @@ -1565,7 +1560,7 @@ MYSQLND_METHOD(mysqlnd_conn, warning_count)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::info */ static const char * -MYSQLND_METHOD(mysqlnd_conn, info)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, info)(const MYSQLND * const conn TSRMLS_DC) { return conn->last_message; } @@ -1590,7 +1585,7 @@ PHPAPI unsigned int mysqlnd_get_client_version() /* {{{ mysqlnd_conn::get_server_info */ static const char * -MYSQLND_METHOD(mysqlnd_conn, get_server_info)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, get_server_info)(const MYSQLND * const conn TSRMLS_DC) { return conn->server_version; } @@ -1599,7 +1594,7 @@ MYSQLND_METHOD(mysqlnd_conn, get_server_info)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::get_host_info */ static const char * -MYSQLND_METHOD(mysqlnd_conn, get_host_info)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, get_host_info)(const MYSQLND * const conn TSRMLS_DC) { return conn->host_info; } @@ -1608,7 +1603,7 @@ MYSQLND_METHOD(mysqlnd_conn, get_host_info)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::get_proto_info */ static unsigned int -MYSQLND_METHOD(mysqlnd_conn, get_proto_info)(const MYSQLND *const conn) +MYSQLND_METHOD(mysqlnd_conn, get_proto_info)(const MYSQLND *const conn TSRMLS_DC) { return conn->protocol_version; } @@ -1617,7 +1612,7 @@ MYSQLND_METHOD(mysqlnd_conn, get_proto_info)(const MYSQLND *const conn) /* {{{ mysqlnd_conn::charset_name */ static const char * -MYSQLND_METHOD(mysqlnd_conn, charset_name)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, charset_name)(const MYSQLND * const conn TSRMLS_DC) { return conn->charset->name; } @@ -1626,7 +1621,7 @@ MYSQLND_METHOD(mysqlnd_conn, charset_name)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::thread_id */ static uint64_t -MYSQLND_METHOD(mysqlnd_conn, thread_id)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, thread_id)(const MYSQLND * const conn TSRMLS_DC) { return conn->thread_id; } @@ -1635,7 +1630,7 @@ MYSQLND_METHOD(mysqlnd_conn, thread_id)(const MYSQLND * const conn) /* {{{ mysqlnd_conn::get_server_version */ static unsigned long -MYSQLND_METHOD(mysqlnd_conn, get_server_version)(const MYSQLND * const conn) +MYSQLND_METHOD(mysqlnd_conn, get_server_version)(const MYSQLND * const conn TSRMLS_DC) { long major, minor, patch; char *p; diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h index 739e95d2c7..c3b2f6bf4d 100644 --- a/ext/mysqlnd/mysqlnd.h +++ b/ext/mysqlnd/mysqlnd.h @@ -162,7 +162,7 @@ PHPAPI enum_func_status _mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQ #define mysqlnd_num_rows(result) ((result)->stored_data? (result)->stored_data->row_count:0) #define mysqlnd_num_fields(result) (result)->field_count -#define mysqlnd_fetch_lengths(result) ((result)->m.fetch_lengths? (result)->m.fetch_lengths((result)):NULL) +#define mysqlnd_fetch_lengths(result) ((result)->m.fetch_lengths? (result)->m.fetch_lengths((result) TSRMLS_CC) : NULL) #define mysqlnd_field_seek(result, ofs) (result)->m.seek_field((result), (ofs)) #define mysqlnd_field_tell(result) ((result)->meta? (result)->meta->current_field:0) @@ -192,31 +192,32 @@ PHPAPI enum_func_status _mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQ /*****************************************************************************************************/ /* Errors */ -#define mysqlnd_errno(conn) (conn)->m->get_error_no((conn)) -#define mysqlnd_error(conn) (conn)->m->get_error_str((conn)) -#define mysqlnd_sqlstate(conn) (conn)->m->get_sqlstate((conn)) +#define mysqlnd_errno(conn) (conn)->m->get_error_no((conn) TSRMLS_CC) +#define mysqlnd_error(conn) (conn)->m->get_error_str((conn) TSRMLS_CC) +#define mysqlnd_sqlstate(conn) (conn)->m->get_sqlstate((conn) TSRMLS_CC) /* Charset */ -#define mysqlnd_character_set_name(conn) (conn)->m->charset_name((conn)) +#define mysqlnd_character_set_name(conn) (conn)->m->charset_name((conn) TSRMLS_CC) /* Simple metadata */ -#define mysqlnd_field_count(conn) (conn)->m->get_field_count((conn)) -#define mysqlnd_insert_id(conn) (conn)->m->get_last_insert_id((conn)) -#define mysqlnd_affected_rows(conn) (conn)->m->get_affected_rows((conn)) -#define mysqlnd_warning_count(conn) (conn)->m->get_warning_count((conn)) -#define mysqlnd_info(conn) (conn)->m->get_last_message((conn)) -#define mysqlnd_get_server_info(conn) (conn)->m->get_server_information((conn)) -#define mysqlnd_get_host_info(conn) (conn)->m->get_host_information((conn)) -#define mysqlnd_get_proto_info(conn) (conn)->m->get_protocol_information((conn)) -#define mysqlnd_thread_id(conn) (conn)->m->get_thread_id((conn)) - -#define mysqlnd_num_rows(result) (result)->m.num_rows((result)) -#define mysqlnd_num_fields(result) (result)->m.num_fields((result)) - -PHPAPI unsigned long * mysqlnd_fetch_lengths(MYSQLND_RES * const result); - -#define mysqlnd_field_seek(result, ofs) (result)->m.seek_field((result), (ofs)) -#define mysqlnd_field_tell(result) (result)->m.field_tell((result)) +#define mysqlnd_field_count(conn) (conn)->m->get_field_count((conn) TSRMLS_CC) +#define mysqlnd_insert_id(conn) (conn)->m->get_last_insert_id((conn) TSRMLS_CC) +#define mysqlnd_affected_rows(conn) (conn)->m->get_affected_rows((conn) TSRMLS_CC) +#define mysqlnd_warning_count(conn) (conn)->m->get_warning_count((conn) TSRMLS_CC) +#define mysqlnd_info(conn) (conn)->m->get_last_message((conn) TSRMLS_CC) +#define mysqlnd_get_server_info(conn) (conn)->m->get_server_information((conn) TSRMLS_CC) +#define mysqlnd_get_host_info(conn) (conn)->m->get_host_information((conn) TSRMLS_CC) +#define mysqlnd_get_proto_info(conn) (conn)->m->get_protocol_information((conn) TSRMLS_CC) +#define mysqlnd_thread_id(conn) (conn)->m->get_thread_id((conn) TSRMLS_CC) + +#define mysqlnd_num_rows(result) (result)->m.num_rows((result) TSRMLS_CC) +#define mysqlnd_num_fields(result) (result)->m.num_fields((result) TSRMLS_CC) + +#define mysqlnd_fetch_lengths(result) _mysqlnd_fetch_lengths((result) TSRMLS_CC) +PHPAPI unsigned long * _mysqlnd_fetch_lengths(MYSQLND_RES * const result TSRMLS_DC); + +#define mysqlnd_field_seek(result, ofs) (result)->m.seek_field((result), (ofs) TSRMLS_CC) +#define mysqlnd_field_tell(result) (result)->m.field_tell((result) TSRMLS_CC) #define mysqlnd_fetch_field(result) (result)->m.fetch_field((result) TSRMLS_CC) #define mysqlnd_fetch_field_direct(result,fnr) (result)->m.fetch_field_direct((result), (fnr) TSRMLS_CC) #define mysqlnd_fetch_fields(result) (result)->m.fetch_fields((result) TSRMLS_CC) @@ -226,15 +227,15 @@ PHPAPI const char * mysqlnd_get_client_info(); PHPAPI unsigned int mysqlnd_get_client_version(); /* PS */ -#define mysqlnd_stmt_insert_id(stmt) (stmt)->m->get_last_insert_id((stmt)) -#define mysqlnd_stmt_affected_rows(stmt) (stmt)->m->get_affected_rows((stmt)) -#define mysqlnd_stmt_num_rows(stmt) (stmt)->m->get_num_rows((stmt)) -#define mysqlnd_stmt_param_count(stmt) (stmt)->m->get_param_count((stmt)) -#define mysqlnd_stmt_field_count(stmt) (stmt)->m->get_field_count((stmt)) -#define mysqlnd_stmt_warning_count(stmt) (stmt)->m->get_warning_count((stmt)) -#define mysqlnd_stmt_errno(stmt) (stmt)->m->get_error_no((stmt)) -#define mysqlnd_stmt_error(stmt) (stmt)->m->get_error_str((stmt)) -#define mysqlnd_stmt_sqlstate(stmt) (stmt)->m->get_sqlstate((stmt)) +#define mysqlnd_stmt_insert_id(stmt) (stmt)->m->get_last_insert_id((stmt) TSRMLS_CC) +#define mysqlnd_stmt_affected_rows(stmt) (stmt)->m->get_affected_rows((stmt) TSRMLS_CC) +#define mysqlnd_stmt_num_rows(stmt) (stmt)->m->get_num_rows((stmt) TSRMLS_CC) +#define mysqlnd_stmt_param_count(stmt) (stmt)->m->get_param_count((stmt) TSRMLS_CC) +#define mysqlnd_stmt_field_count(stmt) (stmt)->m->get_field_count((stmt) TSRMLS_CC) +#define mysqlnd_stmt_warning_count(stmt) (stmt)->m->get_warning_count((stmt) TSRMLS_CC) +#define mysqlnd_stmt_errno(stmt) (stmt)->m->get_error_no((stmt) TSRMLS_CC) +#define mysqlnd_stmt_error(stmt) (stmt)->m->get_error_str((stmt) TSRMLS_CC) +#define mysqlnd_stmt_sqlstate(stmt) (stmt)->m->get_sqlstate((stmt) TSRMLS_CC) #endif /* MYSQLND_USE_OPTIMISATIONS */ /*****************************************************************************************************/ @@ -263,7 +264,7 @@ PHPAPI void mysqlnd_set_local_infile_handler(MYSQLND * const conn, const char * #define mysqlnd_kill(conn, pid) (conn)->m->kill_connection((conn), (pid) TSRMLS_CC) #define mysqlnd_refresh(conn, options) (conn)->m->refresh_server((conn), (options) TSRMLS_CC) #define mysqlnd_shutdown(conn, level) (conn)->m->shutdown_server((conn), (level) TSRMLS_CC) -#define mysqlnd_get_server_version(conn) (conn)->m->get_server_version((conn)) +#define mysqlnd_get_server_version(conn) (conn)->m->get_server_version((conn) TSRMLS_CC) #define mysqlnd_set_character_set(conn, cs) (conn)->m->set_charset((conn), (cs) TSRMLS_CC) #define mysqlnd_stat(conn, msg, msg_len) (conn)->m->get_server_statistics((conn), (msg), (msg_len) TSRMLS_CC) #define mysqlnd_options(conn, opt, value) (conn)->m->set_client_option((conn), (opt), (value) TSRMLS_CC) diff --git a/ext/mysqlnd/mysqlnd_debug.c b/ext/mysqlnd/mysqlnd_debug.c index 1de52920d0..085a8ed55b 100644 --- a/ext/mysqlnd/mysqlnd_debug.c +++ b/ext/mysqlnd/mysqlnd_debug.c @@ -1113,11 +1113,18 @@ static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_l long line; HashTable *ht = Z_ARRVAL_PP(frame); zval **file, **tmp; + uint * level; + level = va_arg(args, uint *); str = va_arg(args, char**); len = va_arg(args, int*); num = va_arg(args, int*); + if (!*level) { + return ZEND_HASH_APPLY_KEEP; + } + --*level; + s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 1 + 1); sprintf(s_tmp, "#%d ", (*num)++); TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); @@ -1283,11 +1290,18 @@ static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_l long line; HashTable *ht = Z_ARRVAL_PP(frame); zval **file, **tmp; + uint * level; + level = va_arg(args, uint *); str = va_arg(args, char**); len = va_arg(args, int*); num = va_arg(args, int*); + if (!*level) { + return ZEND_HASH_APPLY_KEEP; + } + --*level; + s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 1 + 1); sprintf(s_tmp, "#%d ", (*num)++); TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); @@ -1323,24 +1337,30 @@ static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_l #endif -char * mysqlnd_get_backtrace(TSRMLS_D) +PHPAPI char * mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC) { zval *trace; char *res = estrdup(""), **str = &res, *s_tmp; int res_len = 0, *len = &res_len, num = 0; + if (max_levels == 0) { + max_levels = 99999; + } MAKE_STD_ZVAL(trace); zend_fetch_debug_backtrace(trace, 0, 0 TSRMLS_CC); - zend_hash_apply_with_arguments(Z_ARRVAL_P(trace) TSRMLS_CC, (apply_func_args_t)mysqlnd_build_trace_string, 3, str, len, &num); + zend_hash_apply_with_arguments(Z_ARRVAL_P(trace) TSRMLS_CC, (apply_func_args_t)mysqlnd_build_trace_string, 4, &max_levels, str, len, &num); zval_ptr_dtor(&trace); - s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 7 + 1); - sprintf(s_tmp, "#%d {main}", num); - TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); - efree(s_tmp); + if (max_levels) { + s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 7 + 1); + sprintf(s_tmp, "#%d {main}", num); + TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); + efree(s_tmp); + } res[res_len] = '\0'; + *length = res_len; return res; } diff --git a/ext/mysqlnd/mysqlnd_debug.h b/ext/mysqlnd/mysqlnd_debug.h index fa6246f9f2..96c953c24d 100644 --- a/ext/mysqlnd/mysqlnd_debug.h +++ b/ext/mysqlnd/mysqlnd_debug.h @@ -78,7 +78,7 @@ PHPAPI void * _mysqlnd_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D); PHPAPI void * _mysqlnd_realloc(void *ptr, size_t new_size MYSQLND_MEM_D); PHPAPI void _mysqlnd_free(void *ptr MYSQLND_MEM_D); -PHPAPI char * mysqlnd_get_backtrace(TSRMLS_D); +PHPAPI char * mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC); #if defined(__GNUC__) #define DBG_INF_EX(dbg_obj, msg) do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log((dbg_obj), __LINE__, __FILE__, -1, "info : ", (msg)); } while (0) diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index d5677ed6d6..a22aaa3dca 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -304,8 +304,7 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT *stmt TSRMLS_DC) /* {{{ mysqlnd_stmt::prepare */ static enum_func_status -MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const stmt, const char * const query, - unsigned int query_len TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const stmt, const char * const query, unsigned int query_len TSRMLS_DC) { MYSQLND_STMT *stmt_to_prepare = stmt; @@ -625,8 +624,7 @@ MYSQLND_METHOD(mysqlnd_stmt, execute)(MYSQLND_STMT * const stmt TSRMLS_DC) /* {{{ mysqlnd_fetch_stmt_row_buffered */ enum_func_status -mysqlnd_fetch_stmt_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, - zend_bool *fetched_anything TSRMLS_DC) +mysqlnd_fetch_stmt_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC) { MYSQLND_STMT *stmt = (MYSQLND_STMT *) param; MYSQLND_RES_BUFFERED *set = result->stored_data; @@ -721,8 +719,7 @@ mysqlnd_fetch_stmt_row_buffered(MYSQLND_RES *result, void *param, unsigned int f /* {{{ mysqlnd_stmt_fetch_row_unbuffered */ static enum_func_status -mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flags, - zend_bool *fetched_anything TSRMLS_DC) +mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC) { enum_func_status ret; MYSQLND_STMT *stmt = (MYSQLND_STMT *) param; @@ -885,8 +882,7 @@ MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT *stmt TSRMLS_DC) /* {{{ mysqlnd_fetch_row_cursor */ enum_func_status -mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int flags, - zend_bool *fetched_anything TSRMLS_DC) +mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC) { enum_func_status ret; MYSQLND_STMT *stmt = (MYSQLND_STMT *) param; @@ -1027,8 +1023,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla /* {{{ mysqlnd_stmt::fetch */ static enum_func_status -MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const stmt, - zend_bool * const fetched_anything TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const stmt, zend_bool * const fetched_anything TSRMLS_DC) { enum_func_status ret; DBG_ENTER("mysqlnd_stmt::fetch"); @@ -1245,8 +1240,7 @@ MYSQLND_METHOD(mysqlnd_stmt, send_long_data)(MYSQLND_STMT * const stmt, unsigned /* {{{ mysqlnd_stmt::bind_parameters */ static enum_func_status -MYSQLND_METHOD(mysqlnd_stmt, bind_parameters)(MYSQLND_STMT * const stmt, - MYSQLND_PARAM_BIND * const param_bind TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_stmt, bind_parameters)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND * const param_bind TSRMLS_DC) { DBG_ENTER("mysqlnd_stmt::bind_param"); DBG_INF_FMT("stmt=%lu param_count=%u", stmt->stmt_id, stmt->param_count); @@ -1512,7 +1506,7 @@ MYSQLND_METHOD(mysqlnd_stmt, set_result_bind_dtor)(MYSQLND_STMT * const stmt, /* {{{ mysqlnd_stmt::insert_id */ static uint64_t -MYSQLND_METHOD(mysqlnd_stmt, insert_id)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, insert_id)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->upsert_status.last_insert_id; } @@ -1521,7 +1515,7 @@ MYSQLND_METHOD(mysqlnd_stmt, insert_id)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::affected_rows */ static uint64_t -MYSQLND_METHOD(mysqlnd_stmt, affected_rows)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, affected_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->upsert_status.affected_rows; } @@ -1530,7 +1524,7 @@ MYSQLND_METHOD(mysqlnd_stmt, affected_rows)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::num_rows */ static uint64_t -MYSQLND_METHOD(mysqlnd_stmt, num_rows)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, num_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->result? mysqlnd_num_rows(stmt->result):0; } @@ -1539,7 +1533,7 @@ MYSQLND_METHOD(mysqlnd_stmt, num_rows)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::warning_count */ static unsigned int -MYSQLND_METHOD(mysqlnd_stmt, warning_count)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, warning_count)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->upsert_status.warning_count; } @@ -1548,7 +1542,7 @@ MYSQLND_METHOD(mysqlnd_stmt, warning_count)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::field_count */ static unsigned int -MYSQLND_METHOD(mysqlnd_stmt, field_count)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, field_count)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->field_count; } @@ -1557,7 +1551,7 @@ MYSQLND_METHOD(mysqlnd_stmt, field_count)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::param_count */ static unsigned int -MYSQLND_METHOD(mysqlnd_stmt, param_count)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, param_count)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->param_count; } @@ -1566,7 +1560,7 @@ MYSQLND_METHOD(mysqlnd_stmt, param_count)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::errno */ static unsigned int -MYSQLND_METHOD(mysqlnd_stmt, errno)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, errno)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->error_info.error_no; } @@ -1575,7 +1569,7 @@ MYSQLND_METHOD(mysqlnd_stmt, errno)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::error */ static const char * -MYSQLND_METHOD(mysqlnd_stmt, error)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, error)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->error_info.error; } @@ -1584,7 +1578,7 @@ MYSQLND_METHOD(mysqlnd_stmt, error)(const MYSQLND_STMT * const stmt) /* {{{ mysqlnd_stmt::sqlstate */ static const char * -MYSQLND_METHOD(mysqlnd_stmt, sqlstate)(const MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, sqlstate)(const MYSQLND_STMT * const stmt TSRMLS_DC) { return stmt->error_info.sqlstate[0] ? stmt->error_info.sqlstate:MYSQLND_SQLSTATE_NULL; } @@ -1602,7 +1596,7 @@ MYSQLND_METHOD(mysqlnd_stmt, data_seek)(const MYSQLND_STMT * const stmt, uint64_ /* {{{ mysqlnd_stmt::param_metadata */ static MYSQLND_RES * -MYSQLND_METHOD(mysqlnd_stmt, param_metadata)(MYSQLND_STMT * const stmt) +MYSQLND_METHOD(mysqlnd_stmt, param_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC) { if (!stmt->param_count) { return NULL; diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index 17f493a474..1c9af8472b 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -542,7 +542,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC completeness. */ static -unsigned long * mysqlnd_fetch_lengths_buffered(MYSQLND_RES * const result) +unsigned long * mysqlnd_fetch_lengths_buffered(MYSQLND_RES * const result TSRMLS_DC) { unsigned int i; zval **previous_row; @@ -573,7 +573,7 @@ unsigned long * mysqlnd_fetch_lengths_buffered(MYSQLND_RES * const result) /* {{{ mysqlnd_fetch_lengths_unbuffered */ static -unsigned long * mysqlnd_fetch_lengths_unbuffered(MYSQLND_RES * const result) +unsigned long * mysqlnd_fetch_lengths_unbuffered(MYSQLND_RES * const result TSRMLS_DC) { return result->lengths; } @@ -581,9 +581,9 @@ unsigned long * mysqlnd_fetch_lengths_unbuffered(MYSQLND_RES * const result) #if !defined(MYSQLND_USE_OPTIMISATIONS) || MYSQLND_USE_OPTIMISATIONS == 0 /* {{{ mysqlnd_res::fetch_lengths */ -PHPAPI unsigned long * mysqlnd_fetch_lengths(MYSQLND_RES * const result) +PHPAPI unsigned long * _mysqlnd_fetch_lengths(MYSQLND_RES * const result TSRMLS_DC) { - return result->m.fetch_lengths? result->m.fetch_lengths(result):NULL; + return result->m.fetch_lengths? result->m.fetch_lengths(result TSRMLS_CC) : NULL; } /* }}} */ #endif @@ -698,8 +698,7 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES *result TSRMLS_DC) /* {{{ mysqlnd_fetch_row_unbuffered */ static enum_func_status -mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flags, - zend_bool *fetched_anything TSRMLS_DC) +mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC) { enum_func_status ret; zval *row = (zval *) param; @@ -948,8 +947,7 @@ mysqlnd_fetch_row_buffered_c(MYSQLND_RES *result TSRMLS_DC) /* {{{ mysqlnd_fetch_row_buffered */ static enum_func_status -mysqlnd_fetch_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, - zend_bool *fetched_anything TSRMLS_DC) +mysqlnd_fetch_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags, zend_bool *fetched_anything TSRMLS_DC) { unsigned int i; zval *row = (zval *) param; @@ -1267,7 +1265,7 @@ MYSQLND_METHOD(mysqlnd_res, data_seek)(MYSQLND_RES *result, uint64_t row TSRMLS_ /* {{{ mysqlnd_res::num_rows */ static uint64_t -MYSQLND_METHOD(mysqlnd_res, num_rows)(const MYSQLND_RES * const result) +MYSQLND_METHOD(mysqlnd_res, num_rows)(const MYSQLND_RES * const result TSRMLS_DC) { /* Be compatible with libmysql. We count row_count, but will return 0 */ return result->stored_data? result->stored_data->row_count:0; @@ -1277,7 +1275,7 @@ MYSQLND_METHOD(mysqlnd_res, num_rows)(const MYSQLND_RES * const result) /* {{{ mysqlnd_res::num_fields */ static unsigned int -MYSQLND_METHOD(mysqlnd_res, num_fields)(const MYSQLND_RES * const result) +MYSQLND_METHOD(mysqlnd_res, num_fields)(const MYSQLND_RES * const result TSRMLS_DC) { return result->field_count; } @@ -1314,8 +1312,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_field)(MYSQLND_RES * const result TSRMLS_DC) /* {{{ mysqlnd_res::fetch_field_direct */ static const MYSQLND_FIELD * -MYSQLND_METHOD(mysqlnd_res, fetch_field_direct)(MYSQLND_RES * const result, - MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_res, fetch_field_direct)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC) { DBG_ENTER("mysqlnd_res::fetch_field_direct"); if (result->meta) { @@ -1362,8 +1359,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_fields)(MYSQLND_RES * const result TSRMLS_DC) /* {{{ mysqlnd_res::field_seek */ static MYSQLND_FIELD_OFFSET -MYSQLND_METHOD(mysqlnd_res, field_seek)(MYSQLND_RES * const result, - MYSQLND_FIELD_OFFSET field_offset) +MYSQLND_METHOD(mysqlnd_res, field_seek)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset TSRMLS_DC) { MYSQLND_FIELD_OFFSET return_value = 0; if (result->meta) { @@ -1377,9 +1373,9 @@ MYSQLND_METHOD(mysqlnd_res, field_seek)(MYSQLND_RES * const result, /* {{{ mysqlnd_res::field_tell */ static MYSQLND_FIELD_OFFSET -MYSQLND_METHOD(mysqlnd_res, field_tell)(const MYSQLND_RES * const result) +MYSQLND_METHOD(mysqlnd_res, field_tell)(const MYSQLND_RES * const result TSRMLS_DC) { - return result->meta? result->meta->m->field_tell(result->meta):0; + return result->meta? result->meta->m->field_tell(result->meta TSRMLS_CC) : 0; } /* }}} */ @@ -1451,8 +1447,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_row_c)(MYSQLND_RES *result TSRMLS_DC) /* {{{ mysqlnd_res::fetch_all */ static void -MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES *result, unsigned int flags, - zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC) +MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES *result, unsigned int flags, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC) { zval *row; ulong i = 0; @@ -1487,8 +1482,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES *result, unsigned int flags, /* {{{ mysqlnd_res::fetch_field_data */ static void -MYSQLND_METHOD(mysqlnd_res, fetch_field_data)(MYSQLND_RES *result, unsigned int offset, - zval *return_value TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_res, fetch_field_data)(MYSQLND_RES *result, unsigned int offset, zval *return_value TSRMLS_DC) { zval row; zval **entry; diff --git a/ext/mysqlnd/mysqlnd_result_meta.c b/ext/mysqlnd/mysqlnd_result_meta.c index cfb0fbc957..5186f6d94f 100644 --- a/ext/mysqlnd/mysqlnd_result_meta.c +++ b/ext/mysqlnd/mysqlnd_result_meta.c @@ -138,8 +138,7 @@ zend_bool mysqlnd_unicode_is_key_numeric(UChar *key, size_t length, long *idx) /* {{{ mysqlnd_res_meta::read_metadata */ static enum_func_status -MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const meta, - MYSQLND *conn TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const meta, MYSQLND *conn TSRMLS_DC) { unsigned int i = 0; MYSQLND_PACKET_RES_FIELD * field_packet; @@ -303,8 +302,7 @@ MYSQLND_METHOD(mysqlnd_res_meta, free)(MYSQLND_RES_METADATA *meta, zend_bool per /* {{{ mysqlnd_res::clone_metadata */ static MYSQLND_RES_METADATA * -MYSQLND_METHOD(mysqlnd_res_meta, clone_metadata)(const MYSQLND_RES_METADATA * const meta, - zend_bool persistent TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_res_meta, clone_metadata)(const MYSQLND_RES_METADATA * const meta, zend_bool persistent TSRMLS_DC) { unsigned int i; /* +1 is to have empty marker at the end */ @@ -393,8 +391,7 @@ MYSQLND_METHOD(mysqlnd_res_meta, fetch_field)(MYSQLND_RES_METADATA * const meta /* {{{ mysqlnd_res_meta::fetch_field_direct */ static const MYSQLND_FIELD * -MYSQLND_METHOD(mysqlnd_res_meta, fetch_field_direct)(const MYSQLND_RES_METADATA * const meta, - MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_res_meta, fetch_field_direct)(const MYSQLND_RES_METADATA * const meta, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC) { DBG_ENTER("mysqlnd_res_meta::fetch_field_direct"); DBG_INF_FMT("fieldnr=%d", fieldnr); @@ -418,7 +415,7 @@ MYSQLND_METHOD(mysqlnd_res_meta, fetch_fields)(MYSQLND_RES_METADATA * const meta /* {{{ mysqlnd_res_meta::field_tell */ static MYSQLND_FIELD_OFFSET -MYSQLND_METHOD(mysqlnd_res_meta, field_tell)(const MYSQLND_RES_METADATA * const meta) +MYSQLND_METHOD(mysqlnd_res_meta, field_tell)(const MYSQLND_RES_METADATA * const meta TSRMLS_DC) { return meta->current_field; } diff --git a/ext/mysqlnd/mysqlnd_statistics.h b/ext/mysqlnd/mysqlnd_statistics.h index b2b5adab96..e9290f363a 100644 --- a/ext/mysqlnd/mysqlnd_statistics.h +++ b/ext/mysqlnd/mysqlnd_statistics.h @@ -42,13 +42,20 @@ extern const MYSQLND_STRING mysqlnd_stats_values_names[]; #define MYSQLND_STATS_UNLOCK(stats) #endif -#define MYSQLND_CHECK_AND_CALL_HANDLER(stats, statistic, value) \ +#define MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(stats, statistic, value) \ { \ + MYSQLND_STATS_LOCK(stats); \ + (stats)->values[(statistic)] += (value); \ if ((stats)->triggers[(statistic)] && (stats)->in_trigger == FALSE) { \ (stats)->in_trigger = TRUE; \ + MYSQLND_STATS_UNLOCK(stats); \ + \ (stats)->triggers[(statistic)]((stats), (statistic), (value) TSRMLS_CC); \ + \ + MYSQLND_STATS_LOCK(stats); \ (stats)->in_trigger = FALSE; \ } \ + MYSQLND_STATS_UNLOCK(_p_s); \ } \ #define MYSQLND_DEC_STATISTIC(enabler, stats, statistic) \ @@ -56,10 +63,7 @@ extern const MYSQLND_STRING mysqlnd_stats_values_names[]; enum_mysqlnd_collected_stats _s = (statistic);\ MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \ if ((enabler) && _p_s && _s != _p_s->count) { \ - MYSQLND_STATS_LOCK(_p_s); \ - MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, -1); \ - _p_s->values[_s]--; \ - MYSQLND_STATS_UNLOCK(_p_s); \ + MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s, -1); \ }\ } @@ -68,10 +72,7 @@ extern const MYSQLND_STRING mysqlnd_stats_values_names[]; enum_mysqlnd_collected_stats _s = (statistic);\ MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \ if ((enabler) && _p_s && _s != _p_s->count) { \ - MYSQLND_STATS_LOCK(_p_s); \ - MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, 1); \ - _p_s->values[_s]++; \ - MYSQLND_STATS_UNLOCK(_p_s); \ + MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s, 1); \ }\ } @@ -81,10 +82,7 @@ extern const MYSQLND_STRING mysqlnd_stats_values_names[]; MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \ if ((enabler) && _p_s && _s != _p_s->count) { \ uint64_t v = (uint64_t) (value); \ - MYSQLND_STATS_LOCK(_p_s); \ - MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, v); \ - _p_s->values[_s] += v; \ - MYSQLND_STATS_UNLOCK(_p_s); \ + MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s, v); \ }\ } @@ -96,16 +94,8 @@ extern const MYSQLND_STRING mysqlnd_stats_values_names[]; uint64_t v2 = (uint64_t) (value2); \ enum_mysqlnd_collected_stats _s1 = (statistic1);\ enum_mysqlnd_collected_stats _s2 = (statistic2);\ - MYSQLND_STATS_LOCK(_p_s); \ - if (_s1 != _p_s->count) { \ - MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s1, v1); \ - _p_s->values[_s1]+= v1; \ - } \ - if (_s2 != _p_s->count) { \ - MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s2, v2); \ - _p_s->values[_s2]+= v2; \ - } \ - MYSQLND_STATS_UNLOCK(_p_s); \ + if (_s1 != _p_s->count) MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s1, v1); \ + if (_s2 != _p_s->count) MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s2, v2); \ }\ } @@ -119,20 +109,9 @@ extern const MYSQLND_STRING mysqlnd_stats_values_names[]; enum_mysqlnd_collected_stats _s1 = (statistic1);\ enum_mysqlnd_collected_stats _s2 = (statistic2);\ enum_mysqlnd_collected_stats _s3 = (statistic3);\ - MYSQLND_STATS_LOCK(_p_s); \ - if (_s1 != _p_s->count) { \ - MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s1, v1); \ - _p_s->values[_s1]+= v1; \ - } \ - if (_s2 != _p_s->count) { \ - MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s2, v2); \ - _p_s->values[_s2]+= v2; \ - } \ - if (_s3 != _p_s->count) { \ - MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s3, v3); \ - _p_s->values[_s3]+= v3; \ - } \ - MYSQLND_STATS_UNLOCK(_p_s); \ + if (_s1 != _p_s->count) MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s1, v1); \ + if (_s2 != _p_s->count) MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s2, v2); \ + if (_s3 != _p_s->count) MYSQLND_UPDATE_VALUE_AND_CALL_TRIGGER(_p_s, _s3, v3); \ }\ } diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 8af7ece8f1..2cf9804aed 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -267,13 +267,13 @@ struct st_mysqlnd_packet_chg_user_resp; struct st_mysqlnd_protocol_methods { struct st_mysqlnd_packet_greet * (*get_greet_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); - struct st_mysqlnd_packet_auth * (*get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_auth * (*get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); struct st_mysqlnd_packet_ok * (*get_ok_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); - struct st_mysqlnd_packet_command * (*get_command_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); - struct st_mysqlnd_packet_eof * (*get_eof_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); - struct st_mysqlnd_packet_rset_header *(*get_rset_header_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_command * (*get_command_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_eof * (*get_eof_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_rset_header * (*get_rset_header_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); struct st_mysqlnd_packet_res_field * (*get_result_field_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); - struct st_mysqlnd_packet_row * (*get_row_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); + struct st_mysqlnd_packet_row * (*get_row_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); struct st_mysqlnd_packet_stats * (*get_stats_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); struct st_mysqlnd_packet_prepare_response *(*get_prepare_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); struct st_mysqlnd_packet_chg_user_resp*(*get_change_user_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); @@ -282,6 +282,7 @@ struct st_mysqlnd_protocol_methods struct st_mysqlnd_conn_methods { + void (*init)(MYSQLND * conn TSRMLS_DC); 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); ulong (*escape_string)(const MYSQLND * const conn, char *newstr, const char *escapestr, size_t escapestr_len TSRMLS_DC); enum_func_status (*set_charset)(MYSQLND * const conn, const char * const charset TSRMLS_DC); @@ -304,27 +305,27 @@ struct st_mysqlnd_conn_methods enum_func_status (*server_dump_debug_information)(MYSQLND * const conn TSRMLS_DC); enum_func_status (*change_user)(MYSQLND * const conn, const char * user, const char * passwd, const char * db, zend_bool silent TSRMLS_DC); - unsigned int (*get_error_no)(const MYSQLND * const conn); - const char * (*get_error_str)(const MYSQLND * const conn); - const char * (*get_sqlstate)(const MYSQLND * const conn); - uint64_t (*get_thread_id)(const MYSQLND * const conn); + unsigned int (*get_error_no)(const MYSQLND * const conn TSRMLS_DC); + const char * (*get_error_str)(const MYSQLND * const conn TSRMLS_DC); + const char * (*get_sqlstate)(const MYSQLND * const conn TSRMLS_DC); + uint64_t (*get_thread_id)(const MYSQLND * const conn TSRMLS_DC); void (*get_statistics)(const MYSQLND * const conn, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC); - unsigned long (*get_server_version)(const MYSQLND * const conn); - const char * (*get_server_information)(const MYSQLND * const conn); + unsigned long (*get_server_version)(const MYSQLND * const conn TSRMLS_DC); + const char * (*get_server_information)(const MYSQLND * const conn TSRMLS_DC); enum_func_status (*get_server_statistics)(MYSQLND *conn, char **message, unsigned int * message_len TSRMLS_DC); - const char * (*get_host_information)(const MYSQLND * const conn); - unsigned int (*get_protocol_information)(const MYSQLND * const conn); - const char * (*get_last_message)(const MYSQLND * const conn); - const char * (*charset_name)(const MYSQLND * const conn); + const char * (*get_host_information)(const MYSQLND * const conn TSRMLS_DC); + unsigned int (*get_protocol_information)(const MYSQLND * const conn TSRMLS_DC); + const char * (*get_last_message)(const MYSQLND * const conn TSRMLS_DC); + const char * (*charset_name)(const MYSQLND * const conn TSRMLS_DC); MYSQLND_RES * (*list_fields)(MYSQLND *conn, const char *table, const char *achtung_wild TSRMLS_DC); MYSQLND_RES * (*list_method)(MYSQLND *conn, const char *query, const char *achtung_wild, char *par1 TSRMLS_DC); - uint64_t (*get_last_insert_id)(const MYSQLND * const conn); - uint64_t (*get_affected_rows)(const MYSQLND * const conn); - unsigned int (*get_warning_count)(const MYSQLND * const conn); + uint64_t (*get_last_insert_id)(const MYSQLND * const conn TSRMLS_DC); + uint64_t (*get_affected_rows)(const MYSQLND * const conn TSRMLS_DC); + unsigned int (*get_warning_count)(const MYSQLND * const conn TSRMLS_DC); - unsigned int (*get_field_count)(const MYSQLND * const conn); + unsigned int (*get_field_count)(const MYSQLND * const conn TSRMLS_DC); enum_func_status (*set_server_option)(MYSQLND * const conn, enum_mysqlnd_server_option option TSRMLS_DC); enum_func_status (*set_client_option)(MYSQLND * const conn, enum_mysqlnd_option option, const char * const value TSRMLS_DC); @@ -360,18 +361,18 @@ struct st_mysqlnd_res_methods MYSQLND_ROW_C (*fetch_row_c)(MYSQLND_RES *result TSRMLS_DC); void (*fetch_all)(MYSQLND_RES *result, unsigned int flags, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC); void (*fetch_field_data)(MYSQLND_RES *result, unsigned int offset, zval *return_value TSRMLS_DC); - uint64_t (*num_rows)(const MYSQLND_RES * const result); - unsigned int (*num_fields)(const MYSQLND_RES * const result); + uint64_t (*num_rows)(const MYSQLND_RES * const result TSRMLS_DC); + unsigned int (*num_fields)(const MYSQLND_RES * const result TSRMLS_DC); enum_func_status (*skip_result)(MYSQLND_RES * const result TSRMLS_DC); enum_func_status (*seek_data)(MYSQLND_RES * result, uint64_t row TSRMLS_DC); - MYSQLND_FIELD_OFFSET (*seek_field)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset); - MYSQLND_FIELD_OFFSET (*field_tell)(const MYSQLND_RES * const result); + MYSQLND_FIELD_OFFSET (*seek_field)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset TSRMLS_DC); + MYSQLND_FIELD_OFFSET (*field_tell)(const MYSQLND_RES * const result TSRMLS_DC); const MYSQLND_FIELD *(*fetch_field)(MYSQLND_RES * const result TSRMLS_DC); const MYSQLND_FIELD *(*fetch_field_direct)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC); const MYSQLND_FIELD *(*fetch_fields)(MYSQLND_RES * const result TSRMLS_DC); - enum_func_status (*read_result_metadata)(MYSQLND_RES *result, MYSQLND *conn TSRMLS_DC); - unsigned long * (*fetch_lengths)(MYSQLND_RES * const result); + enum_func_status (*read_result_metadata)(MYSQLND_RES *result, MYSQLND * conn TSRMLS_DC); + unsigned long * (*fetch_lengths)(MYSQLND_RES * const result TSRMLS_DC); enum_func_status (*store_result_fetch_data)(MYSQLND * const conn, MYSQLND_RES *result, MYSQLND_RES_METADATA *meta, zend_bool binary_protocol, zend_bool to_cache TSRMLS_DC); void (*initialize_result_set_rest)(MYSQLND_RES * const result TSRMLS_DC); @@ -396,7 +397,7 @@ struct st_mysqlnd_res_meta_methods const MYSQLND_FIELD * (*fetch_field)(MYSQLND_RES_METADATA * const meta TSRMLS_DC); const MYSQLND_FIELD * (*fetch_field_direct)(const MYSQLND_RES_METADATA * const meta, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC); const MYSQLND_FIELD * (*fetch_fields)(MYSQLND_RES_METADATA * const meta TSRMLS_DC); - MYSQLND_FIELD_OFFSET (*field_tell)(const MYSQLND_RES_METADATA * const meta); + MYSQLND_FIELD_OFFSET (*field_tell)(const MYSQLND_RES_METADATA * const meta TSRMLS_DC); enum_func_status (*read_metadata)(MYSQLND_RES_METADATA * const meta, MYSQLND *conn TSRMLS_DC); MYSQLND_RES_METADATA * (*clone_metadata)(const MYSQLND_RES_METADATA * const meta, zend_bool persistent TSRMLS_DC); void (*free_metadata)(MYSQLND_RES_METADATA *meta, zend_bool persistent TSRMLS_DC); @@ -427,22 +428,21 @@ struct st_mysqlnd_stmt_methods enum_func_status (*bind_result)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND * const result_bind TSRMLS_DC); enum_func_status (*bind_one_result)(MYSQLND_STMT * const stmt, unsigned int param_no TSRMLS_DC); void (*set_result_bind_dtor)(MYSQLND_STMT * const stmt, void (*result_bind_dtor)(MYSQLND_RESULT_BIND * TSRMLS_DC) TSRMLS_DC); - enum_func_status (*send_long_data)(MYSQLND_STMT * const stmt, unsigned int param_num, - const char * const data, unsigned long length TSRMLS_DC); - MYSQLND_RES * (*get_parameter_metadata)(MYSQLND_STMT * const stmt); + enum_func_status (*send_long_data)(MYSQLND_STMT * const stmt, unsigned int param_num, const char * const data, unsigned long length TSRMLS_DC); + MYSQLND_RES * (*get_parameter_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC); MYSQLND_RES * (*get_result_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC); - uint64_t (*get_last_insert_id)(const MYSQLND_STMT * const stmt); - uint64_t (*get_affected_rows)(const MYSQLND_STMT * const stmt); - uint64_t (*get_num_rows)(const MYSQLND_STMT * const stmt); + uint64_t (*get_last_insert_id)(const MYSQLND_STMT * const stmt TSRMLS_DC); + uint64_t (*get_affected_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC); + uint64_t (*get_num_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC); - unsigned int (*get_param_count)(const MYSQLND_STMT * const stmt); - unsigned int (*get_field_count)(const MYSQLND_STMT * const stmt); - unsigned int (*get_warning_count)(const MYSQLND_STMT * const stmt); + unsigned int (*get_param_count)(const MYSQLND_STMT * const stmt TSRMLS_DC); + unsigned int (*get_field_count)(const MYSQLND_STMT * const stmt TSRMLS_DC); + unsigned int (*get_warning_count)(const MYSQLND_STMT * const stmt TSRMLS_DC); - unsigned int (*get_error_no)(const MYSQLND_STMT * const stmt); - const char * (*get_error_str)(const MYSQLND_STMT * const stmt); - const char * (*get_sqlstate)(const MYSQLND_STMT * const stmt); + unsigned int (*get_error_no)(const MYSQLND_STMT * const stmt TSRMLS_DC); + const char * (*get_error_str)(const MYSQLND_STMT * const stmt TSRMLS_DC); + const char * (*get_sqlstate)(const MYSQLND_STMT * const stmt TSRMLS_DC); enum_func_status (*get_attribute)(const MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, void * const value TSRMLS_DC); enum_func_status (*set_attribute)(MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, const void * const value TSRMLS_DC); diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index c2ceec6bb5..5710377882 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -956,7 +956,8 @@ php_mysqlnd_rset_field_read(void *_packet, MYSQLND *conn TSRMLS_DC) if (meta->db && meta->db != mysqlnd_empty_string) { len = meta->db_length; meta->db = memcpy(root_ptr, meta->db, len); - *(root_ptr + len) = '\0'; + *(root_ptr +=len) = '\0'; + root_ptr++; } if (meta->table && meta->table != mysqlnd_empty_string) { diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c index 2f6a9be99c..1bb6d2a74f 100755 --- a/ext/pdo_mysql/mysql_driver.c +++ b/ext/pdo_mysql/mysql_driver.c @@ -462,7 +462,7 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value case PDO_ATTR_SERVER_INFO: { char *tmp; #if PDO_USE_MYSQLND - int tmp_len; + unsigned int tmp_len; if (mysqlnd_stat(H->server, &tmp, &tmp_len) == PASS) { ZVAL_STRINGL(return_value, tmp, tmp_len, 0); diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c index ee65ab46ec..d8d40edb3e 100755 --- a/ext/pdo_mysql/mysql_statement.c +++ b/ext/pdo_mysql/mysql_statement.c @@ -120,7 +120,7 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ } /* }}} */ -static void pdo_mysql_stmt_set_row_count(pdo_stmt_t *stmt) /* {{{ */ +static void pdo_mysql_stmt_set_row_count(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ { long row_count; pdo_mysql_stmt *S = stmt->driver_data; @@ -237,7 +237,7 @@ static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt TSRMLS_DC) } } - pdo_mysql_stmt_set_row_count(stmt); + pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC); PDO_DBG_RETURN(1); } /* }}} */ @@ -280,7 +280,7 @@ static int pdo_mysql_stmt_execute_prepared_mysqlnd(pdo_stmt_t *stmt TSRMLS_DC) / } } - pdo_mysql_stmt_set_row_count(stmt); + pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC); PDO_DBG_RETURN(1); } /* }}} */ -- 2.40.0