Author: ahristov
Date: 2007-02-23 12:31:06 +0100 (Fri, 23 Feb 2007)
New Revision: 60
Modified:
trunk/ext/mysqli/mysqli_api.c
trunk/ext/mysqli/mysqli_mysqlnd.h
trunk/ext/mysqli/mysqli_nonapi.c
trunk/ext/mysqli/mysqlnd/mysqlnd.c
trunk/ext/mysqli/mysqlnd/mysqlnd.h
trunk/ext/mysqli/mysqlnd/mysqlnd_alloc.c
trunk/ext/mysqli/mysqlnd/mysqlnd_charset.c
trunk/ext/mysqli/mysqlnd/mysqlnd_loaddata.c
trunk/ext/mysqli/mysqlnd/mysqlnd_palloc.c
trunk/ext/mysqli/mysqlnd/mysqlnd_priv.h
trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c
trunk/ext/mysqli/mysqlnd/mysqlnd_ps_codec.c
trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c
trunk/ext/mysqli/tests/bench/framework/config.php
Log:
Make the functions part of the structures - connection and result,
statement to come later. Hide the change behind macros and inline
some functions, which are just accessors, if the user wants it -
set MYSQLND_INLINE_OPTIMISATIONS
Modified: trunk/ext/mysqli/mysqli_api.c
===================================================================
--- trunk/ext/mysqli/mysqli_api.c 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqli_api.c 2007-02-23 11:31:06 UTC (rev 60)
@@ -67,7 +67,7 @@
}
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link",
MYSQLI_STATUS_VALID);
- if (mysql_autocommit(mysql->mysql,automode)) {
+ if (mysql_autocommit(mysql->mysql, automode)) {
RETURN_FALSE;
}
RETURN_TRUE;
@@ -965,7 +965,7 @@
return;
}
MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result",
MYSQLI_STATUS_VALID);
- _mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, return_value TSRMLS_CC
ZEND_FILE_LINE_CC);
+ mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, return_value);
#endif
}
/* }}} */
@@ -1926,7 +1926,7 @@
{
RETURN_UTF8_STRING(stat, ZSTR_DUPLICATE);
#else
- if (mysqlnd_stat(mysql->mysql, &stat, &stat_len TSRMLS_CC) == PASS)
+ if (mysqlnd_stat(mysql->mysql, &stat, &stat_len) == PASS)
{
RETURN_UTF8_STRINGL(stat, stat_len, ZSTR_AUTOFREE);
#endif
Modified: trunk/ext/mysqli/mysqli_mysqlnd.h
===================================================================
--- trunk/ext/mysqli/mysqli_mysqlnd.h 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqli_mysqlnd.h 2007-02-23 11:31:06 UTC (rev 60)
@@ -41,35 +41,35 @@
/* functions */
#define mysql_affected_rows(r) mysqlnd_affected_rows(r)
-#define mysql_autocommit(r,m) mysqlnd_autocommit(r,m TSRMLS_CC)
-#define mysql_change_user(r,a,b,c) mysqlnd_change_user(r,a,b,c TSRMLS_CC)
-#define mysql_close(r) mysqlnd_close(r TSRMLS_CC)
-#define mysql_commit(r) mysqlnd_commit(r TSRMLS_CC)
+#define mysql_autocommit(r,m) mysqlnd_autocommit(r,m)
+#define mysql_change_user(r,a,b,c) mysqlnd_change_user(r,a,b,c)
+#define mysql_close(r) mysqlnd_close(r)
+#define mysql_commit(r) mysqlnd_commit(r)
#define mysql_data_seek(r,o) mysqlnd_data_seek(r,o)
-#define mysql_dump_debug_info(r) mysqlnd_dump_debug_info(r TSRMLS_CC)
+#define mysql_dump_debug_info(r) mysqlnd_dump_debug_info(r)
#define mysql_errno(r) mysqlnd_errno(r)
#define mysql_error(r) mysqlnd_error(r)
#define mysql_fetch_field(r) mysqlnd_fetch_field(r)
#define mysql_fetch_field_direct(r,o) mysqlnd_fetch_field_direct(r,o)
-#define mysql_fetch_lengths(r) mysqlnd_fetch_lengths(r TSRMLS_CC)
+#define mysql_fetch_lengths(r) mysqlnd_fetch_lengths(r)
#define mysql_fetch_row(r) mysqlnd_fetch_row(r)
#define mysql_field_count(r) mysqlnd_field_count(r)
#define mysql_field_seek(r,o) mysqlnd_field_seek(r,o)
#define mysql_field_tell(r) mysqlnd_field_tell(r)
#define mysql_init(a) mysqlnd_init(a)
#define mysql_insert_id(r) mysqlnd_insert_id(r)
-#define mysql_kill(r,n) mysqlnd_kill(r,n TSRMLS_CC)
+#define mysql_kill(r,n) mysqlnd_kill(r,n)
#define mysql_more_results(r) mysqlnd_more_results(r)
-#define mysql_next_result(r) mysqlnd_next_result(r TSRMLS_CC)
+#define mysql_next_result(r) mysqlnd_next_result(r)
#define mysql_num_fields(r) mysqlnd_num_fields(r)
#define mysql_num_rows(r) mysqlnd_num_rows(r)
-#define mysql_ping(r) mysqlnd_ping(r TSRMLS_CC)
+#define mysql_ping(r) mysqlnd_ping(r)
#define mysql_real_escape_string(r,a,b,c) mysqlnd_real_escape_string(r,a,b,c)
-#define mysql_real_query(r,a,b) mysqlnd_query(r,a,b TSRMLS_CC)
-#define mysql_rollback(r) mysqlnd_rollback(r TSRMLS_CC)
-#define mysql_select_db(r,a) mysqlnd_select_db(r,a,strlen(a) TSRMLS_CC)
-#define mysql_set_server_option(r,o) mysqlnd_set_server_option(r,o TSRMLS_CC)
-#define mysql_set_character_set(r,a) mysqlnd_set_charset(r,a TSRMLS_CC)
+#define mysql_real_query(r,a,b) mysqlnd_query(r,a,b)
+#define mysql_rollback(r) mysqlnd_rollback(r)
+#define mysql_select_db(r,a) mysqlnd_select_db(r,a,strlen(a))
+#define mysql_set_server_option(r,o) mysqlnd_set_server_option(r,o)
+#define mysql_set_character_set(r,a) mysqlnd_set_charset(r,a)
#define mysql_sqlstate(r) mysqlnd_sqlstate(r)
#define mysql_stmt_affected_rows(r) mysqlnd_stmt_affected_rows(r)
#define mysql_stmt_close(r) mysqlnd_stmt_close(r TSRMLS_CC)
@@ -80,9 +80,9 @@
#define mysql_info(r) mysqlnd_info(r)
#define mysql_options(r,a,b) mysqlnd_options(r,a,b)
#define mysql_stmt_init(r) mysqlnd_stmt_init(r)
-#define mysql_free_result(r) mysqlnd_free_result(r TSRMLS_CC)
-#define mysql_store_result(r) mysqlnd_store_result(r TSRMLS_CC)
-#define mysql_use_result(r) mysqlnd_use_result(r TSRMLS_CC)
+#define mysql_free_result(r) mysqlnd_free_result(r)
+#define mysql_store_result(r) mysqlnd_store_result(r)
+#define mysql_use_result(r) mysqlnd_use_result(r)
#define mysql_thread_id(r) mysqlnd_thread_id(r)
#define mysql_get_client_info mysqlnd_get_client_info
#define mysql_get_client_version mysqlnd_get_client_version
Modified: trunk/ext/mysqli/mysqli_nonapi.c
===================================================================
--- trunk/ext/mysqli/mysqli_nonapi.c 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqli_nonapi.c 2007-02-23 11:31:06 UTC (rev 60)
@@ -258,7 +258,7 @@
RETURN_FALSE;
}
- _mysqlnd_fetch_into(result, mode, return_value TSRMLS_CC ZEND_FILE_LINE_CC);
+ mysqlnd_fetch_into(result, mode, return_value);
#endif
}
/* }}} */
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd.c 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd.c 2007-02-23 11:31:06 UTC (rev 60)
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 6 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2007 The PHP Group |
+ | Copyright (c) 2006-2007 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -97,7 +97,7 @@
{
if (mysqlnd_library_initted == FALSE) {
mysqlnd_library_initted = TRUE;
- _mysqlnd_init_ps();
+ _mysqlnd_init_ps_subsystem();
mysqlnd_global_stats = calloc(1, sizeof(MYSQLND_STATS));
#ifdef ZTS
mysqlnd_global_stats->LOCK_access = tsrm_mutex_alloc();
@@ -246,7 +246,7 @@
int i;
MYSQLND_FIELD *meta = result->fields;
- mysqlnd_internal_free_result_buffers(result);
+ result->m.free_result_buffers(result);
result->conn = NULL;
@@ -285,7 +285,7 @@
This will free the object too, of course because references has
reached zero.
*/
- mysqlnd_conn_free(result->conn TSRMLS_CC);
+ result->conn->m->dtor(result->conn TSRMLS_CC);
result->conn = NULL;
}
mysqlnd_internal_free_result_contents(result);
@@ -393,10 +393,10 @@
/* }}} */
-/* {{{ mysqlnd_conn_free */
-void mysqlnd_conn_free(MYSQLND *conn TSRMLS_DC)
+/* {{{ _mysqlnd_conn_dtor */
+void _mysqlnd_conn_dtor(MYSQLND *conn TSRMLS_DC)
{
- mysqlnd_conn_free_contents(conn TSRMLS_CC);
+ conn->m->free_contents(conn TSRMLS_CC);
/* If there are result sets attached to us, don't clean. They will do */
if (!conn->references) {
@@ -406,36 +406,6 @@
/* }}} */
-/* {{{ mysqlnd_conn__dtor */
-void mysqlnd_conn_rsrc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
-{
- MYSQLND *conn = (MYSQLND *) rsrc->ptr;
-
- /* be silent */
- conn->tmp_int = 1;
- mysqlnd_close(conn TSRMLS_CC);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_result_rsrc_dtor */
-void mysqlnd_result_rsrc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
-{
- mysqlnd_free_result((MYSQLND_RES *) rsrc->ptr TSRMLS_CC);
- rsrc->ptr = NULL;
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_stmt_rsrc_dtor */
-void mysqlnd_stmt_rsrc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
-{
- mysqlnd_stmt_close((MYSQLND_STMT *) rsrc->ptr TSRMLS_CC);
- efree(rsrc->ptr);
-}
-/* }}} */
-
-
/* {{{ mysqlnd_simple_command_handle_response */
enum_func_status
mysqlnd_simple_command_handle_response(MYSQLND *conn, enum php_mysql_packet_type
ok_packet,
@@ -581,9 +551,9 @@
/* }}} */
-/* {{{ mysqlnd_set_server_option */
-enum_func_status
-mysqlnd_set_server_option(MYSQLND *conn, enum_mysqlnd_server_option option TSRMLS_DC)
+/* {{{ _mysqlnd_set_server_option */
+static enum_func_status
+_mysqlnd_set_server_option(MYSQLND * const conn, enum_mysqlnd_server_option option
TSRMLS_DC)
{
char buffer[2];
int2store(buffer, (uint) option);
@@ -592,33 +562,6 @@
/* }}} */
-/* {{{ mysqlnd_autocommit */
-enum_func_status
-mysqlnd_autocommit(MYSQLND *conn, zend_bool mode TSRMLS_DC)
-{
- return mysqlnd_query(conn, mode ? "set autocommit=1":"set autocommit=0", 16 TSRMLS_CC);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_commit */
-enum_func_status
-mysqlnd_commit(MYSQLND *conn TSRMLS_DC)
-{
- return mysqlnd_query(conn, "COMMIT", 6 TSRMLS_CC);
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_rollback */
-enum_func_status
-mysqlnd_rollback(MYSQLND *conn TSRMLS_DC)
-{
- return mysqlnd_query(conn, "ROLLBACK", 8 TSRMLS_CC);
-}
-/* }}} */
-
-
/* {{{ mysqlnd_start_psession */
void mysqlnd_restart_psession(MYSQLND *conn)
{
@@ -635,19 +578,6 @@
/* }}} */
-/* {{{ mysqlnd_init */
-MYSQLND *mysqlnd_init(zend_bool persistent)
-{
- MYSQLND *ret = pecalloc(1, sizeof(MYSQLND), persistent);
-
- ret->upsert_status.affected_rows = (mynd_ulonglong) ~0;
- ret->persistent = persistent;
-
- return ret;
-}
-/* }}} */
-
-
/* {{{ mysqlnd_connect */
MYSQLND *mysqlnd_connect(MYSQLND *conn,
char *host, char *user,
@@ -698,7 +628,7 @@
PACKET_INIT_ALLOCA(ok_packet, PROT_OK_PACKET);
if (!conn) {
- conn = ecalloc(1, sizeof(MYSQLND));
+ conn = mysqlnd_init(FALSE);
self_alloced = TRUE;
}
@@ -856,7 +786,7 @@
/* This will also close conn->net.stream if it has been opened */
- mysqlnd_conn_free_contents(conn TSRMLS_CC);
+ conn->m->free_contents(conn TSRMLS_CC);
if (self_alloced) {
/*
@@ -1013,9 +943,11 @@
conn->state = CONN_FETCHING_DATA;
/* PS has already allocated it */
if (!stmt) {
- conn->current_result = result = ecalloc(1, sizeof(MYSQLND_RES));
- result->field_count = conn->field_count = rset_header.field_count;
- result->zval_cache = mysqlnd_palloc_get_cache_reference(conn->zval_cache);
+ conn->field_count = rset_header.field_count;
+ result =
+ conn->current_result=
+ mysqlnd_result_init(rset_header.field_count,
+ mysqlnd_palloc_get_cache_reference(conn->zval_cache));
} else {
if (!stmt->result) {
/*
@@ -1023,9 +955,11 @@
prepared statements can't send result set metadata for these queries
on prepare stage. Read it now.
*/
- stmt->result = result = ecalloc(1, sizeof(MYSQLND_RES));
- result->field_count = conn->field_count = rset_header.field_count;
- result->zval_cache = mysqlnd_palloc_get_cache_reference(conn->zval_cache);
+ conn->field_count = rset_header.field_count;
+ result =
+ stmt->result =
+ mysqlnd_result_init(rset_header.field_count,
+ mysqlnd_palloc_get_cache_reference(conn->zval_cache));
} else {
/*
Update result set metadata if it for some reason changed between
@@ -1085,7 +1019,7 @@
Still the result from the query is PASS
*/
enum_func_status
-mysqlnd_query(MYSQLND *conn, const char *query, unsigned int query_len TSRMLS_DC)
+_mysqlnd_query(MYSQLND *conn, const char *query, unsigned int query_len TSRMLS_DC)
{
if (PASS != mysqlnd_simple_command(conn, COM_QUERY, query, query_len,
@@ -1103,6 +1037,41 @@
/* }}} */
+/* {{{ _mysqlnd_fetch_row */
+static
+MYSQLND_ROW _mysqlnd_fetch_row(MYSQLND_RES *result TSRMLS_DC ZEND_FILE_LINE_DC)
+{
+ unsigned int flags = MYSQLND_FETCH_NUM;
+ zval* row;
+ MYSQLND_ROW ret = NULL;
+ zend_bool fetched_anything;
+
+ MAKE_STD_ZVAL(row);
+ mysqlnd_array_init(row, result->field_count);
+
+ if (PASS == result->m.fetch_row(result, row, flags, &fetched_anything TSRMLS_CC)
&&
+ fetched_anything == TRUE)
+ {
+ zval **entry;
+ uint i = 0;
+ if (!result->last_row) {
+ result->last_row = emalloc(result->field_count * sizeof(char *));
+ }
+ ret = result->last_row;
+
+ zend_hash_internal_pointer_reset(Z_ARRVAL_P(row));
+ while (zend_hash_get_current_data(Z_ARRVAL_P(row), (void **)&entry) == SUCCESS) {
+ /* Everything is a string */
+ ret[i++] = Z_STRVAL_PP(entry);
+ zend_hash_move_forward(Z_ARRVAL_P(row));
+ }
+ }
+ zval_ptr_dtor(&row);
+ return ret;
+}
+/* }}} */
+
+
/* {{{ mysqlnd_fetch_lengths_unbuffered */
static
unsigned long * mysqlnd_fetch_lengths_unbuffered(MYSQLND_RES * result)
@@ -1146,10 +1115,10 @@
/* }}} */
-/* {{{ mysqlnd_fetch_lengths */
-unsigned long * mysqlnd_fetch_lengths(MYSQLND_RES *result TSRMLS_DC)
+/* {{{ _mysqlnd_fetch_lengths */
+unsigned long * _mysqlnd_fetch_lengths(MYSQLND_RES * const result)
{
- return result->fetch_lengths? result->fetch_lengths(result):NULL;
+ return result->m.fetch_lengths? result->m.fetch_lengths(result):NULL;
}
/* }}} */
@@ -1159,11 +1128,12 @@
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;
- unsigned int i, field_count = result->field_count;
- php_mysql_packet_row *row_packet = result->row_packet;
- unsigned long *lengths = result->lengths;
+ enum_func_status ret;
+ zval *row = (zval *) param;
+ unsigned int i,
+ field_count = result->field_count;
+ php_mysql_packet_row *row_packet = result->row_packet;
+ unsigned long *lengths = result->lengths;
if (result->eof_reached) {
/* No more rows obviously */
@@ -1252,7 +1222,7 @@
/* {{{ mysqlnd_use_result */
-MYSQLND_RES *mysqlnd_use_result(MYSQLND *conn TSRMLS_DC)
+MYSQLND_RES *_mysqlnd_use_result(MYSQLND * const conn TSRMLS_DC)
{
MYSQLND_RES *result;
@@ -1269,8 +1239,9 @@
conn->current_result = NULL;
result->type = MYSQLND_RES_NORMAL;
- result->fetch_row = mysqlnd_fetch_row_unbuffered;
- result->fetch_lengths = mysqlnd_fetch_lengths_unbuffered;
+ result->m.fetch_row = mysqlnd_fetch_row_unbuffered;
+ result->m.fetch_lengths = mysqlnd_fetch_lengths_unbuffered;
+ result->m.fetch_row_old_way = _mysqlnd_fetch_row;
result->conn = conn;
conn->references++;
@@ -1343,7 +1314,7 @@
#define STORE_RESULT_PREALLOCATED_SET 32
/* {{{ mysqlnd_store_result */
-MYSQLND_RES *mysqlnd_store_result(MYSQLND *conn TSRMLS_DC)
+MYSQLND_RES *_mysqlnd_store_result(MYSQLND * const conn TSRMLS_DC)
{
enum_func_status ret;
unsigned int next_extend = STORE_RESULT_PREALLOCATED_SET, free_rows;
@@ -1363,8 +1334,9 @@
conn->current_result = NULL;
result->type = MYSQLND_RES_NORMAL;
- result->fetch_row = mysqlnd_fetch_row_buffered;
- result->fetch_lengths = mysqlnd_fetch_lengths_buffered;
+ result->m.fetch_row = mysqlnd_fetch_row_buffered;
+ result->m.fetch_lengths = mysqlnd_fetch_lengths_buffered;
+ result->m.fetch_row_old_way = _mysqlnd_fetch_row;
conn->state = CONN_FETCHING_DATA;
@@ -1453,72 +1425,44 @@
/* }}} */
-/* {{{ mysqlnd_free_result */
-enum_func_status
-mysqlnd_free_result(MYSQLND_RES *result TSRMLS_DC)
+/* {{{ _mysqlnd_unbuffered_skip_result */
+static enum_func_status
+_mysqlnd_unbuffered_skip_result(MYSQLND_RES * const result TSRMLS_DC)
{
zend_bool fetched_anything;
+
+ if (result->data) {
+ result->data_cursor = NULL;
+ return PASS;
+ }
+ /* Unbuffered sets */
if (result->conn && !result->eof_reached) {
/* We have to fetch all data to clean the line */
while ((PASS == mysqlnd_fetch_row_unbuffered(result, NULL, 0, &fetched_anything
TSRMLS_CC)) &&
fetched_anything == TRUE) {
}
}
- mysqlnd_internal_free_result(result TSRMLS_CC);
return PASS;
}
/* }}} */
-/* {{{ mysqlnd_fetch_row_ex */
-enum_func_status
-mysqlnd_fetch_row_ex(MYSQLND_RES *result, zval *row, unsigned int flags,
- zend_bool *fetched_anything TSRMLS_DC)
+/* {{{ _mysqlnd_free_result */
+static enum_func_status
+_mysqlnd_free_result(MYSQLND_RES *result TSRMLS_DC)
{
- result->fetch_row(result, row, flags, fetched_anything TSRMLS_CC);
+ result->m.skip_result(result TSRMLS_CC);
+
+ mysqlnd_internal_free_result(result TSRMLS_CC);
return PASS;
}
/* }}} */
-/* {{{ _mysqlnd_fetch_row */
-MYSQLND_ROW _mysqlnd_fetch_row(MYSQLND_RES *result TSRMLS_DC ZEND_FILE_LINE_DC)
+/* {{{ _mysqlnd_data_seek */
+static enum_func_status
+_mysqlnd_data_seek(MYSQLND_RES *result, mynd_ulonglong row)
{
- unsigned int flags = MYSQLND_FETCH_NUM;
- zval* row;
- MYSQLND_ROW ret = NULL;
- zend_bool fetched_anything;
-
- MAKE_STD_ZVAL(row);
- mysqlnd_array_init(row, result->field_count);
-
- if (PASS == result->fetch_row(result, row, flags, &fetched_anything TSRMLS_CC)
&&
- fetched_anything == TRUE)
- {
- zval **entry;
- uint i = 0;
- if (!result->last_row) {
- result->last_row = emalloc(result->field_count * sizeof(char *));
- }
- ret = result->last_row;
-
- zend_hash_internal_pointer_reset(Z_ARRVAL_P(row));
- while (zend_hash_get_current_data(Z_ARRVAL_P(row), (void **)&entry) == SUCCESS) {
- /* Everything is a string */
- ret[i++] = Z_STRVAL_PP(entry);
- zend_hash_move_forward(Z_ARRVAL_P(row));
- }
- }
- zval_ptr_dtor(&row);
- return ret;
-}
-/* }}} */
-
-
-/* {{{ mysqlnd_data_seek */
-enum_func_status
-mysqlnd_data_seek(MYSQLND_RES *result, mynd_ulonglong row)
-{
if (!result->data || row >= result->row_count) {
return FAIL;
}
@@ -1530,7 +1474,8 @@
/* {{{ mysqlnd_errno */
-unsigned int mysqlnd_errno(const MYSQLND * const conn)
+static
+unsigned int _mysqlnd_errno(const MYSQLND * const conn)
{
return conn->error_info.error_no;
}
@@ -1538,7 +1483,8 @@
/* {{{ mysqlnd_error */
-const char *mysqlnd_error(const MYSQLND * const conn)
+static
+const char * _mysqlnd_error(const MYSQLND * const conn)
{
return conn->error_info.error;
}
@@ -1546,7 +1492,8 @@
/* {{{ mysqlnd_sqlstate */
-const char *mysqlnd_sqlstate(const MYSQLND * const conn)
+static
+const char * _mysqlnd_sqlstate(const MYSQLND * const conn)
{
return conn->error_info.sqlstate[0] ?
conn->error_info.sqlstate:MYSQLND_SQLSTATE_NULL;
}
@@ -1554,7 +1501,8 @@
/* {{{ mysqlnd_real_escape_string */
-ulong mysqlnd_real_escape_string(MYSQLND *conn, char *newstr, char *escapestr, int
escapestr_len)
+static
+ulong _mysqlnd_real_escape_string(const MYSQLND * const conn, char *newstr, char
*escapestr, int escapestr_len)
{
const char *newstr_s = newstr;
const char *newstr_e = newstr + 2 * escapestr_len;
@@ -1630,18 +1578,18 @@
/* }}} */
-/* {{{ mysqlnd_dump_debug_info */
-enum_func_status
-mysqlnd_dump_debug_info(MYSQLND *conn TSRMLS_DC)
+/* {{{ _mysqlnd_dump_debug_info */
+static enum_func_status
+_mysqlnd_dump_debug_info(MYSQLND *conn TSRMLS_DC)
{
return mysqlnd_simple_command(conn, COM_DEBUG, NULL, 0, PROT_EOF_PACKET, FALSE
TSRMLS_CC);
}
/* }}} */
-/* {{{ mysqlnd_select_db */
-enum_func_status
-mysqlnd_select_db(MYSQLND *conn, const char * const db, unsigned int db_len TSRMLS_DC)
+/* {{{ _mysqlnd_select_db */
+static enum_func_status
+_mysqlnd_select_db(MYSQLND *conn, const char * const db, unsigned int db_len TSRMLS_DC)
{
enum_func_status ret;
ret = mysqlnd_simple_command(conn, COM_INIT_DB, db, db_len, PROT_OK_PACKET, FALSE
TSRMLS_CC);
@@ -1656,9 +1604,9 @@
/* }}} */
-/* {{{ mysqlnd_ping */
-enum_func_status
-mysqlnd_ping(MYSQLND *conn TSRMLS_DC)
+/* {{{ _mysqlnd_ping */
+static enum_func_status
+_mysqlnd_ping(MYSQLND *conn TSRMLS_DC)
{
enum_func_status ret;
ret = mysqlnd_simple_command(conn, COM_PING, NULL, 0, PROT_OK_PACKET, FALSE TSRMLS_CC);
@@ -1674,8 +1622,8 @@
/* {{{ mysqlnd_stat */
-enum_func_status
-mysqlnd_stat(MYSQLND *conn, char **message, unsigned int * message_len TSRMLS_DC)
+static enum_func_status
+_mysqlnd_stat(MYSQLND *conn, char **message, unsigned int * message_len TSRMLS_DC)
{
enum_func_status ret;
php_mysql_packet_stats stats_header;
@@ -1699,9 +1647,9 @@
/* }}} */
-/* {{{ mysqlnd_kill */
-enum_func_status
-mysqlnd_kill(MYSQLND *conn, unsigned long pid TSRMLS_DC)
+/* {{{ _mysqlnd_kill */
+static enum_func_status
+_mysqlnd_kill(MYSQLND *conn, unsigned long pid TSRMLS_DC)
{
enum_func_status ret;
char buff[4];
@@ -1725,9 +1673,9 @@
/* }}} */
-/* {{{ mysqlnd_refresh */
-enum_func_status
-mysqlnd_refresh(MYSQLND *conn, unsigned long options TSRMLS_DC)
+/* {{{ _mysqlnd_refresh */
+static enum_func_status
+_mysqlnd_refresh(MYSQLND *conn, unsigned long options TSRMLS_DC)
{
zend_uchar bits[1];
int1store(bits, options);
@@ -1737,12 +1685,12 @@
/* }}} */
-/* {{{ mysqlnd_set_character_set */
-enum_func_status
-mysqlnd_set_charset(MYSQLND *conn, char *csname TSRMLS_DC)
+/* {{{ _mysqlnd_set_charset */
+static enum_func_status
+_mysqlnd_set_charset(MYSQLND *conn, const char * const csname TSRMLS_DC)
{
- MYSQLND_CHARSET *charset = mysqlnd_find_charset_name(csname);
char query[MAX_CHARSET_LEN + 12];
+ const MYSQLND_CHARSET * const charset = mysqlnd_find_charset_name(csname);
if (!charset) {
SET_CLIENT_ERROR(conn->error_info, CR_CANT_FIND_CHARSET, UNKNOWN_SQLSTATE, "Invalid
characterset or character set not supported");
@@ -1752,7 +1700,7 @@
strcpy(query, "SET NAMES ");
strcat(query, csname);
- if (FAIL == mysqlnd_query(conn, query, strlen(query) TSRMLS_CC)) {
+ if (FAIL == conn->m->query(conn, query, strlen(query) TSRMLS_CC)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error executing query");
} else if (conn->error_info.error_no) {
return FAIL;
@@ -1763,9 +1711,9 @@
/* }}} */
-/* {{{ mysqlnd_shutdown */
-enum_func_status
-mysqlnd_shutdown(MYSQLND *conn, unsigned long level TSRMLS_DC)
+/* {{{ _mysqlnd_shutdown */
+static enum_func_status
+_mysqlnd_shutdown(MYSQLND *conn, unsigned long level TSRMLS_DC)
{
zend_uchar bits[1];
int1store(bits, level);
@@ -1775,9 +1723,9 @@
/* }}} */
-/* {{{ mysqlnd_close */
+/* {{{ _mysqlnd_close */
enum_func_status
-mysqlnd_close(MYSQLND *conn TSRMLS_DC)
+_mysqlnd_close(MYSQLND *conn TSRMLS_DC)
{
enum_func_status ret;
switch (conn->state) {
@@ -1807,23 +1755,23 @@
break;
}
conn->state = CONN_QUIT_SENT;
- mysqlnd_conn_free_contents(conn TSRMLS_CC);
- mysqlnd_conn_free(conn TSRMLS_CC);
+ conn->m->free_contents(conn TSRMLS_CC);
+ conn->m->dtor(conn TSRMLS_CC);
return ret;
}
/* }}} */
-/* {{{ mysqlnd_num_fields */
-unsigned int mysqlnd_num_fields(const MYSQLND_RES * const res)
+/* {{{ _mysqlnd_num_fields */
+unsigned int _mysqlnd_num_fields(const MYSQLND_RES * const res)
{
return res->field_count;
}
/* }}} */
-/* {{{ mysqlnd_num_fields */
-mynd_ulonglong mysqlnd_num_rows(const MYSQLND_RES * const res)
+/* {{{ _mysqlnd_num_fields */
+mynd_ulonglong _mysqlnd_num_rows(const MYSQLND_RES * const res)
{
return res->row_count;
}
@@ -1831,7 +1779,8 @@
/* {{{ mysqlnd_field_count */
-unsigned int mysqlnd_field_count(const MYSQLND * const conn)
+static
+unsigned int _mysqlnd_field_count(const MYSQLND * const conn)
{
return conn->field_count;
}
@@ -1839,8 +1788,8 @@
/* {{{ mysqlnd_fetch_field */
-MYSQLND_FIELD *
-mysqlnd_fetch_field(MYSQLND_RES *result)
+static MYSQLND_FIELD *
+_mysqlnd_fetch_field(MYSQLND_RES * const result)
{
if (result->current_field >= result->field_count)
return NULL;
@@ -1849,9 +1798,18 @@
/* }}} */
+/* {{{ _mysqlnd_fetch_field_direct */
+static MYSQLND_FIELD *
+_mysqlnd_fetch_field_direct(const MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET
fieldnr)
+{
+ return &result->fields[fieldnr];
+}
+/* }}} */
+
+
/* {{{ mysqlnd_field_seek */
-MYSQLND_FIELD_OFFSET
-mysqlnd_field_seek(MYSQLND_RES *result, MYSQLND_FIELD_OFFSET field_offset)
+static MYSQLND_FIELD_OFFSET
+_mysqlnd_field_seek(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset)
{
MYSQLND_FIELD_OFFSET return_value = result->current_field;
result->current_field = field_offset;
@@ -1860,50 +1818,47 @@
/* }}} */
-/* {{{ mysqlnd_field_tell */
-MYSQLND_FIELD_OFFSET
-mysqlnd_field_tell(MYSQLND_RES *result)
+/* {{{ _mysqlnd_field_tell */
+static MYSQLND_FIELD_OFFSET
+_mysqlnd_field_tell(const MYSQLND_RES * const result)
{
return result->current_field;
}
/* }}} */
-/* {{{ mysqlnd_fetch_field_direct */
-MYSQLND_FIELD *
-mysqlnd_fetch_field_direct(MYSQLND_RES *result, MYSQLND_FIELD_OFFSET fieldnr)
-{
- return &result->fields[fieldnr];
-}
-/* }}} */
-/* {{{ mysqlnd_insert_id */
-mynd_ulonglong mysqlnd_insert_id(const MYSQLND * const conn)
+/* {{{ _mysqlnd_insert_id */
+static
+mynd_ulonglong _mysqlnd_insert_id(const MYSQLND * const conn)
{
return conn->upsert_status.last_insert_id;
}
/* }}} */
-/* {{{ mysqlnd_affected_rows */
-mynd_ulonglong mysqlnd_affected_rows(const MYSQLND * const conn)
+/* {{{ _mysqlnd_affected_rows */
+static
+mynd_ulonglong _mysqlnd_affected_rows(const MYSQLND * const conn)
{
return conn->upsert_status.affected_rows;
}
/* }}} */
-/* {{{ mysqlnd_warning_count */
-unsigned int mysqlnd_warning_count(const MYSQLND * const conn)
+/* {{{ _mysqlnd_warning_count */
+static
+unsigned int _mysqlnd_warning_count(const MYSQLND * const conn)
{
return conn->upsert_status.warning_count;
}
/* }}} */
-/* {{{ mysqlnd_info */
-const char *mysqlnd_info(const MYSQLND * const conn)
+/* {{{ _mysqlnd_info */
+static
+const char *_mysqlnd_info(const MYSQLND * const conn)
{
return conn->last_message;
}
@@ -1911,57 +1866,62 @@
-/* {{{ mysqlnd_client_info */
-const char *mysqlnd_get_client_info()
+/* {{{ _mysqlnd_client_info */
+const char *_mysqlnd_get_client_info()
{
return MYSQLND_VERSION;
}
/* }}} */
-/* {{{ mysqlnd_client_version */
-uint mysqlnd_get_client_version()
+/* {{{ _mysqlnd_get_client_version */
+unsigned int _mysqlnd_get_client_version()
{
return MYSQLND_VERSION_ID;
}
/* }}} */
-/* {{{ mysqlnd_get_server_info */
-const char *mysqlnd_get_server_info(const MYSQLND * const conn)
+/* {{{ _mysqlnd_get_server_info */
+static
+const char * _mysqlnd_get_server_info(const MYSQLND * const conn)
{
- return(conn->server_version);
+ return conn->server_version;
}
/* }}} */
-/* {{{ mysqlnd_get_host_info */
-const char *mysqlnd_get_host_info(const MYSQLND * const conn)
+/* {{{ _mysqlnd_get_host_info */
+static
+const char * _mysqlnd_get_host_info(const MYSQLND * const conn)
{
- return(conn->host_info);
+ return conn->host_info;
}
/* }}} */
-/* {{{ mysqlnd_get_proto_info */
-unsigned int mysqlnd_get_proto_info(const MYSQLND *const conn)
+/* {{{ _mysqlnd_get_proto_info */
+static
+unsigned int _mysqlnd_get_proto_info(const MYSQLND *const conn)
{
- return(conn->protocol_version);
+ return conn->protocol_version;
}
/* }}} */
-/* {{{ mysqlnd_thread_id */
-mynd_ulonglong mysqlnd_thread_id(const MYSQLND *const conn)
+/* {{{ _mysqlnd_thread_id */
+static
+mynd_ulonglong _mysqlnd_thread_id(const MYSQLND * const conn)
{
- return(conn->thread_id);
+ return conn->thread_id;
}
/* }}} */
-/* {{{ mysqlnd_get_server_version */
-unsigned long mysqlnd_get_server_version(const MYSQLND * const conn)
+/* {{{ _mysqlnd_get_server_version */
+static
+unsigned long _mysqlnd_get_server_version(const MYSQLND * const conn)
{
long major, minor, patch;
char *p = conn->server_version;
@@ -1981,17 +1941,22 @@
/* }}} */
-zend_bool mysqlnd_more_results(const MYSQLND * const conn)
+/* {{{ _mysqlnd_more_results */
+static
+zend_bool _mysqlnd_more_results(const MYSQLND * const conn)
{
/* (conn->state == CONN_NEXT_RESULT_PENDING) too */
return conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS?
TRUE:FALSE;
}
+/* }}} */
-enum_func_status
-mysqlnd_next_result(MYSQLND *conn TSRMLS_DC)
+/* {{{ _mysqlnd_next_result */
+static enum_func_status
+_mysqlnd_next_result(MYSQLND * const conn TSRMLS_DC)
{
enum_func_status ret;
+
/* For UPSERT statement we don't set conn->state */
if (conn->state != CONN_NEXT_RESULT_PENDING) {
SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE,
@@ -2014,6 +1979,7 @@
return ret;
}
+/* }}} */
/* {{{ mysqlnd_field_type_name */
@@ -2079,9 +2045,9 @@
/* }}} */
-/* {{{ mysqlnd_change_user */
-enum_func_status
-mysqlnd_change_user(MYSQLND *conn, const char *user, const char *passwd, const char *db
TSRMLS_DC)
+/* {{{ _mysqlnd_change_user */
+static enum_func_status
+_mysqlnd_change_user(MYSQLND *conn, const char *user, const char *passwd, const char *db
TSRMLS_DC)
{
/*
User could be max 16 * 3 (utf8), pass is 20 usually, db is up to 64*3
@@ -2162,9 +2128,9 @@
/* }}} */
-/* {{{ mysqlnd_options */
-enum_func_status
-mysqlnd_options(MYSQLND *conn, enum mysqlnd_option option, const char *value)
+/* {{{ _mysqlnd_set_client_option */
+static enum_func_status
+_mysqlnd_set_client_option(MYSQLND * const conn, enum mysqlnd_option option, const char *
const value)
{
switch (option) {
case MYSQL_OPT_CONNECT_TIMEOUT:
@@ -2219,6 +2185,7 @@
/* {{{ _mysqlnd_fetch_into */
+static
void _mysqlnd_fetch_into(MYSQLND_RES *result, unsigned int flags, zval *return_value
TSRMLS_DC ZEND_FILE_LINE_DC)
{
zend_bool fetched_anything;
@@ -2228,7 +2195,7 @@
extend and rehash the hash constantly.
*/
mysqlnd_array_init(return_value, mysqlnd_num_fields(result) * 2);
- if (FAIL == result->fetch_row(result, (void *)return_value, flags,
&fetched_anything TSRMLS_CC)) {
+ if (FAIL == result->m.fetch_row(result, (void *)return_value, flags,
&fetched_anything TSRMLS_CC)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading a row");
RETURN_FALSE;
} else if (fetched_anything == FALSE) {
@@ -2244,6 +2211,7 @@
/* {{{ _mysqlnd_fetch_all */
+static
void _mysqlnd_fetch_all(MYSQLND_RES *result, unsigned int flags, zval *return_value
TSRMLS_DC ZEND_FILE_LINE_DC)
{
zval *row;
@@ -2301,6 +2269,90 @@
}
+static
+struct st_mysqlnd_connection_methods mysqlnd_connection_methods = {
+ _mysqlnd_real_escape_string,
+ _mysqlnd_set_charset,
+ _mysqlnd_query,
+ _mysqlnd_use_result,
+ _mysqlnd_store_result,
+ _mysqlnd_next_result,
+ _mysqlnd_more_results,
+
+ _mysqlnd_shutdown,
+ _mysqlnd_refresh,
+
+ _mysqlnd_ping,
+ _mysqlnd_kill,
+ _mysqlnd_select_db,
+ _mysqlnd_dump_debug_info,
+ _mysqlnd_change_user,
+
+ _mysqlnd_errno,
+ _mysqlnd_error,
+ _mysqlnd_sqlstate,
+ _mysqlnd_thread_id,
+ _mysqlnd_get_connection_stats,
+
+ _mysqlnd_get_server_version,
+ _mysqlnd_get_server_info,
+ _mysqlnd_stat,
+ _mysqlnd_get_host_info,
+ _mysqlnd_get_proto_info,
+ _mysqlnd_info,
+
+ _mysqlnd_insert_id,
+ _mysqlnd_affected_rows,
+ _mysqlnd_warning_count,
+ _mysqlnd_field_count,
+
+ _mysqlnd_set_server_option,
+ _mysqlnd_set_client_option,
+ mysqlnd_conn_free_contents,
+ _mysqlnd_close,
+ _mysqlnd_conn_dtor
+};
+
+
+/* {{{ mysqlnd_init */
+MYSQLND *mysqlnd_init(zend_bool persistent)
+{
+ MYSQLND *ret = pecalloc(1, sizeof(MYSQLND), persistent);
+
+ ret->upsert_status.affected_rows = (mynd_ulonglong) ~0;
+ ret->persistent = persistent;
+
+ ret->m = & mysqlnd_connection_methods;
+
+ return ret;
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_result_init */
+MYSQLND_RES *mysqlnd_result_init(unsigned int field_count, MYSQLND_ZVAL_PCACHE *cache)
+{
+ MYSQLND_RES *ret = ecalloc(1, sizeof(MYSQLND_RES));
+
+ ret->field_count = field_count;
+ ret->zval_cache = cache;
+ ret->m.free_result = _mysqlnd_free_result;
+ ret->m.free_result_buffers = mysqlnd_internal_free_result_buffers;
+ ret->m.seek_data = _mysqlnd_data_seek;
+ ret->m.skip_result = _mysqlnd_unbuffered_skip_result;
+ ret->m.num_rows = _mysqlnd_num_rows;
+ ret->m.num_fields = _mysqlnd_num_fields;
+ ret->m.fetch_into = _mysqlnd_fetch_into;
+ ret->m.fetch_all = _mysqlnd_fetch_all;
+ ret->m.field_seek = _mysqlnd_field_seek;
+ ret->m.field_tell = _mysqlnd_field_tell;
+ ret->m.fetch_field = _mysqlnd_fetch_field;
+ ret->m.fetch_field_direct = _mysqlnd_fetch_field_direct;
+
+ return ret;
+}
+/* }}} */
+
/*
* Local variables:
* tab-width: 4
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd.h
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd.h 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd.h 2007-02-23 11:31:06 UTC (rev 60)
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 6 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2007 The PHP Group |
+ | Copyright (c) 2006-2007 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -23,14 +23,16 @@
#ifndef MYSQLND_H
#define MYSQLND_H
+#define MYSQLND_INLINE_OPTIMISATIONS 1
+
#include "portability.h"
#ifdef ZTS
#include "TSRM.h"
#endif
-#define MYSQLND_VERSION "mysqlnd 5.1.0 - 070201 - $Revision$"
+#define MYSQLND_VERSION "mysqlnd 5.1.0 - 070222 - $Revision$"
#define MYSQLND_VERSION_ID 50100
@@ -263,15 +265,39 @@
MYSQLND_STMT_USER_FETCHING, /* fetch_row_buff or fetch_row_unbuf */
} enum_mysqlnd_stmt_state;
+enum {
+ STAT_BYTES_SENT,
+ STAT_BYTES_RECEIVED,
+ STAT_PACKETS_SENT,
+ STAT_PACKETS_RECEIVED,
+ STAT_PROTOCOL_OVERHEAD_IN,
+ STAT_PROTOCOL_OVERHEAD_OUT,
+ STAT_SELECTS,
+ STAT_DML_DDLS,
+ STAT_BUFFERED_SETS,
+ STAT_UNBUFFERED_SETS,
+ STAT_PS_BUFFERED_SETS,
+ STAT_PS_UNBUFFERED_SETS,
+ STAT_ROWS_FETCHED_FROM_SERVER,
+ STAT_ROWS_FETCHED_FROM_CLIENT,
+ STAT_ROWS_SKIPPED,
+ STAT_COPY_ON_WRITE_SAVED,
+ STAT_COPY_ON_WRITE_PERFORMED,
+ STAT_CMD_BUFFER_TOO_SMALL,
+ STAT_CONNECT_SUCCESS,
+ STAT_CONNECT_FAILURE,
+ STAT_CONNECT_REUSED,
+ STAT_LAST /* Should be always the last */
+};
-typedef struct _mysqlnd_cmd_buffer {
+typedef struct st_mysqlnd_cmd_buffer {
zend_uchar *buffer;
size_t length;
} MYSQLND_CMD_BUFFER;
-typedef struct _mysqlnd_field {
+typedef struct st_mysqlnd_field {
char *name; /* Name of column */
char *org_name; /* Original column name, if an alias */
char *table; /* Table of column if column was a field */
@@ -297,7 +323,7 @@
-typedef struct _mysqlnd_upsert_result {
+typedef struct st_mysqlnd_upsert_result {
unsigned int warning_count;
unsigned int server_status;
unsigned long long affected_rows;
@@ -305,18 +331,18 @@
} mysqlnd_upsert_status;
-typedef struct _mysqlnd_error_info {
+typedef struct st_mysqlnd_error_info {
char error[MYSQLND_ERRMSG_SIZE+1];
char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
unsigned int error_no;
} mysqlnd_error_info;
-typedef struct _mysqlnd_zval_cache MYSQLND_ZVAL_CACHE;
-typedef struct _mysqlnd_zval_pcache MYSQLND_ZVAL_PCACHE;
+typedef struct st_mysqlnd_zval_cache MYSQLND_ZVAL_CACHE;
+typedef struct st_mysqlnd_zval_pcache MYSQLND_ZVAL_PCACHE;
-typedef struct _mysqlnd_infile_info {
+typedef struct st_mysqlnd_infile_info {
php_stream *fd;
int error_no;
char error_msg[MYSQLND_ERRMSG_SIZE + 1];
@@ -324,8 +350,9 @@
zval *callback;
} MYSQLND_INFILE_INFO;
+
/* character set information */
-typedef struct _mysqlnd_charset
+typedef struct st_mysqlnd_charset
{
uint nr;
char *name;
@@ -337,8 +364,9 @@
uint (*mb_valid)(const char *start, const char *end);
} MYSQLND_CHARSET;
+
/* local infile handler */
-typedef struct _mysqlnd_infile
+typedef struct st_mysqlnd_infile
{
int (*local_infile_init)(void **ptr, char *filename, void **userdata TSRMLS_DC);
int (*local_infile_read)(void *ptr, char *buf, uint buf_len TSRMLS_DC);
@@ -348,7 +376,7 @@
void *userdata;
} MYSQLND_INFILE;
-typedef struct _mysqlnd_option {
+typedef struct st_mysqlnd_option {
/* timeouts */
uint timeout_connect;
uint timeout_read;
@@ -377,37 +405,20 @@
} MYSQLND_OPTION;
-typedef struct _mysqlnd_res MYSQLND_RES;
-typedef char** MYSQLND_ROW; /* return data as array of strings */
+typedef struct st_mysqlnd_connection MYSQLND;
+typedef struct st_mysqlnd_res MYSQLND_RES;
+typedef char** MYSQLND_ROW; /* return data as array of strings */
+typedef struct st_mysqlnd_stmt MYSQLND_STMT;
+typedef unsigned int MYSQLND_FIELD_OFFSET;
+typedef MYSQLND_RES* (*mysqlnd_stmt_use_or_store_func)(MYSQLND_STMT * const TSRMLS_DC);
+typedef enum_func_status (*mysqlnd_fetch_row_func)(MYSQLND_RES *result,
+ void *param,
+ unsigned int flags,
+ zend_bool *fetched_anything
+ TSRMLS_DC);
-enum {
- STAT_BYTES_SENT,
- STAT_BYTES_RECEIVED,
- STAT_PACKETS_SENT,
- STAT_PACKETS_RECEIVED,
- STAT_PROTOCOL_OVERHEAD_IN,
- STAT_PROTOCOL_OVERHEAD_OUT,
- STAT_SELECTS,
- STAT_DML_DDLS,
- STAT_BUFFERED_SETS,
- STAT_UNBUFFERED_SETS,
- STAT_PS_BUFFERED_SETS,
- STAT_PS_UNBUFFERED_SETS,
- STAT_ROWS_FETCHED_FROM_SERVER,
- STAT_ROWS_FETCHED_FROM_CLIENT,
- STAT_ROWS_SKIPPED,
- STAT_COPY_ON_WRITE_SAVED,
- STAT_COPY_ON_WRITE_PERFORMED,
- STAT_CMD_BUFFER_TOO_SMALL,
- STAT_CONNECT_SUCCESS,
- STAT_CONNECT_FAILURE,
- STAT_CONNECT_REUSED,
- STAT_LAST /* Should be always the last */
-};
-
-
-typedef struct mysqlnd_stats {
+typedef struct st_mysqlnd_stats {
my_uint64 values[STAT_LAST];
#ifdef ZTS
MUTEX_T LOCK_access;
@@ -415,7 +426,7 @@
} MYSQLND_STATS;
-typedef struct mysqlnd_net {
+typedef struct st_mysqlnd_net {
php_stream *stream;
/* sequence for simple checking of correct packets */
zend_uchar packet_no;
@@ -425,7 +436,72 @@
} MYSQLND_NET;
-typedef struct mysqlnd_connection {
+struct st_mysqlnd_connection_methods {
+ ulong (*escape_string)(const MYSQLND * const conn, char *newstr, char *escapestr, int
escapestr_len);
+ enum_func_status (*set_charset)(MYSQLND *conn, const char * const charset TSRMLS_DC);
+ enum_func_status (*query)(MYSQLND *conn, const char *query, unsigned int query_len
TSRMLS_DC);
+ MYSQLND_RES * (*use_result)(MYSQLND * const conn TSRMLS_DC);
+ MYSQLND_RES * (*store_result)(MYSQLND * const conn TSRMLS_DC);
+ enum_func_status (*next_result)(MYSQLND * const conn TSRMLS_DC);
+ zend_bool (*more_results)(const MYSQLND * const conn);
+
+ enum_func_status (*shutdown_server)(MYSQLND *conn, unsigned long level TSRMLS_DC);
+ enum_func_status (*refresh_server)(MYSQLND *conn, unsigned long options TSRMLS_DC);
+
+ enum_func_status (*ping)(MYSQLND *conn TSRMLS_DC);
+ enum_func_status (*kill_connection)(MYSQLND *conn, unsigned long pid TSRMLS_DC);
+ enum_func_status (*select_db)(MYSQLND *conn, const char * const db, unsigned int db_len
TSRMLS_DC);
+ enum_func_status (*server_dump_debug_information)(MYSQLND *conn TSRMLS_DC);
+ enum_func_status (*change_user)(MYSQLND *conn, const char * user, const char * passwd,
const char * db TSRMLS_DC);
+
+ unsigned int (*get_error_no)(const MYSQLND * const conn);
+ const char * (*get_error)(const MYSQLND * const conn);
+ const char * (*get_sqlstate)(const MYSQLND * const conn);
+ mynd_ulonglong (*get_thread_id)(const MYSQLND * const conn);
+ void (*get_statistics)(MYSQLND *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);
+ 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);
+
+ mynd_ulonglong (*get_last_insert_id)(const MYSQLND * const conn);
+ mynd_ulonglong (*get_affected_rows)(const MYSQLND * const conn);
+ unsigned int (*get_warning_count)(const MYSQLND * const conn);
+
+ unsigned int (*get_field_count)(const MYSQLND * const conn);
+
+ 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);
+ void (*free_contents)(MYSQLND *conn TSRMLS_DC); /* private */
+ enum_func_status (*close)(MYSQLND *conn TSRMLS_DC);
+ void (*dtor)(MYSQLND *conn TSRMLS_DC); /* private */
+};
+
+
+struct st_mysqlnd_res_methods {
+ mysqlnd_fetch_row_func fetch_row;
+ void (*fetch_into)(MYSQLND_RES *result, unsigned int flags, zval *return_value
TSRMLS_DC ZEND_FILE_LINE_DC);
+ void (*fetch_all)(MYSQLND_RES *result, unsigned int flags, zval *return_value
TSRMLS_DC ZEND_FILE_LINE_DC);
+ mynd_ulonglong (*num_rows)(const MYSQLND_RES * const result);
+ unsigned int (*num_fields)(const MYSQLND_RES * const result);
+ enum_func_status (*skip_result)(MYSQLND_RES * const result TSRMLS_DC);
+ enum_func_status (*seek_data)(MYSQLND_RES * result, mynd_ulonglong row);
+ MYSQLND_FIELD_OFFSET (*field_seek)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET
field_offset);
+ MYSQLND_FIELD_OFFSET (*field_tell)(const MYSQLND_RES * const result);
+ MYSQLND_FIELD * (*fetch_field)(MYSQLND_RES * const result);
+ MYSQLND_FIELD * (*fetch_field_direct)(const MYSQLND_RES * const result,
MYSQLND_FIELD_OFFSET fieldnr);
+
+ MYSQLND_ROW (*fetch_row_old_way)(MYSQLND_RES * result TSRMLS_DC ZEND_FILE_LINE_DC);
+ unsigned long * (*fetch_lengths)(MYSQLND_RES * result);
+ void (*free_result_buffers)(MYSQLND_RES * result);
+ enum_func_status (*free_result)(MYSQLND_RES *result TSRMLS_DC);
+};
+
+
+struct st_mysqlnd_connection {
/* Operation related */
MYSQLND_NET net;
@@ -440,7 +516,7 @@
char *server_version;
char *host_info;
unsigned char *scramble;
- MYSQLND_CHARSET *charset;
+ const MYSQLND_CHARSET *charset;
MYSQLND_INFILE infile;
unsigned int protocol_version;
unsigned long max_packet_size;
@@ -491,23 +567,17 @@
/* stats */
MYSQLND_STATS stats;
-} MYSQLND;
-typedef struct _php_mysql_packet_row php_mysql_packet_row;
+ struct st_mysqlnd_connection_methods *m;
+};
+typedef struct st_php_mysql_packet_row php_mysql_packet_row;
-typedef enum_func_status (*mysqlnd_fetch_row_func)(MYSQLND_RES *result,
- void *param,
- unsigned int flags,
- zend_bool *fetched_anything
- TSRMLS_DC);
-struct _mysqlnd_res {
- mysqlnd_fetch_row_func fetch_row;
- unsigned long * (*fetch_lengths)(MYSQLND_RES *result);
- MYSQLND *conn;
- enum_mysqlnd_res_type type;
- unsigned int field_count;
+struct st_mysqlnd_res {
+ MYSQLND *conn;
+ enum_mysqlnd_res_type type;
+ unsigned int field_count;
/* For metadata functions */
MYSQLND_FIELD *fields;
@@ -554,6 +624,8 @@
/* zval cache */
MYSQLND_ZVAL_PCACHE *zval_cache;
+
+ struct st_mysqlnd_res_methods m;
};
@@ -575,22 +647,20 @@
#define DEFAULT_PREFETCH_ROWS (ulong) 1
-typedef struct _mysqlnd_param_bind {
+typedef struct st_mysqlnd_param_bind {
zval *zv;
zend_uchar type;
} MYSQLND_PARAM_BIND;
-typedef struct _mysqlnd_result_bind {
+typedef struct st_mysqlnd_result_bind {
zval *zv;
zend_uchar original_type;
zend_bool bound;
} MYSQLND_RESULT_BIND;
-typedef struct _mysqlnd_stmt MYSQLND_STMT;
-typedef MYSQLND_RES* (*mysqlnd_stmt_use_or_store_func)(MYSQLND_STMT * TSRMLS_DC);
-struct _mysqlnd_stmt {
+struct st_mysqlnd_stmt {
MYSQLND *conn;
unsigned long stmt_id;
unsigned long flags;/* cursor is set here */
@@ -618,128 +688,159 @@
+/* Library related */
+void mysqlnd_library_init();
+void mysqlnd_library_end();
+void mysqlnd_restart_psession(MYSQLND *conn);
+void mysqlnd_end_psession(MYSQLND *conn);
+const MYSQLND_CHARSET * mysqlnd_find_charset_nr(uint charsetno);
+const MYSQLND_CHARSET * mysqlnd_find_charset_name(const char * const charsetname);
-typedef unsigned int MYSQLND_FIELD_OFFSET;
+/* Connect */
+MYSQLND * mysqlnd_init(zend_bool persistent);
+MYSQLND * mysqlnd_connect(MYSQLND *conn,
+ char *host, char *user,
+ char *passwd, unsigned int passwd_len,
+ char *db, unsigned int db_len,
+ unsigned int port,
+ char *socket,
+ unsigned int mysql_flags,
+ MYSQLND_ZVAL_PCACHE *zval_cache TSRMLS_DC);
+#define mysqlnd_change_user(conn, user, passwd, db) (conn)->m->change_user((conn),
(user), (passwd), (db) TSRMLS_CC)
-void mysqlnd_conn_rsrc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC);
-void mysqlnd_result_rsrc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC);
-void mysqlnd_stmt_rsrc_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC);
-MYSQLND_CHARSET *mysqlnd_find_charset_nr(uint charsetno);
-MYSQLND_CHARSET *mysqlnd_find_charset_name(char *charsetname);
+/* Query */
+#define mysqlnd_fetch_row(result) (result)->m.fetch_row_old_way((result)
TSRMLS_CC ZEND_FILE_LINE_CC)
+#define mysqlnd_fetch_into(result, flags,
return_value) (result)->m.fetch_into((result), (flags), (return_value) TSRMLS_CC
ZEND_FILE_LINE_CC)
+#define mysqlnd_fetch_all(result, flags, return_value) (result)->m.fetch_all((result),
(flags), (return_value) TSRMLS_CC ZEND_FILE_LINE_CC)
+#define mysqlnd_get_connection_stats(conn,
values) (conn)->m->get_statistics((conn), (values) TSRMLS_CC ZEND_FILE_LINE_CC)
+#define mysqlnd_get_client_stats(values) _mysqlnd_get_client_stats((values) TSRMLS_CC
ZEND_FILE_LINE_CC)
-void mysqlnd_library_init();
-void mysqlnd_library_end();
+#define mysqlnd_close(conn) (conn)->m->close(conn TSRMLS_CC)
+#define mysqlnd_query(conn, query_str, query_len) (conn)->m->query((conn),
(query_str), (query_len) TSRMLS_CC)
+#define mysqlnd_unbuffered_skip_result(result) (result)->m.skip_result((result)
TSRMLS_CC)
-/* Connect */
-MYSQLND *mysqlnd_init(zend_bool persistent);
-MYSQLND *mysqlnd_connect(MYSQLND *conn,
- char *host, char *user,
- char *passwd, unsigned int passwd_len,
- char *db, unsigned int db_len,
- unsigned int port,
- char *socket,
- unsigned int mysql_flags,
- MYSQLND_ZVAL_PCACHE *zval_cache TSRMLS_DC);
-enum_func_status mysqlnd_close(MYSQLND *conn TSRMLS_DC);
-enum_func_status mysqlnd_change_user(MYSQLND *conn, const char *user, const char *passwd,
- const char *db TSRMLS_DC);
-/* Query */
-#define mysqlnd_fetch_row(result) \
- _mysqlnd_fetch_row((result) TSRMLS_CC ZEND_FILE_LINE_CC)
+#define mysqlnd_use_result(conn) (conn)->m->use_result((conn) TSRMLS_CC)
+#define mysqlnd_store_result(conn) (conn)->m->store_result((conn) TSRMLS_CC)
+#define mysqlnd_next_result(conn) (conn)->m->next_result((conn) TSRMLS_CC)
+#define mysqlnd_more_results(conn) (conn)->m->more_results((conn))
+#define
mysqlnd_free_result(result) ((MYSQLND_RES*)result)->m.free_result(((MYSQLND_RES*)(result))
TSRMLS_CC)
+#define mysqlnd_data_seek(result, row) (result)->m.seek_data((result), (row))
-#define mysqlnd_fetch_into(result, flags, return_value) \
- _mysqlnd_fetch_into((result), (flags), (return_value) TSRMLS_CC ZEND_FILE_LINE_CC)
+/*****************************************************************************************************/
+#if MYSQLND_INLINE_OPTIMISATIONS
-#define mysqlnd_fetch_all(result, flags, return_value) \
- _mysqlnd_fetch_all((result), (flags), (return_value) TSRMLS_CC ZEND_FILE_LINE_CC)
+/* Errors */
+#define mysqlnd_errno(conn) (conn)->error_info.error_no
+#define mysqlnd_error(conn) (conn)->error_info.error
+#define mysqlnd_sqlstate(conn) ((conn)->error_info.sqlstate[0] ?
conn->error_info.sqlstate:MYSQLND_SQLSTATE_NULL)
-#define mysqlnd_get_client_stats(return_value) \
- _mysqlnd_get_client_stats((return_value) TSRMLS_CC ZEND_FILE_LINE_CC)
+/* Simple metadata */
+#define mysqlnd_field_count(conn) (conn)->field_count
+#define mysqlnd_insert_id(conn) (conn)->upsert_status.last_insert_id
+#define mysqlnd_affected_rows(conn) (conn)->upsert_status.affected_rows
+#define mysqlnd_warning_count(conn) (conn)->upsert_status.warning_count
+#define mysqlnd_info(conn) (conn)->last_message
+#define mysqlnd_get_server_info(conn) (conn)->server_version
+#define mysqlnd_get_host_info(conn) (conn)->host_info
+#define mysqlnd_get_proto_info(conn) (conn)->protocol_version
+#define mysqlnd_thread_id(conn) (conn)->thread_id
-#define mysqlnd_get_connection_stats(conn, return_value) \
- _mysqlnd_get_connection_stats((conn), (return_value) TSRMLS_CC ZEND_FILE_LINE_CC)
+#define mysqlnd_num_rows(result) (result)->row_count
+#define mysqlnd_num_fields(result) (result)->field_count
+#define mysqlnd_fetch_lengths(result) ((result)->m.fetch_lengths?
(result)->m.fetch_lengths((result)):NULL)
-void mysqlnd_restart_psession(MYSQLND *conn);
-void mysqlnd_end_psession(MYSQLND *conn);
-MYSQLND_RES * mysqlnd_use_result(MYSQLND *conn TSRMLS_DC);
-MYSQLND_RES * mysqlnd_store_result(MYSQLND *conn TSRMLS_DC);
-enum_func_status mysqlnd_query(MYSQLND *conn, const char *query, unsigned int query_len
TSRMLS_DC);
-enum_func_status mysqlnd_fetch_row_ex(MYSQLND_RES *result, zval *row, unsigned int flags,
zend_bool *fetched_anything TSRMLS_DC);
-enum_func_status mysqlnd_free_result(MYSQLND_RES *result TSRMLS_DC);
-enum_func_status mysqlnd_next_result(MYSQLND *conn TSRMLS_DC);
-zend_bool mysqlnd_more_results(const MYSQLND * const conn);
-/*
- Use the macros above, not the actual functions. This will save
- you time of writing TSRMLS_DC ZEND_FILE_LINE_DC
-*/
-void _mysqlnd_fetch_into(MYSQLND_RES *result, unsigned int flags, zval *return_value
TSRMLS_DC ZEND_FILE_LINE_DC);
-MYSQLND_ROW _mysqlnd_fetch_row(MYSQLND_RES *result TSRMLS_DC ZEND_FILE_LINE_DC);
-void _mysqlnd_fetch_all(MYSQLND_RES *result, unsigned int flags, zval *return_value
TSRMLS_DC ZEND_FILE_LINE_DC);
+#define mysqlnd_field_seek(result, ofs) (result)->m.field_seek((result), (ofs))
+#define mysqlnd_field_tell(result) (result)->current_field
+#define mysqlnd_fetch_field(result) (result)->m.fetch_field((result))
+#define mysqlnd_fetch_field_direct(result,fnr) &((result)->fields[(fnr)])
+/* mysqlnd metadata */
+#define mysqlnd_get_client_info() MYSQLND_VERSION
+#define mysqlnd_get_client_version() MYSQLND_VERSION_ID
-/* Query metadata */
-unsigned int mysqlnd_field_count(const MYSQLND * const conn);
-MYSQLND_FIELD * mysqlnd_fetch_field(MYSQLND_RES *result);
-MYSQLND_FIELD * mysqlnd_fetch_field_direct(MYSQLND_RES *result, MYSQLND_FIELD_OFFSET
fieldnr);
-unsigned int mysqlnd_num_fields(const MYSQLND_RES * const res);
-mynd_ulonglong mysqlnd_num_rows(const MYSQLND_RES * const res);
-MYSQLND_FIELD_OFFSET mysqlnd_field_seek(MYSQLND_RES *result, MYSQLND_FIELD_OFFSET
field_offset);
-MYSQLND_FIELD_OFFSET mysqlnd_field_tell(MYSQLND_RES *result);
+/*****************************************************************************************************/
+#else /* Using plain functions */
+/*****************************************************************************************************/
+
+/* Errors */
+#define mysqlnd_errno(conn) (conn)->m->get_error_no(conn)
+#define mysqlnd_error(conn) (conn)->m->get_error(conn)
+#define mysqlnd_sqlstate(conn) (conn)->m->get_sqlstate(conn)
+
+/* 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))
+
+unsigned long * _mysqlnd_fetch_lengths(MYSQLND_RES * const result);
+#define mysqlnd_fetch_lengths(result) _mysqlnd_fetch_lengths((result))
+
+#define mysqlnd_field_seek(result, ofs) (result)->m.field_seek((result), (ofs))
+#define mysqlnd_field_tell(result) (result)->m.field_tell((result))
+#define mysqlnd_fetch_field(result) (result)->m.fetch_field((result))
+#define
mysqlnd_fetch_field_direct(result,fnr) (result)->m.fetch_field_direct((result), (fnr))
+
+/* mysqlnd metadata */
+const char * _mysqlnd_get_client_info();
+unsigned int mysqlnd_get_client_version();
+#define mysqlnd_get_client_info _mysqlnd_get_client_info
+#define mysqlnd_get_client_version _mysqlnd_get_client_version
+
+#endif /* MYSQLND_INLINE_OPTIMISATIONS */
+/*****************************************************************************************************/
+
+
+
const char * mysqlnd_field_type_name(enum mysqlnd_field_types field_type);
-unsigned long * mysqlnd_fetch_lengths(MYSQLND_RES *result TSRMLS_DC);
-unsigned long long mysqlnd_insert_id(const MYSQLND * const conn);
-unsigned long long mysqlnd_affected_rows(const MYSQLND * const conn);
-unsigned int mysqlnd_warning_count(const MYSQLND * const conn);
-const char * mysqlnd_info(const MYSQLND * const conn);
-enum_func_status mysqlnd_data_seek(MYSQLND_RES *result, mynd_ulonglong row);
+/* LOAD DATA LOCAL */
+void mysqlnd_local_infile_default(MYSQLND *conn);
+void mysqlnd_set_local_infile_handler(MYSQLND * const conn, const char * const
funcname);
/* Simple commands */
-enum_func_status mysqlnd_autocommit(MYSQLND *conn, zend_bool mode TSRMLS_DC);
-enum_func_status mysqlnd_commit(MYSQLND *conn TSRMLS_DC);
-enum_func_status mysqlnd_rollback(MYSQLND *conn TSRMLS_DC);
-enum_func_status mysqlnd_dump_debug_info(MYSQLND *conn TSRMLS_DC);
-enum_func_status mysqlnd_select_db(MYSQLND *conn, const char * const db, unsigned int
db_len TSRMLS_DC);
-enum_func_status mysqlnd_ping(MYSQLND *conn TSRMLS_DC);
-enum_func_status mysqlnd_kill(MYSQLND *conn, unsigned long pid TSRMLS_DC);
-enum_func_status mysqlnd_refresh(MYSQLND *conn, unsigned long options TSRMLS_DC);
-enum_func_status mysqlnd_shutdown(MYSQLND *conn, unsigned long level TSRMLS_DC);
-enum_func_status mysqlnd_stat(MYSQLND *conn, char **message, unsigned int * message_len
TSRMLS_DC);
-enum_func_status mysqlnd_set_server_option(MYSQLND *conn, enum_mysqlnd_server_option
option TSRMLS_DC);
-unsigned long mysqlnd_get_server_version(const MYSQLND * const conn);
-const char *mysqlnd_get_server_info(const MYSQLND * const conn);
-const char *mysqlnd_get_host_info(const MYSQLND * const conn);
-unsigned int mysqlnd_get_proto_info(const MYSQLND * const conn);
-mynd_ulonglong mysqlnd_thread_id(const MYSQLND *const conn);
-unsigned int mysqlnd_get_client_version();
-const char *mysqlnd_get_client_info();
-void mysqlnd_local_infile_default(MYSQLND *conn);
-void mysqlnd_set_local_infile_handler(MYSQLND *conn, char *funcname);
+#define mysqlnd_autocommit(conn, mode) (conn)->m->query((conn),(mode) ? "SET
AUTOCOMMIT=1":"SET AUTOCOMMIT=0", 16 TSRMLS_CC)
+#define mysqlnd_commit(conn) (conn)->m->query((conn), "COMMIT",
sizeof("COMMIT")-1 TSRMLS_CC)
+#define mysqlnd_rollback(conn) (conn)->m->query((conn), "ROLLBACK",
sizeof("ROLLBACK")-1 TSRMLS_CC)
+#define
mysqlnd_dump_debug_info(conn) (conn)->m->server_dump_debug_information((conn)
TSRMLS_CC)
+#define mysqlnd_select_db(conn, db, db_len) (conn)->m->select_db((conn), (db),
(db_len) TSRMLS_CC)
+#define mysqlnd_ping(conn) (conn)->m->ping((conn) TSRMLS_CC)
+#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_set_charset(conn, charset) (conn)->m->set_charset((conn),
(charset) 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))
+#define mysqlnd_set_server_option(conn, op) (conn)->m->set_server_option((conn),
(op) TSRMLS_CC)
-/* Errors */
-unsigned int mysqlnd_errno(const MYSQLND * const conn);
-const char * mysqlnd_error(const MYSQLND * const conn);
-const char * mysqlnd_sqlstate(const MYSQLND * const conn);
-
/* Misc */
-ulong mysqlnd_real_escape_string(MYSQLND *conn, char *newstr, char *escapestr, int
escapestr_len);
-enum_func_status mysqlnd_set_charset(MYSQLND *conn, char *charset TSRMLS_DC);
+#define mysqlnd_real_escape_string(conn, newstr, escapestr, escapestr_len) \
+ (conn)->m->escape_string((conn), (newstr), (escapestr), (escapestr_len))
+
/* PS */
-void _mysqlnd_init_ps();/* This one is private, mysqlnd_library_init() will call it
*/
-MYSQLND_STMT * mysqlnd_stmt_init(MYSQLND *conn);
-MYSQLND_RES * mysqlnd_stmt_store_result(MYSQLND_STMT *stmt TSRMLS_DC);
-enum_func_status mysqlnd_stmt_prepare(MYSQLND_STMT *stmt, char *query, unsigned int
query_len TSRMLS_DC);
-enum_func_status mysqlnd_stmt_execute(MYSQLND_STMT *stmt TSRMLS_DC);
-enum_func_status mysqlnd_stmt_fetch(MYSQLND_STMT *stmt, zend_bool *fetched_anything
TSRMLS_DC);
-enum_func_status mysqlnd_stmt_close(MYSQLND_STMT *stmt TSRMLS_DC);
-enum_func_status mysqlnd_stmt_bind_param(MYSQLND_STMT *stmt, MYSQLND_PARAM_BIND
*param_bind);
-enum_func_status mysqlnd_stmt_bind_result(MYSQLND_STMT *stmt, MYSQLND_RESULT_BIND
*result_bind);
+MYSQLND_STMT * mysqlnd_stmt_init(MYSQLND * const conn);
+MYSQLND_RES * mysqlnd_stmt_store_result(MYSQLND_STMT * const stmt TSRMLS_DC);
+enum_func_status mysqlnd_stmt_prepare(MYSQLND_STMT * const stmt, const char * const
query, unsigned int query_len TSRMLS_DC);
+enum_func_status mysqlnd_stmt_execute(MYSQLND_STMT * const stmt TSRMLS_DC);
+enum_func_status mysqlnd_stmt_fetch(MYSQLND_STMT * const stmt, zend_bool * const
fetched_anything TSRMLS_DC);
+enum_func_status mysqlnd_stmt_close(MYSQLND_STMT * const stmt TSRMLS_DC);
+enum_func_status mysqlnd_stmt_bind_param(MYSQLND_STMT *stmt, MYSQLND_PARAM_BIND *
param_bind);
+enum_func_status mysqlnd_stmt_bind_result(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND
* const result_bind);
mynd_ulonglong mysqlnd_stmt_insert_id(const MYSQLND_STMT * const stmt);
mynd_ulonglong mysqlnd_stmt_affected_rows(const MYSQLND_STMT * const stmt);
unsigned int mysqlnd_stmt_field_count(const MYSQLND_STMT * const stmt);
@@ -748,30 +849,16 @@
unsigned int mysqlnd_stmt_errno(const MYSQLND_STMT * const stmt);
const char * mysqlnd_stmt_error(const MYSQLND_STMT * const stmt);
const char * mysqlnd_stmt_sqlstate(const MYSQLND_STMT * const stmt);
-enum_func_status mysqlnd_stmt_attr_set(MYSQLND_STMT *stmt, enum mysqlnd_stmt_attr
attr_type, unsigned long value);
-enum_func_status mysqlnd_stmt_attr_get(MYSQLND_STMT *stmt, enum mysqlnd_stmt_attr
attr_type, void *value);
-enum_func_status mysqlnd_options(MYSQLND *conn, enum_mysqlnd_option option, const char
*value);
+enum_func_status mysqlnd_stmt_attr_set(MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr
attr_type, unsigned long value);
+enum_func_status mysqlnd_stmt_attr_get(MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr
attr_type, void * const value);
/* Performance statistics */
void _mysqlnd_get_client_stats(zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC);
-void _mysqlnd_get_connection_stats(MYSQLND *conn, zval *return_value TSRMLS_DC
ZEND_FILE_LINE_DC);
-
-#if A0
-/* Caching zval allocator */
-zval * mysqlnd_alloc_get_zval(MYSQLND_ZVAL_CACHE * const cache);
-void mysqlnd_alloc_zval_ptr_dtor(zval **zv, MYSQLND_ZVAL_CACHE * const cache);
-MYSQLND_ZVAL_CACHE* mysqlnd_alloc_init_cache();
-MYSQLND_ZVAL_CACHE* mysqlnd_alloc_get_cache_reference(MYSQLND_ZVAL_CACHE *cache);
-void mysqlnd_alloc_free_cache_reference(MYSQLND_ZVAL_CACHE **cache);
-#endif
-
/* Persistent caching zval allocator */
-typedef struct _mysqlnd_zval mysqlnd_zval;
-
MYSQLND_ZVAL_PCACHE* mysqlnd_palloc_init_cache(unsigned int cache_size);
-MYSQLND_ZVAL_PCACHE* mysqlnd_palloc_get_cache_reference(MYSQLND_ZVAL_PCACHE *cache);
+MYSQLND_ZVAL_PCACHE* mysqlnd_palloc_get_cache_reference(MYSQLND_ZVAL_PCACHE * const
cache);
void mysqlnd_palloc_free_cache_reference(MYSQLND_ZVAL_PCACHE **cache);
void mysqlnd_palloc_rinit(MYSQLND_ZVAL_PCACHE * const cache);
void mysqlnd_palloc_rshutdown(MYSQLND_ZVAL_PCACHE * const cache);
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_alloc.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_alloc.c 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_alloc.c 2007-02-23 11:31:06 UTC (rev 60)
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 6 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2007 The PHP Group |
+ | Copyright (c) 2006-2007 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -31,6 +31,16 @@
#define MYSQLND_ZVALS_MAX_CACHE 5000
+#if A0
+/* Caching zval allocator */
+zval * mysqlnd_alloc_get_zval(MYSQLND_ZVAL_CACHE * const cache);
+void mysqlnd_alloc_zval_ptr_dtor(zval **zv, MYSQLND_ZVAL_CACHE * const cache);
+MYSQLND_ZVAL_CACHE* mysqlnd_alloc_init_cache();
+MYSQLND_ZVAL_CACHE* mysqlnd_alloc_get_cache_reference(MYSQLND_ZVAL_CACHE *cache);
+void mysqlnd_alloc_free_cache_reference(MYSQLND_ZVAL_CACHE **cache);
+#endif
+
+
/*
The cache line is a big contiguous array of zval pointers.
Because the CPU cache will cache starting from an address, and not
@@ -203,7 +213,7 @@
ret->references = 1;
/* Let's have always one, so we don't need to do a check in get_zval */
- ret->free_list = ecalloc(1, sizeof(struct mysqlnd_zval_list));
+ ret->free_list = ecalloc(1, sizeof(struct st_mysqlnd_zval_list));
/* One more for empty position of last_added */
ret->free_list->ptr_line = ecalloc(ret->max_items + 1, sizeof(zval *));
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_charset.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_charset.c 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_charset.c 2007-02-23 11:31:06 UTC (rev 60)
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 6 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2007 The PHP Group |
+ | Copyright (c) 2006-2007 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -27,8 +27,9 @@
{
zend_uchar c;
- if (start >= end)
+ if (start >= end) {
return 0;
+ }
c = (zend_uchar) start[0];
@@ -75,8 +76,8 @@
if (utf8 < 0xF0) {
return 3; /* triple byte character */
}
+ /* We still don't support characters out of the BMP */
- /* all other types aren't supported yet */
return 0;
}
/* }}} */
@@ -298,7 +299,7 @@
/* {{{ mysqlnd_charsets */
-MYSQLND_CHARSET mysqlnd_charsets[] =
+const MYSQLND_CHARSET mysqlnd_charsets[] =
{
{ 1, "big5","big5_chinese_ci", 1, 2, 0, mysqlnd_mbcharlen_big5, check_mb_big5},
{ 3, "dec8", "dec8_swedisch_ci", 1, 1, 0, NULL, NULL},
@@ -435,15 +436,15 @@
/* {{{ mysqlnd_find_charset_nr */
-MYSQLND_CHARSET *mysqlnd_find_charset_nr(uint charsetnr)
+const MYSQLND_CHARSET * mysqlnd_find_charset_nr(uint charsetnr)
{
- MYSQLND_CHARSET *c = mysqlnd_charsets;
+ const MYSQLND_CHARSET * c = mysqlnd_charsets;
do {
if (c->nr == charsetnr) {
return c;
}
- c++;
+ ++c;
} while (c[0].nr != 0);
return NULL;
}
@@ -451,15 +452,15 @@
/* {{{ mysqlnd_find_charset_name */
-MYSQLND_CHARSET *mysqlnd_find_charset_name(char *name)
+const MYSQLND_CHARSET * mysqlnd_find_charset_name(const char * const name)
{
- MYSQLND_CHARSET *c = mysqlnd_charsets;
+ const MYSQLND_CHARSET *c = mysqlnd_charsets;
do {
if (!strcasecmp(c->name, name)) {
return c;
}
- c++;
+ ++c;
} while (c[0].nr != 0);
return NULL;
}
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_loaddata.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_loaddata.c 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_loaddata.c 2007-02-23 11:31:06 UTC (rev 60)
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 6 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2007 The PHP Group |
+ | Copyright (c) 2006-2007 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -202,7 +202,7 @@
/* }}} */
/* {{{ mysqlnd_set_local_infile_handler */
-void mysqlnd_set_local_infile_handler(MYSQLND *conn, char *funcname)
+void mysqlnd_set_local_infile_handler(MYSQLND * const conn, const char * const funcname)
{
ALLOC_ZVAL(conn->infile.callback);
ZVAL_STRING(conn->infile.callback, funcname, 1);
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_palloc.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_palloc.c 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_palloc.c 2007-02-23 11:31:06 UTC (rev 60)
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 6 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2007 The PHP Group |
+ | Copyright (c) 2006-2007 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -80,7 +80,7 @@
/* {{{ mysqlnd_palloc_get_cache_reference */
-MYSQLND_ZVAL_PCACHE* mysqlnd_palloc_get_cache_reference(MYSQLND_ZVAL_PCACHE *cache)
+MYSQLND_ZVAL_PCACHE* mysqlnd_palloc_get_cache_reference(MYSQLND_ZVAL_PCACHE * const
cache)
{
if (cache) {
LOCK_PCACHE(cache);
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_priv.h
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_priv.h 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_priv.h 2007-02-23 11:31:06 UTC (rev 60)
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 6 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2007 The PHP Group |
+ | Copyright (c) 2006-2007 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -85,23 +85,23 @@
#define PACKET_INIT(packet, enum_type, c_type) \
{ \
packet = (c_type) ecalloc(1, packet_methods[enum_type].struct_size); \
- ((c_type) (packet))->header.methods = &packet_methods[enum_type]; \
+ ((c_type) (packet))->header.m = &packet_methods[enum_type]; \
}
-#define PACKET_WRITE(packet,
conn) ((packet)->header.methods->write_to_net((packet), (conn) TSRMLS_CC))
-#define PACKET_READ(packet,
conn) ((packet)->header.methods->read_from_net((packet), (conn) TSRMLS_CC))
+#define PACKET_WRITE(packet, conn) ((packet)->header.m->write_to_net((packet),
(conn) TSRMLS_CC))
+#define PACKET_READ(packet, conn) ((packet)->header.m->read_from_net((packet),
(conn) TSRMLS_CC))
#define PACKET_FREE(packet) \
do { \
- ((packet)->header.methods->free_mem((packet), FALSE)); \
+ ((packet)->header.m->free_mem((packet), FALSE)); \
} while (0);
#define PACKET_INIT_ALLOCA(packet, enum_type) \
{ \
memset(&(packet), 0, packet_methods[enum_type].struct_size); \
- (packet).header.methods = &packet_methods[enum_type]; \
+ (packet).header.m = &packet_methods[enum_type]; \
}
#define PACKET_WRITE_ALLOCA(packet, conn) PACKET_WRITE(&(packet), (conn))
#define PACKET_READ_ALLOCA(packet, conn) PACKET_READ(&(packet), (conn))
-#define PACKET_FREE_ALLOCA(packet) (packet.header.methods->free_mem(&(packet),
TRUE))
+#define PACKET_FREE_ALLOCA(packet) (packet.header.m->free_mem(&(packet), TRUE))
/* Error handling */
@@ -278,7 +278,7 @@
};
-typedef struct mysqlnd_string
+typedef struct st_mysqlnd_string
{
char *s;
size_t l;
@@ -286,14 +286,14 @@
/* Session caching allocator */
-struct mysqlnd_zval_list {
+struct st_mysqlnd_zval_list {
zval **ptr_line;
zval **last_added;
};
-struct _mysqlnd_zval_cache {
- struct mysqlnd_zval_list *free_list;
+struct st_mysqlnd_zval_cache {
+ struct st_mysqlnd_zval_list *free_list;
unsigned int free_items;
unsigned int max_items;
unsigned int references;
@@ -306,20 +306,20 @@
/* Persistent caching allocator */
-struct _mysqlnd_zval {
+typedef struct st_mysqlnd_zval {
/* Should be first */
zval zv;
zend_bool ze_alloced;
-};
+} mysqlnd_zval;
-typedef struct _mysqlnd_ndzval_list {
+typedef struct st_mysqlnd_ndzval_list {
mysqlnd_zval **ptr_line;
mysqlnd_zval **last_added;
} mysqlnd_ndzval_list;
-struct _mysqlnd_zval_pcache {
+struct st_mysqlnd_zval_pcache {
mysqlnd_zval *block;
mysqlnd_zval *last_in_block;
mysqlnd_ndzval_list *free_list;
@@ -341,18 +341,18 @@
/* PS stuff */
typedef void (*ps_field_fetch_func)(zval *zv, const MYSQLND_FIELD * const field,
uint pack_len, zend_uchar **row TSRMLS_DC);
-struct mysqlnd_perm_bind {
+struct st_mysqlnd_perm_bind {
ps_field_fetch_func func;
/* should be signed int */
int pack_len;
unsigned int php_type;
};
-extern struct mysqlnd_perm_bind fetch_functions[MYSQL_TYPE_LAST + 1];
+extern struct st_mysqlnd_perm_bind fetch_functions[MYSQL_TYPE_LAST + 1];
/* Low-level extraction functionality */
-typedef struct _mysqlnd_packet_methods {
+typedef struct st_mysqlnd_packet_methods {
size_t struct_size;
enum_func_status (*read_from_net)(void *packet, MYSQLND *conn TSRMLS_DC);
size_t (*write_to_net)(void *packet, MYSQLND *conn TSRMLS_DC);
@@ -362,26 +362,26 @@
extern mysqlnd_packet_methods packet_methods[];
-typedef struct _mysqlnd_packet_header {
+typedef struct st_mysqlnd_packet_header {
size_t size;
zend_uchar packet_no;
- struct _mysqlnd_packet_methods *methods;
+ mysqlnd_packet_methods *m;
} mysqlnd_packet_header;
/* Server greets the client */
-typedef struct _php_mysql_packet_greet {
+typedef struct st_php_mysql_packet_greet {
mysqlnd_packet_header header;
- mysqlnd_1b protocol_version;
- char *server_version;
- mysqlnd_4b thread_id;
- zend_uchar scramble_buf[SCRAMBLE_LENGTH];
+ mysqlnd_1b protocol_version;
+ char *server_version;
+ mysqlnd_4b thread_id;
+ zend_uchar scramble_buf[SCRAMBLE_LENGTH];
/* 1 byte pad */
- mysqlnd_2b server_capabilities;
- mysqlnd_1b charset_no;
- mysqlnd_2b server_status;
+ mysqlnd_2b server_capabilities;
+ mysqlnd_1b charset_no;
+ mysqlnd_2b server_status;
/* 13 byte pad*/
- zend_bool pre41;
+ zend_bool pre41;
/* If error packet, we use these */
char error[MYSQLND_ERRMSG_SIZE+1];
char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
@@ -390,7 +390,7 @@
/* Client authenticates */
-typedef struct _php_mysql_packet_auth {
+typedef struct st_php_mysql_packet_auth {
mysqlnd_packet_header header;
mysqlnd_4b client_flags;
uint32 max_packet_size;
@@ -411,7 +411,7 @@
/* OK packet */
-typedef struct _php_mysql_packet_ok {
+typedef struct st_php_mysql_packet_ok {
mysqlnd_packet_header header;
mysqlnd_1b field_count; /* always 0x0 */
mynd_ulonglong affected_rows;
@@ -428,7 +428,7 @@
/* Command packet */
-typedef struct _php_mysql_packet_command {
+typedef struct st_php_mysql_packet_command {
mysqlnd_packet_header header;
enum php_mysqlnd_server_command command;
const char *argument;
@@ -437,7 +437,7 @@
/* EOF packet */
-typedef struct _php_mysql_packet_eof {
+typedef struct st_php_mysql_packet_eof {
mysqlnd_packet_header header;
mysqlnd_1b field_count; /* 0xFE */
mysqlnd_2b warning_count;
@@ -447,7 +447,7 @@
/* Result Set header*/
-typedef struct _php_mysql_packet_rset_header {
+typedef struct st_php_mysql_packet_rset_header {
mysqlnd_packet_header header;
/*
0x00 => ok
@@ -473,16 +473,16 @@
/* Result set field packet */
-typedef struct _php_mysql_packet_res_field {
- mysqlnd_packet_header header;
- MYSQLND_FIELD *metadata;
+typedef struct st_php_mysql_packet_res_field {
+ mysqlnd_packet_header header;
+ MYSQLND_FIELD *metadata;
/* For table definitions, empty for result sets */
- zend_bool skip_parsing;
+ zend_bool skip_parsing;
} php_mysql_packet_res_field;
/* Row packet */
-struct _php_mysql_packet_row {
+struct st_php_mysql_packet_row {
mysqlnd_packet_header header;
zval **fields;
mysqlnd_4b field_count;
@@ -496,34 +496,14 @@
zend_uchar *row_buffer;
- zend_bool skip_extraction;
- zend_bool binary_protocol;
- MYSQLND_FIELD *fields_metadata;
+ zend_bool skip_extraction;
+ zend_bool binary_protocol;
+ MYSQLND_FIELD *fields_metadata;
};
-/* Binary Row packet */
-typedef struct _php_mysql_packet_binrow {
- mysqlnd_packet_header header;
- zval **fields;
- mysqlnd_4b field_count;
- zend_bool eof;
- /*
- These are, of course, only for SELECT in the EOF packet,
- which is detected by this packet
- */
- mysqlnd_2b warning_count;
- mysqlnd_2b server_status;
-
- zend_uchar *row_buffer;
-
- zend_bool skip_extraction;
-} php_mysql_packet_binrow;
-
-
-
/* Statistics packet */
-typedef struct _php_mysql_packet_stats {
+typedef struct st_php_mysql_packet_stats {
mysqlnd_packet_header header;
char *message;
/* message_len is not part of the packet*/
@@ -532,7 +512,7 @@
/* COM_PREPARE response packet */
-typedef struct _php_mysql_packet_prepare_response {
+typedef struct st_php_mysql_packet_prepare_response {
mysqlnd_packet_header header;
/* also known as field_count 0x00=OK , 0xFF=error */
unsigned char error_code;
@@ -547,12 +527,12 @@
/* Statistics packet */
-typedef struct _php_mysql_packet_chg_user_resp {
+typedef struct st_php_mysql_packet_chg_user_resp {
mysqlnd_packet_header header;
- mysqlnd_4b field_count;
+ mysqlnd_4b field_count;
/* message_len is not part of the packet*/
- mysqlnd_2b server_capabilities;
+ mysqlnd_2b server_capabilities;
/* If error packet, we use these */
mysqlnd_error_info error_info;
} php_mysql_packet_chg_user_resp;
@@ -577,19 +557,22 @@
enum php_mysql_packet_type ok_packet,
zend_bool silent, enum php_mysqlnd_server_command command
TSRMLS_DC);
-
+
+MYSQLND_RES *mysqlnd_result_init(unsigned int field_count, MYSQLND_ZVAL_PCACHE
*cache);
void mysqlnd_unbuffered_free_last_data(MYSQLND_RES *result);
void mysqlnd_internal_free_result_contents(MYSQLND_RES *result);
void mysqlnd_internal_free_result_buffers(MYSQLND_RES *result);
void mysqlnd_internal_free_stmt_content(MYSQLND_STMT *stmt TSRMLS_DC);
void mysqlnd_internal_free_result(MYSQLND_RES *result TSRMLS_DC);
-void mysqlnd_conn_free(MYSQLND *conn TSRMLS_DC);
size_t mysqlnd_stream_write(MYSQLND *conn, char * const buf, size_t count TSRMLS_DC);
size_t mysqlnd_stream_write_w_header(MYSQLND *conn, char * const buf, size_t count
TSRMLS_DC);
enum_func_status mysqlnd_handle_local_infile(MYSQLND *conn, const char *filename
TSRMLS_DC);
+
+void _mysqlnd_init_ps_subsystem();/* This one is private, mysqlnd_library_init() will
call it */
+
void mysqlnd_stmt_execute_store_params(MYSQLND_STMT *stmt, zend_uchar **buf, zend_uchar
**p,
size_t *buf_len, unsigned int null_byte_offset);
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c 2007-02-23 11:31:06 UTC (rev 60)
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 6 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2007 The PHP Group |
+ | Copyright (c) 2006-2007 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -44,7 +44,7 @@
/* {{{ mysqlnd_stmt_init */
-MYSQLND_STMT *mysqlnd_stmt_init(MYSQLND *conn)
+MYSQLND_STMT *mysqlnd_stmt_init(MYSQLND * const conn)
{
MYSQLND_STMT *stmt = ecalloc(1, sizeof(MYSQLND_STMT));
@@ -64,7 +64,7 @@
/* }}} */
-/* {{{ mysqlnd_stmt_prepare */
+/* {{{ mysqlnd_stmt_skip_metadata */
static enum_func_status
mysqlnd_stmt_skip_metadata(MYSQLND_STMT *stmt TSRMLS_DC)
{
@@ -143,7 +143,7 @@
/* {{{ mysqlnd_stmt_prepare */
enum_func_status
-mysqlnd_stmt_prepare(MYSQLND_STMT *stmt, char *query, unsigned int query_len TSRMLS_DC)
+mysqlnd_stmt_prepare(MYSQLND_STMT * const stmt, const char * const query, unsigned int
query_len TSRMLS_DC)
{
enum_func_status ret;
MYSQLND_RES *result = NULL;
@@ -176,9 +176,8 @@
/* Because results reference the connection. */
stmt->conn->references++;
/* Allocate the result now as it is needed for the reading of metadata */
- result = ecalloc(1, sizeof(MYSQLND_RES));
+ result = mysqlnd_result_init(stmt->field_count, NULL);
result->type = MYSQLND_RES_PS;
- result->field_count = stmt->field_count;
if (FAIL == mysqlnd_read_result_metadata(stmt->conn, result TSRMLS_CC)) {
/* Hence if this fails, our statement is in bad shape. */
@@ -199,7 +198,7 @@
/* {{{ mysqlnd_stmt_execute */
enum_func_status
-mysqlnd_stmt_execute(MYSQLND_STMT *stmt TSRMLS_DC)
+mysqlnd_stmt_execute(MYSQLND_STMT * const stmt TSRMLS_DC)
{
enum_func_status ret;
zend_bool free_request;
@@ -227,7 +226,7 @@
This will clean also the metadata, but after the EXECUTE call we will
have it again.
*/
- mysqlnd_internal_free_result_buffers(stmt->result);
+ stmt->result->m.free_result_buffers(stmt->result);
} else if (stmt->state < MYSQLND_STMT_PREPARED) {
/* Only initted - error */
SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE,
@@ -356,8 +355,8 @@
/* }}} */
-/* {{{ mysqlnd_store_result */
-MYSQLND_RES *mysqlnd_stmt_store_result(MYSQLND_STMT *stmt TSRMLS_DC)
+/* {{{ mysqlnd_stmt_store_result */
+MYSQLND_RES *mysqlnd_stmt_store_result(MYSQLND_STMT * const stmt TSRMLS_DC)
{
enum_func_status ret;
MYSQLND *conn = stmt->conn;
@@ -384,8 +383,8 @@
MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_PS_BUFFERED_SETS);
result = stmt->result;
- result->fetch_row = mysqlnd_fetch_stmt_row_buffered;
- result->fetch_lengths = NULL;/* makes no sense */
+ result->m.fetch_row = mysqlnd_fetch_stmt_row_buffered;
+ result->m.fetch_lengths = NULL;/* makes no sense */
result->zval_cache = NULL;
/* Create room for 'next_extend' rows */
@@ -569,9 +568,9 @@
result = stmt->result;
result->type = MYSQLND_RES_PS;
- result->fetch_row = stmt->cursor_exists? mysqlnd_fetch_stmt_row_cursor:
+ result->m.fetch_row = stmt->cursor_exists? mysqlnd_fetch_stmt_row_cursor:
mysqlnd_stmt_fetch_row_unbuffered;
- result->fetch_lengths = NULL; /* makes no sense */
+ result->m.fetch_lengths = NULL; /* makes no sense */
result->zval_cache = NULL;
result->conn = conn;
@@ -686,7 +685,7 @@
/* {{{ mysqlnd_stmt_fetch */
enum_func_status
-mysqlnd_stmt_fetch(MYSQLND_STMT *stmt, zend_bool *fetched_anything TSRMLS_DC)
+mysqlnd_stmt_fetch(MYSQLND_STMT * const stmt, zend_bool * const fetched_anything
TSRMLS_DC)
{
if (!stmt->result || !stmt->result_bind ||
stmt->state < MYSQLND_STMT_WAITING_USE_OR_STORE) {
@@ -715,16 +714,16 @@
MYSQLND_INC_CONN_STATISTIC(&stmt->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT);
- return stmt->result->fetch_row(stmt->result, (void*)stmt, 0, fetched_anything
TSRMLS_CC);
+ return stmt->result->m.fetch_row(stmt->result, (void*)stmt, 0, fetched_anything
TSRMLS_CC);
}
/* }}} */
/* {{{ mysqlnd_stmt_close */
enum_func_status
-mysqlnd_stmt_close(MYSQLND_STMT *stmt TSRMLS_DC)
+mysqlnd_stmt_close(MYSQLND_STMT * const stmt TSRMLS_DC)
{
- MYSQLND *conn = stmt->conn;
+ MYSQLND * conn = stmt->conn;
zend_uchar buf[STMT_ID_LENGTH /* statement id */];
/* Don't free it, the resource destructor will do it */
mysqlnd_internal_free_stmt_content(stmt TSRMLS_CC);
@@ -743,7 +742,7 @@
/* {{{ mysqlnd_stmt_bind_param */
enum_func_status
-mysqlnd_stmt_bind_param(MYSQLND_STMT *stmt, MYSQLND_PARAM_BIND *param_bind)
+mysqlnd_stmt_bind_param(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND *param_bind)
{
int i = 0;
@@ -792,7 +791,7 @@
/* {{{ mysqlnd_stmt_bind_result */
enum_func_status
-mysqlnd_stmt_bind_result(MYSQLND_STMT *stmt, MYSQLND_RESULT_BIND *result_bind)
+mysqlnd_stmt_bind_result(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND * const
result_bind)
{
int i = 0;
if (stmt->state < MYSQLND_STMT_PREPARED) {
@@ -889,7 +888,7 @@
/* {{{ mysqlnd_stmt_attr_set */
enum_func_status
-mysqlnd_stmt_attr_set(MYSQLND_STMT *stmt, enum mysqlnd_stmt_attr attr_type, unsigned long
value)
+mysqlnd_stmt_attr_set(MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type,
unsigned long value)
{
switch (attr_type) {
case STMT_ATTR_UPDATE_MAX_LENGTH:
@@ -921,7 +920,7 @@
/* {{{ mysqlnd_stmt_attr_get */
enum_func_status
-mysqlnd_stmt_attr_get(MYSQLND_STMT *stmt, enum mysqlnd_stmt_attr attr_type, void *value)
+mysqlnd_stmt_attr_get(MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, void *
const value)
{
switch (attr_type) {
case STMT_ATTR_UPDATE_MAX_LENGTH:
@@ -1040,7 +1039,7 @@
This will free the object too, of course because references has
reached zero.
*/
- mysqlnd_conn_free(stmt->conn TSRMLS_CC);
+ stmt->conn->m->dtor(stmt->conn TSRMLS_CC);
stmt->conn = NULL;
}
}
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_ps_codec.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_ps_codec.c 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_ps_codec.c 2007-02-23 11:31:06 UTC (rev 60)
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 6 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2007 The PHP Group |
+ | Copyright (c) 2006-2007 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -58,7 +58,7 @@
-struct mysqlnd_perm_bind fetch_functions[MYSQL_TYPE_LAST + 1];
+struct st_mysqlnd_perm_bind fetch_functions[MYSQL_TYPE_LAST + 1];
#define MYSQLND_PS_SKIP_RESULT_W_LEN -1
#define MYSQLND_PS_SKIP_RESULT_STR -2
@@ -334,8 +334,8 @@
-/* {{{ _mysqlnd_init_ps */
-void _mysqlnd_init_ps()
+/* {{{ _mysqlnd_init_ps_subsystem */
+void _mysqlnd_init_ps_subsystem()
{
memset(fetch_functions, 0, sizeof(fetch_functions));
fetch_functions[MYSQL_TYPE_NULL].func = ps_fetch_null;
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_wireprotocol.c 2007-02-23 11:31:06 UTC (rev 60)
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 6 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2007 The PHP Group |
+ | Copyright (c) 2006-2007 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
Modified: trunk/ext/mysqli/tests/bench/framework/config.php
===================================================================
--- trunk/ext/mysqli/tests/bench/framework/config.php 2007-02-23 10:23:12 UTC (rev 59)
+++ trunk/ext/mysqli/tests/bench/framework/config.php 2007-02-23 11:31:06 UTC (rev 60)
@@ -3,14 +3,14 @@
// Check for PHP's run-test.php and use it's environment variables?
// If enabled MYSQL_TEST_USER etc. will overwrite settings specified here!
//
-define('RB_USE_ENV', false);
+define('RB_USE_ENV', true);
//
// PHP binaries to use
//
$rb_binaries = array(
- 'mysqli' => '/home/nixnutz/php_mysqli_original/sapi/cli/php',
- 'mysqlnd' => '/home/nixnutz/php_mysqli/sapi/cli/php',
+ 'mysqli' =>
'/home/andrey/dev/non_cpp_mysqlnd/php6.0-200702150930/sapi/cli/php',
+ 'mysqlnd' => '/home/andrey/dev/php6/sapi/cli/php',
);
//
@@ -18,13 +18,13 @@
//
// database user
-define('RB_DB_USER', 'root');
+define('RB_DB_USER', 'foo');
// database password
-define('RB_DB_PASSWD', 'root');
+define('RB_DB_PASSWD', 'bar');
// database
-define('RB_DB_DB', 'runbench');
+define('RB_DB_DB', 'test');
// host, for mysqlnd: localhost = socket, 127.0.0.1 = tcp/ip
-define('RB_DB_HOST', 'localhost');
+define('RB_DB_HOST', '127.0.0.1');
// port
define('RB_DB_PORT', 3306);
// socket
| Thread |
|---|
| • PHP mysqlnd svn commit: r60 - in trunk/ext/mysqli: . mysqlnd tests/bench/framework | ahristov | 23 Feb |