List:Commits« Previous MessageNext Message »
From:ahristov Date:February 23 2007 11:31am
Subject:PHP mysqlnd svn commit: r60 - in trunk/ext/mysqli: . mysqlnd tests/bench/framework
View as plain text  
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/frameworkahristov23 Feb