}
/* }}} */
-/* {{{ 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;
}
/* }}} */
+
+/* {{{ 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)
#endif
if (getThis() && !ZEND_NUM_ARGS() && in_ctor) {
- RETURN_NULL();
+ php_mysqli_init(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ return;
}
hostname = username = dbname = passwd = socket = NULL;
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;
--- /dev/null
+--TEST--
+Bug #50772 (mysqli constructor without parameters does not return a working mysqli object)
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifconnectfailure.inc');
+?>
+--FILE--
+<?php
+ include "connect.inc";
+ $db1 = new mysqli();
+
+ // These calls fail
+ $db1->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
--- /dev/null
+--TEST--
+Interface of the class mysqli
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifemb.inc');
+require_once('skipifconnectfailure.inc');
+?>
+--FILE--
+<?php
+ require('table.inc');
+
+ function dump_properties($mysqli) {
+
+ printf("\nClass variables:\n");
+ $variables = array_keys(get_class_vars(get_class($mysqli)));
+ sort($variables);
+ foreach ($variables as $k => $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--
+<?php require_once("clean_table.inc"); ?>
+--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
/* {{{ 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];
/* {{{ 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;
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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);
/* {{{ 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;
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
#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)
/*****************************************************************************************************/
/* 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)
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 */
/*****************************************************************************************************/
#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)
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));
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));
#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;
}
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)
/* {{{ 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;
/* {{{ 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;
/* {{{ 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;
/* {{{ 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;
/* {{{ 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");
/* {{{ 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);
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
}
/* {{{ 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;
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;
/* {{{ 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;
}
#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
/* {{{ 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;
/* {{{ 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;
/* {{{ 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;
/* {{{ 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;
}
/* {{{ 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) {
/* {{{ 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) {
/* {{{ 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;
}
/* }}} */
/* {{{ 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;
/* {{{ 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;
/* {{{ 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;
/* {{{ 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 */
/* {{{ 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);
/* {{{ 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;
}
#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) \
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); \
}\
}
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); \
}\
}
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); \
}\
}
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); \
}\
}
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); \
}\
}
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);
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);
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);
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);
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);
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);
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) {
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);
}
/* }}} */
-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;
}
}
- pdo_mysql_stmt_set_row_count(stmt);
+ pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC);
PDO_DBG_RETURN(1);
}
/* }}} */
}
}
- pdo_mysql_stmt_set_row_count(stmt);
+ pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC);
PDO_DBG_RETURN(1);
}
/* }}} */