List:Commits« Previous MessageNext Message »
From:ahristov Date:June 15 2007 11:51am
Subject:PHP mysqlnd svn commit: r373 - trunk/mysqlnd
View as plain text  
Author: ahristov
Date: 2007-06-15 13:51:09 +0200 (Fri, 15 Jun 2007)
New Revision: 373

Added:
   trunk/mysqlnd/mysqlnd_enum_n_def.h
   trunk/mysqlnd/mysqlnd_result_meta.c
   trunk/mysqlnd/mysqlnd_result_meta.h
Modified:
   trunk/mysqlnd/mysqlnd.c
   trunk/mysqlnd/mysqlnd.h
   trunk/mysqlnd/mysqlnd_alloc.c
   trunk/mysqlnd/mysqlnd_charset.c
   trunk/mysqlnd/mysqlnd_charset.h
   trunk/mysqlnd/mysqlnd_palloc.c
   trunk/mysqlnd/mysqlnd_palloc.h
   trunk/mysqlnd/mysqlnd_priv.h
   trunk/mysqlnd/mysqlnd_ps.c
   trunk/mysqlnd/mysqlnd_ps_codec.c
   trunk/mysqlnd/mysqlnd_qcache.c
   trunk/mysqlnd/mysqlnd_result.c
   trunk/mysqlnd/mysqlnd_result.h
   trunk/mysqlnd/mysqlnd_statistics.c
   trunk/mysqlnd/mysqlnd_wireprotocol.h
   trunk/mysqlnd/portability.h
Log:
Moved metadata handling into separate file mysqlnd_result_meta.c

Added missing comments for vim. Moved some enum + defines to separate
file mysqlnd_enum_n_def.h


Modified: trunk/mysqlnd/mysqlnd.c
===================================================================
--- trunk/mysqlnd/mysqlnd.c	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd.c	2007-06-15 11:51:09 UTC (rev 373)
@@ -30,6 +30,8 @@
 
 #define MYSQLND_SILENT
 
+#define MYSQLND_AFFECTED_ROWS_ERROR (mynd_ulonglong)~0
+
 /* the server doesn't support 4byte utf8, but let's make it forward compatible */
 #define MYSQLND_MAX_ALLOWED_USER_LEN	256  /* 64 char * 4byte */
 #define MYSQLND_MAX_ALLOWED_DB_LEN		256  /* 64 char * 4byte */
@@ -46,11 +48,11 @@
 	as a prepared statement won't have anymore stmt->result != NULL, as it
 	is now, just to have where to store the metadata.
 
- - Change mysqlnd_simple_command to accept a heap dynamic array of MYSQLND_STRING
-   terminated by a string with ptr being NULL. Thus, multi-part messages can be
-   sent to the network like writev() and this can save at least for
-   mysqlnd_stmt_send_long_data() new malloc. This change will probably make the
-   code in few other places cleaner.
+  - Change mysqlnd_simple_command to accept a heap dynamic array of MYSQLND_STRING
+	terminated by a string with ptr being NULL. Thus, multi-part messages can be
+	sent to the network like writev() and this can save at least for
+	mysqlnd_stmt_send_long_data() new malloc. This change will probably make the
+	code in few other places cleaner.
 */
 
 extern MYSQLND_CHARSET *mysqlnd_charsets;
@@ -70,7 +72,7 @@
 {
 	if (mysqlnd_library_initted == FALSE) {
 		mysqlnd_library_initted = TRUE;
- 		_mysqlnd_init_ps_subsystem();
+		_mysqlnd_init_ps_subsystem();
 		mysqlnd_global_stats = calloc(1, sizeof(MYSQLND_STATS));
 #ifdef ZTS
 		mysqlnd_global_stats->LOCK_access = tsrm_mutex_alloc();
@@ -247,7 +249,7 @@
 					  safe to unconditionally turn off the flag here.
 					*/
 					conn->upsert_status.server_status &= ~SERVER_MORE_RESULTS_EXISTS;
-					conn->upsert_status.affected_rows = (mynd_ulonglong) ~0;
+					conn->upsert_status.affected_rows = MYSQLND_AFFECTED_ROWS_ERROR;
 				} else {
 					SET_NEW_MESSAGE(conn->last_message, conn->last_message_len,
 									ok_response.message, ok_response.message_len);
@@ -275,7 +277,7 @@
 				/* The server signalled error. Set the error */
 				SET_CLIENT_ERROR(conn->error_info, ok_response.error_no,
 								 ok_response.sqlstate, ok_response.error); 
-				conn->upsert_status.affected_rows = (mynd_ulonglong) ~0;
+				conn->upsert_status.affected_rows = MYSQLND_AFFECTED_ROWS_ERROR;
 			} else if (0xFE != ok_response.field_count) {
 				SET_CLIENT_ERROR(conn->error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE,
 								 "Malformed packet");
@@ -328,7 +330,7 @@
 
 	/* clean UPSERT info */
 	memset(&conn->upsert_status, 0, sizeof(conn->upsert_status));
-	conn->upsert_status.affected_rows = (mynd_ulonglong) ~0;
+	conn->upsert_status.affected_rows = MYSQLND_AFFECTED_ROWS_ERROR;
 	SET_EMPTY_ERROR(conn->error_info);
 
 	PACKET_INIT_ALLOCA(cmd_packet, PROT_CMD_PACKET);
@@ -519,11 +521,11 @@
 	auth_packet->password	= passwd;
 #if PHP_MAJOR_VERSION >= 6
 	if (UG(unicode)) {
-		auth_packet->charset_no	= 200;/* utf8 - swedish collation, check mysqlnd_charset.c
*/	
+		auth_packet->charset_no	= 200;/* utf8 - swedish collation, check mysqlnd_charset.c
*/
 	} else
 #endif
 	{
-		auth_packet->charset_no	= greet_packet.charset_no;	
+		auth_packet->charset_no	= greet_packet.charset_no;
 	}
 	auth_packet->db			= db;
 	auth_packet->db_len		= db_len;
@@ -632,7 +634,7 @@
 		*/
 		conn->m->dtor(conn TSRMLS_CC);
 	} else {
-		MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_FAILURE);	
+		MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_FAILURE);
 	}
 	return NULL;
 }
@@ -1013,9 +1015,9 @@
 
 /* {{{ mysqlnd_conn::get_server_info */
 static const char *
-MYSQLND_METHOD(mysqlnd_conn, get_server_info)(const MYSQLND * const self)
+MYSQLND_METHOD(mysqlnd_conn, get_server_info)(const MYSQLND * const conn)
 {
-	return self->server_version;
+	return conn->server_version;
 }
 /* }}} */
 
@@ -1052,9 +1054,9 @@
 MYSQLND_METHOD(mysqlnd_conn, get_server_version)(const MYSQLND * const conn)
 {
 	long major, minor, patch;
-	char *p = conn->server_version;
+	char *p;
 
-	if (!conn->server_version) {
+	if (!(p = conn->server_version)) {
 		return 0;
 	}
 
@@ -1354,7 +1356,7 @@
 	/* Nothing to store for UPSERT/LOAD DATA*/
 	if (conn->last_query_type != QUERY_SELECT || conn->state != CONN_FETCHING_DATA) {
 		SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE,
-						 mysqlnd_out_of_sync); 
+						 mysqlnd_out_of_sync);
 		return NULL;
 	}
 
@@ -1438,7 +1440,7 @@
 {
 	MYSQLND *ret = pecalloc(1, sizeof(MYSQLND), persistent);
 
-	ret->upsert_status.affected_rows = (mynd_ulonglong) ~0;
+	ret->upsert_status.affected_rows = MYSQLND_AFFECTED_ROWS_ERROR;
 	ret->persistent = persistent;
 
 	ret->m = & mysqlnd_mysqlnd_conn_methods;

Modified: trunk/mysqlnd/mysqlnd.h
===================================================================
--- trunk/mysqlnd/mysqlnd.h	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd.h	2007-06-15 11:51:09 UTC (rev 373)
@@ -23,7 +23,11 @@
 #ifndef MYSQLND_H
 #define MYSQLND_H
 
-/* This forces inlining some accessor functions */
+#define MYSQLND_VERSION "mysqlnd 5.0.2-dev - 070615 - $Revision$"
+#define MYSQLND_VERSION_ID 50002
+
+
+/* This forces inlining of some accessor functions */
 #define MYSQLND_USE_OPTIMISATIONS 1
 
 /* #define MYSQLND_STRING_TO_INT_CONVERSION */
@@ -40,228 +44,14 @@
 */
 #define MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND 1
 
-
 #include "portability.h"
 
 #ifdef ZTS
 #include "TSRM.h"
 #endif
 
-#define MYSQLND_VERSION "mysqlnd 5.0.1-beta - 070402 - $Revision$"
-#define MYSQLND_VERSION_ID 50001
+#include "mysqlnd_enum_n_def.h"
 
-
-#ifdef PHP_WIN32
-#define MYSQLND_LLU_SPEC "%I64u"
-#define MYSQLND_LL_SPEC "%I64d"
-#ifndef L64
-#define L64(x) x##i64
-#endif
-typedef unsigned __int64 my_uint64;
-typedef __int64 my_int64;
-typedef unsigned __int64 mynd_ulonglong;
-typedef __int64 mynd_longlong;
-#else
-#define MYSQLND_LLU_SPEC "%llu"
-#define MYSQLND_LL_SPEC "%lld"
-#ifndef L64
-#define L64(x) x##LL
-#endif
-typedef unsigned long long my_uint64;
-typedef long long my_int64;
-typedef unsigned long long mynd_ulonglong;
-typedef long long mynd_longlong;
-#endif
-
-
-#define MYSQLND_ERRMSG_SIZE			512
-#define MYSQLND_SQLSTATE_LENGTH		5
-#define MYSQLND_SQLSTATE_NULL		"00000"
-
-#define MYSQLND_SERVER_QUERY_NO_GOOD_INDEX_USED	16
-#define MYSQLND_SERVER_QUERY_NO_INDEX_USED		32
-
-#define MYSQLND_NO_DATA			100
-#define MYSQLND_DATA_TRUNCATED	101
-
-#define SHA1_MAX_LENGTH 20
-#define SCRAMBLE_LENGTH 20
-#define SCRAMBLE_LENGTH_323 8
-
-#define CLIENT_LONG_PASSWORD		1		/* new more secure passwords */
-#define CLIENT_FOUND_ROWS			2		/* Found instead of affected rows */
-#define CLIENT_LONG_FLAG			4		/* Get all column flags */
-#define CLIENT_CONNECT_WITH_DB		8		/* One can specify db on connect */
-#define CLIENT_NO_SCHEMA			16		/* Don't allow database.table.column */
-#define CLIENT_COMPRESS				32		/* Can use compression protocol */
-#define CLIENT_ODBC					64		/* Odbc client */
-#define CLIENT_LOCAL_FILES			128		/* Can use LOAD DATA LOCAL */
-#define CLIENT_IGNORE_SPACE			256		/* Ignore spaces before '(' */
-#define CLIENT_PROTOCOL_41			512		/* New 4.1 protocol */
-#define CLIENT_INTERACTIVE			1024	/* This is an interactive client */
-#define CLIENT_SSL					2048	/* Switch to SSL after handshake */
-#define CLIENT_IGNORE_SIGPIPE		4096	/* IGNORE sigpipes */
-#define CLIENT_TRANSACTIONS			8192	/* Client knows about transactions */
-#define CLIENT_RESERVED				16384	/* Old flag for 4.1 protocol */
-#define CLIENT_SECURE_CONNECTION	32768	/* New 4.1 authentication */
-#define CLIENT_MULTI_STATEMENTS		(1UL << 16) /* Enable/disable multi-stmt support
*/
-#define CLIENT_MULTI_RESULTS		(1UL << 17) /* Enable/disable multi-results */
-
-enum
-{
-	MYSQLND_FETCH_ASSOC = 1,
-	MYSQLND_FETCH_NUM = 2,
-	MYSQLND_FETCH_BOTH = 1|2,
-};
-
-/* Follow libmysql convention */
-typedef enum func_status
-{
-	PASS = 0,
-	FAIL = 1,
-} enum_func_status;
-
-typedef enum mysqlnd_query_type
-{
-	QUERY_UPSERT,
-	QUERY_SELECT,
-	QUERY_LOAD_LOCAL
-} enum_mysqlnd_query_type;
-
-typedef enum mysqlnd_res_type
-{
-	MYSQLND_RES_NORMAL = 1,
-	MYSQLND_RES_PS
-} enum_mysqlnd_res_type;
-
-typedef enum mysqlnd_option
-{
-	MYSQL_OPT_CONNECT_TIMEOUT,
-	MYSQL_OPT_COMPRESS,
-	MYSQL_OPT_NAMED_PIPE,
-	MYSQL_INIT_COMMAND,
-	MYSQL_READ_DEFAULT_FILE,
-	MYSQL_READ_DEFAULT_GROUP,
-	MYSQL_SET_CHARSET_DIR,
-	MYSQL_SET_CHARSET_NAME,
-	MYSQL_OPT_LOCAL_INFILE,
-	MYSQL_OPT_PROTOCOL,
-	MYSQL_SHARED_MEMORY_BASE_NAME,
-	MYSQL_OPT_READ_TIMEOUT,
-	MYSQL_OPT_WRITE_TIMEOUT,
-	MYSQL_OPT_USE_RESULT,
-	MYSQL_OPT_USE_REMOTE_CONNECTION,
-	MYSQL_OPT_USE_EMBEDDED_CONNECTION,
-	MYSQL_OPT_GUESS_CONNECTION,
-	MYSQL_SET_CLIENT_IP,
-	MYSQL_SECURE_AUTH,
-	MYSQL_REPORT_DATA_TRUNCATION,
-	MYSQL_OPT_RECONNECT,
-	MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
-	MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE = 200
-#ifdef MYSQLND_STRING_TO_INT_CONVERSION
-	,MYSQLND_OPT_INT_AND_YEAR_AS_INT = 201
-#endif
-} enum_mysqlnd_option;
-
-
-typedef enum mysqlnd_field_types
-{
-	MYSQL_TYPE_DECIMAL,
-	MYSQL_TYPE_TINY,
-	MYSQL_TYPE_SHORT,
-	MYSQL_TYPE_LONG,
-	MYSQL_TYPE_FLOAT,
-	MYSQL_TYPE_DOUBLE,
-	MYSQL_TYPE_NULL,
-	MYSQL_TYPE_TIMESTAMP,
-	MYSQL_TYPE_LONGLONG,
-	MYSQL_TYPE_INT24,
-	MYSQL_TYPE_DATE,
-	MYSQL_TYPE_TIME,
-	MYSQL_TYPE_DATETIME,
-	MYSQL_TYPE_YEAR,
-	MYSQL_TYPE_NEWDATE,
-	MYSQL_TYPE_VARCHAR,
-	MYSQL_TYPE_BIT,
-	MYSQL_TYPE_NEWDECIMAL=246,
-	MYSQL_TYPE_ENUM=247,
-	MYSQL_TYPE_SET=248,
-	MYSQL_TYPE_TINY_BLOB=249,
-	MYSQL_TYPE_MEDIUM_BLOB=250,
-	MYSQL_TYPE_LONG_BLOB=251,
-	MYSQL_TYPE_BLOB=252,
-	MYSQL_TYPE_VAR_STRING=253,
-	MYSQL_TYPE_STRING=254,
-	MYSQL_TYPE_GEOMETRY=255
-} enum_mysqlnd_field_types;
-
-/* Please update this if there is a new type after MYSQL_TYPE_GEOMETRY */
-#define MYSQL_TYPE_LAST		MYSQL_TYPE_GEOMETRY
-
-
-typedef enum mysqlnd_server_option
-{
-	MYSQL_OPTION_MULTI_STATEMENTS_ON,
-	MYSQL_OPTION_MULTI_STATEMENTS_OFF
-} enum_mysqlnd_server_option;
-
-
-#define FIELD_TYPE_DECIMAL		MYSQL_TYPE_DECIMAL
-#define FIELD_TYPE_NEWDECIMAL	MYSQL_TYPE_NEWDECIMAL
-#define FIELD_TYPE_TINY			MYSQL_TYPE_TINY
-#define FIELD_TYPE_SHORT		MYSQL_TYPE_SHORT
-#define FIELD_TYPE_LONG			MYSQL_TYPE_LONG
-#define FIELD_TYPE_FLOAT		MYSQL_TYPE_FLOAT
-#define FIELD_TYPE_DOUBLE		MYSQL_TYPE_DOUBLE
-#define FIELD_TYPE_NULL			MYSQL_TYPE_NULL
-#define FIELD_TYPE_TIMESTAMP	MYSQL_TYPE_TIMESTAMP
-#define FIELD_TYPE_LONGLONG		MYSQL_TYPE_LONGLONG
-#define FIELD_TYPE_INT24		MYSQL_TYPE_INT24
-#define FIELD_TYPE_DATE			MYSQL_TYPE_DATE
-#define FIELD_TYPE_TIME			MYSQL_TYPE_TIME
-#define FIELD_TYPE_DATETIME		MYSQL_TYPE_DATETIME
-#define FIELD_TYPE_YEAR			MYSQL_TYPE_YEAR
-#define FIELD_TYPE_NEWDATE		MYSQL_TYPE_NEWDATE
-#define FIELD_TYPE_ENUM			MYSQL_TYPE_ENUM
-#define FIELD_TYPE_SET			MYSQL_TYPE_SET
-#define FIELD_TYPE_TINY_BLOB	MYSQL_TYPE_TINY_BLOB
-#define FIELD_TYPE_MEDIUM_BLOB	MYSQL_TYPE_MEDIUM_BLOB
-#define FIELD_TYPE_LONG_BLOB	MYSQL_TYPE_LONG_BLOB
-#define FIELD_TYPE_BLOB			MYSQL_TYPE_BLOB
-#define FIELD_TYPE_VAR_STRING	MYSQL_TYPE_VAR_STRING
-#define FIELD_TYPE_STRING		MYSQL_TYPE_STRING
-#define FIELD_TYPE_CHAR			MYSQL_TYPE_TINY
-#define FIELD_TYPE_INTERVAL		MYSQL_TYPE_ENUM
-#define FIELD_TYPE_GEOMETRY		MYSQL_TYPE_GEOMETRY
-#define FIELD_TYPE_BIT			MYSQL_TYPE_BIT
-
-#define NOT_NULL_FLAG			    1
-#define PRI_KEY_FLAG			    2
-#define UNIQUE_KEY_FLAG			    4
-#define MULTIPLE_KEY_FLAG		    8
-#define BLOB_FLAG				   16
-#define UNSIGNED_FLAG			   32
-#define ZEROFILL_FLAG			   64
-#define BINARY_FLAG				  128
-#define ENUM_FLAG				  256
-#define AUTO_INCREMENT_FLAG		  512
-#define TIMESTAMP_FLAG			 1024
-#define SET_FLAG				 2048
-#define NO_DEFAULT_VALUE_FLAG	 4096
-#define PART_KEY_FLAG			16384
-#define GROUP_FLAG				32768
-#define NUM_FLAG				32768
-
-#define IS_PRI_KEY(n)	((n) & PRI_KEY_FLAG)
-#define IS_NOT_NULL(n)	((n) & NOT_NULL_FLAG)
-#define IS_BLOB(n)		((n) & BLOB_FLAG)
-#define IS_NUM(t)		((t) <= FIELD_TYPE_INT24 || (t) == FIELD_TYPE_YEAR || (t) ==
FIELD_TYPE_NEWDECIMAL)
-
-
-/* see mysqlnd_charset.c for more information */
-#define MYSQLND_BINARY_CHARSET_NR	63
-
 /*
           /-----> CONN_CLOSE  <---------------\
          |           ^                         \
@@ -290,10 +80,12 @@
 	MYSQLND_STMT_USER_FETCHING, /* fetch_row_buff or fetch_row_unbuf */
 } enum_mysqlnd_stmt_state;
 
+
 typedef enum param_bind_flags {
 	MYSQLND_PARAM_BIND_BLOB_USED = 1
 } enum_param_bind_flags;
 
+
 /* PS */
 enum mysqlnd_stmt_attr
 {
@@ -404,9 +196,9 @@
 } mysqlnd_error_info;
 
 
-typedef struct st_mysqlnd_zval_pcache	MYSQLND_ZVAL_PCACHE;
+typedef struct st_mysqlnd_zval_pcache			MYSQLND_ZVAL_PCACHE;
 typedef struct st_mysqlnd_thread_zval_pcache	MYSQLND_THD_ZVAL_PCACHE;
-typedef struct st_mysqlnd_qcache		MYSQLND_QCACHE;
+typedef struct st_mysqlnd_qcache				MYSQLND_QCACHE;
 
 
 typedef struct st_mysqlnd_infile_info {
@@ -589,11 +381,17 @@
 	MYSQLND_FIELD *		(*fetch_field)(MYSQLND_RES * const result);
 	MYSQLND_FIELD *		(*fetch_field_direct)(const MYSQLND_RES * const result,
MYSQLND_FIELD_OFFSET fieldnr);
 
+	enum_func_status	(*read_result_metadata)(MYSQLND_RES *result, MYSQLND *conn TSRMLS_DC);
 	unsigned long *		(*fetch_lengths)(MYSQLND_RES * const result);
 	void				(*free_result_buffers)(MYSQLND_RES * result TSRMLS_DC);	/* private */
 	enum_func_status	(*free_result)(MYSQLND_RES * result, zend_bool implicit TSRMLS_DC);
+};
 
-	MYSQLND_RES_METADATA * (*clone_metadata)(const MYSQLND_RES_METADATA * const meta,
zend_bool persistent);/* private */
+
+struct st_mysqlnd_res_meta_methods {
+	enum_func_status		(*read_metadata)(MYSQLND_RES_METADATA * const meta, MYSQLND *conn
TSRMLS_DC);
+	MYSQLND_RES_METADATA *	(*clone_metadata)(const MYSQLND_RES_METADATA * const meta,
zend_bool persistent);
+	void					(*free_metadata)(MYSQLND_RES_METADATA *meta, zend_bool persistent TSRMLS_DC);
 };
 
 
@@ -724,6 +522,8 @@
 	struct mysqlnd_field_hash_key	*zend_hash_keys;
 	unsigned int					current_field;
 	unsigned int					field_count;
+
+	struct st_mysqlnd_res_meta_methods *m;
 };
 
 
@@ -752,7 +552,6 @@
 };
 
 
-
 struct st_mysqlnd_res {
 	MYSQLND					*conn;
 	enum_mysqlnd_res_type	type;
@@ -854,6 +653,7 @@
 						  unsigned int mysql_flags,
 						  MYSQLND_THD_ZVAL_PCACHE *zval_cache
 						  TSRMLS_DC);
+
 #define mysqlnd_change_user(conn, user, passwd, db)		(conn)->m->change_user((conn),
(user), (passwd), (db) TSRMLS_CC)
 
 

Modified: trunk/mysqlnd/mysqlnd_alloc.c
===================================================================
--- trunk/mysqlnd/mysqlnd_alloc.c	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_alloc.c	2007-06-15 11:51:09 UTC (rev 373)
@@ -274,3 +274,12 @@
 	}
 	*cache = NULL;
 }
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/mysqlnd_charset.c
===================================================================
--- trunk/mysqlnd/mysqlnd_charset.c	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_charset.c	2007-06-15 11:51:09 UTC (rev 373)
@@ -593,3 +593,12 @@
 	return (ulong)(newstr - newstr_s);
 }
 /* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/mysqlnd_charset.h
===================================================================
--- trunk/mysqlnd/mysqlnd_charset.h	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_charset.h	2007-06-15 11:51:09 UTC (rev 373)
@@ -22,3 +22,13 @@
 
 ulong mysqlnd_cset_escape_quotes(const MYSQLND_CHARSET * const charset, char *newstr,
const char *escapestr, int escapestr_len);
 ulong mysqlnd_cset_escape_slashes(const MYSQLND_CHARSET * const cset, char *newstr, const
char *escapestr, int escapestr_len);
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Added: trunk/mysqlnd/mysqlnd_enum_n_def.h
===================================================================
--- trunk/mysqlnd/mysqlnd_enum_n_def.h	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_enum_n_def.h	2007-06-15 11:51:09 UTC (rev 373)
@@ -0,0 +1,224 @@
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 6                                                        |
+  +----------------------------------------------------------------------+
+  | 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        |
+  | available through the world-wide-web at the following url:           |
+  | http://www.php.net/license/3_01.txt                                  |
+  | If you did not receive a copy of the PHP license and are unable to   |
+  | obtain it through the world-wide-web, please send a note to          |
+  | license@stripped so we can mail you a copy immediately.               |
+  +----------------------------------------------------------------------+
+  | Authors: Georg Richter <georg@stripped>                             |
+  |          Andrey Hristov <andrey@stripped>                           |
+  |          Ulf Wendel <uwendel@stripped>                              |
+  +----------------------------------------------------------------------+
+*/
+
+/* $Id: header,v 1.17 2006/01/01 13:09:48 sniper Exp $ */
+#ifndef MYSQLND_ENUM_N_DEF_H
+#define MYSQLND_ENUM_N_DEF_H
+
+
+#define MYSQLND_ERRMSG_SIZE			512
+#define MYSQLND_SQLSTATE_LENGTH		5
+#define MYSQLND_SQLSTATE_NULL		"00000"
+
+#define MYSQLND_SERVER_QUERY_NO_GOOD_INDEX_USED	16
+#define MYSQLND_SERVER_QUERY_NO_INDEX_USED		32
+
+#define MYSQLND_NO_DATA			100
+#define MYSQLND_DATA_TRUNCATED	101
+
+#define SHA1_MAX_LENGTH 20
+#define SCRAMBLE_LENGTH 20
+#define SCRAMBLE_LENGTH_323 8
+
+#define CLIENT_LONG_PASSWORD		1		/* new more secure passwords */
+#define CLIENT_FOUND_ROWS			2		/* Found instead of affected rows */
+#define CLIENT_LONG_FLAG			4		/* Get all column flags */
+#define CLIENT_CONNECT_WITH_DB		8		/* One can specify db on connect */
+#define CLIENT_NO_SCHEMA			16		/* Don't allow database.table.column */
+#define CLIENT_COMPRESS				32		/* Can use compression protocol */
+#define CLIENT_ODBC					64		/* Odbc client */
+#define CLIENT_LOCAL_FILES			128		/* Can use LOAD DATA LOCAL */
+#define CLIENT_IGNORE_SPACE			256		/* Ignore spaces before '(' */
+#define CLIENT_PROTOCOL_41			512		/* New 4.1 protocol */
+#define CLIENT_INTERACTIVE			1024	/* This is an interactive client */
+#define CLIENT_SSL					2048	/* Switch to SSL after handshake */
+#define CLIENT_IGNORE_SIGPIPE		4096	/* IGNORE sigpipes */
+#define CLIENT_TRANSACTIONS			8192	/* Client knows about transactions */
+#define CLIENT_RESERVED				16384	/* Old flag for 4.1 protocol */
+#define CLIENT_SECURE_CONNECTION	32768	/* New 4.1 authentication */
+#define CLIENT_MULTI_STATEMENTS		(1UL << 16) /* Enable/disable multi-stmt support
*/
+#define CLIENT_MULTI_RESULTS		(1UL << 17) /* Enable/disable multi-results */
+
+enum
+{
+	MYSQLND_FETCH_ASSOC = 1,
+	MYSQLND_FETCH_NUM = 2,
+	MYSQLND_FETCH_BOTH = 1|2,
+};
+
+/* Follow libmysql convention */
+typedef enum func_status
+{
+	PASS = 0,
+	FAIL = 1,
+} enum_func_status;
+
+typedef enum mysqlnd_query_type
+{
+	QUERY_UPSERT,
+	QUERY_SELECT,
+	QUERY_LOAD_LOCAL
+} enum_mysqlnd_query_type;
+
+typedef enum mysqlnd_res_type
+{
+	MYSQLND_RES_NORMAL = 1,
+	MYSQLND_RES_PS
+} enum_mysqlnd_res_type;
+
+typedef enum mysqlnd_option
+{
+	MYSQL_OPT_CONNECT_TIMEOUT,
+	MYSQL_OPT_COMPRESS,
+	MYSQL_OPT_NAMED_PIPE,
+	MYSQL_INIT_COMMAND,
+	MYSQL_READ_DEFAULT_FILE,
+	MYSQL_READ_DEFAULT_GROUP,
+	MYSQL_SET_CHARSET_DIR,
+	MYSQL_SET_CHARSET_NAME,
+	MYSQL_OPT_LOCAL_INFILE,
+	MYSQL_OPT_PROTOCOL,
+	MYSQL_SHARED_MEMORY_BASE_NAME,
+	MYSQL_OPT_READ_TIMEOUT,
+	MYSQL_OPT_WRITE_TIMEOUT,
+	MYSQL_OPT_USE_RESULT,
+	MYSQL_OPT_USE_REMOTE_CONNECTION,
+	MYSQL_OPT_USE_EMBEDDED_CONNECTION,
+	MYSQL_OPT_GUESS_CONNECTION,
+	MYSQL_SET_CLIENT_IP,
+	MYSQL_SECURE_AUTH,
+	MYSQL_REPORT_DATA_TRUNCATION,
+	MYSQL_OPT_RECONNECT,
+	MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
+	MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE = 200
+#ifdef MYSQLND_STRING_TO_INT_CONVERSION
+	,MYSQLND_OPT_INT_AND_YEAR_AS_INT = 201
+#endif
+} enum_mysqlnd_option;
+
+
+typedef enum mysqlnd_field_types
+{
+	MYSQL_TYPE_DECIMAL,
+	MYSQL_TYPE_TINY,
+	MYSQL_TYPE_SHORT,
+	MYSQL_TYPE_LONG,
+	MYSQL_TYPE_FLOAT,
+	MYSQL_TYPE_DOUBLE,
+	MYSQL_TYPE_NULL,
+	MYSQL_TYPE_TIMESTAMP,
+	MYSQL_TYPE_LONGLONG,
+	MYSQL_TYPE_INT24,
+	MYSQL_TYPE_DATE,
+	MYSQL_TYPE_TIME,
+	MYSQL_TYPE_DATETIME,
+	MYSQL_TYPE_YEAR,
+	MYSQL_TYPE_NEWDATE,
+	MYSQL_TYPE_VARCHAR,
+	MYSQL_TYPE_BIT,
+	MYSQL_TYPE_NEWDECIMAL=246,
+	MYSQL_TYPE_ENUM=247,
+	MYSQL_TYPE_SET=248,
+	MYSQL_TYPE_TINY_BLOB=249,
+	MYSQL_TYPE_MEDIUM_BLOB=250,
+	MYSQL_TYPE_LONG_BLOB=251,
+	MYSQL_TYPE_BLOB=252,
+	MYSQL_TYPE_VAR_STRING=253,
+	MYSQL_TYPE_STRING=254,
+	MYSQL_TYPE_GEOMETRY=255
+} enum_mysqlnd_field_types;
+
+/* Please update this if there is a new type after MYSQL_TYPE_GEOMETRY */
+#define MYSQL_TYPE_LAST		MYSQL_TYPE_GEOMETRY
+
+
+typedef enum mysqlnd_server_option
+{
+	MYSQL_OPTION_MULTI_STATEMENTS_ON,
+	MYSQL_OPTION_MULTI_STATEMENTS_OFF
+} enum_mysqlnd_server_option;
+
+
+#define FIELD_TYPE_DECIMAL		MYSQL_TYPE_DECIMAL
+#define FIELD_TYPE_NEWDECIMAL	MYSQL_TYPE_NEWDECIMAL
+#define FIELD_TYPE_TINY			MYSQL_TYPE_TINY
+#define FIELD_TYPE_SHORT		MYSQL_TYPE_SHORT
+#define FIELD_TYPE_LONG			MYSQL_TYPE_LONG
+#define FIELD_TYPE_FLOAT		MYSQL_TYPE_FLOAT
+#define FIELD_TYPE_DOUBLE		MYSQL_TYPE_DOUBLE
+#define FIELD_TYPE_NULL			MYSQL_TYPE_NULL
+#define FIELD_TYPE_TIMESTAMP	MYSQL_TYPE_TIMESTAMP
+#define FIELD_TYPE_LONGLONG		MYSQL_TYPE_LONGLONG
+#define FIELD_TYPE_INT24		MYSQL_TYPE_INT24
+#define FIELD_TYPE_DATE			MYSQL_TYPE_DATE
+#define FIELD_TYPE_TIME			MYSQL_TYPE_TIME
+#define FIELD_TYPE_DATETIME		MYSQL_TYPE_DATETIME
+#define FIELD_TYPE_YEAR			MYSQL_TYPE_YEAR
+#define FIELD_TYPE_NEWDATE		MYSQL_TYPE_NEWDATE
+#define FIELD_TYPE_ENUM			MYSQL_TYPE_ENUM
+#define FIELD_TYPE_SET			MYSQL_TYPE_SET
+#define FIELD_TYPE_TINY_BLOB	MYSQL_TYPE_TINY_BLOB
+#define FIELD_TYPE_MEDIUM_BLOB	MYSQL_TYPE_MEDIUM_BLOB
+#define FIELD_TYPE_LONG_BLOB	MYSQL_TYPE_LONG_BLOB
+#define FIELD_TYPE_BLOB			MYSQL_TYPE_BLOB
+#define FIELD_TYPE_VAR_STRING	MYSQL_TYPE_VAR_STRING
+#define FIELD_TYPE_STRING		MYSQL_TYPE_STRING
+#define FIELD_TYPE_CHAR			MYSQL_TYPE_TINY
+#define FIELD_TYPE_INTERVAL		MYSQL_TYPE_ENUM
+#define FIELD_TYPE_GEOMETRY		MYSQL_TYPE_GEOMETRY
+#define FIELD_TYPE_BIT			MYSQL_TYPE_BIT
+
+#define NOT_NULL_FLAG			    1
+#define PRI_KEY_FLAG			    2
+#define UNIQUE_KEY_FLAG			    4
+#define MULTIPLE_KEY_FLAG		    8
+#define BLOB_FLAG				   16
+#define UNSIGNED_FLAG			   32
+#define ZEROFILL_FLAG			   64
+#define BINARY_FLAG				  128
+#define ENUM_FLAG				  256
+#define AUTO_INCREMENT_FLAG		  512
+#define TIMESTAMP_FLAG			 1024
+#define SET_FLAG				 2048
+#define NO_DEFAULT_VALUE_FLAG	 4096
+#define PART_KEY_FLAG			16384
+#define GROUP_FLAG				32768
+#define NUM_FLAG				32768
+
+#define IS_PRI_KEY(n)	((n) & PRI_KEY_FLAG)
+#define IS_NOT_NULL(n)	((n) & NOT_NULL_FLAG)
+#define IS_BLOB(n)		((n) & BLOB_FLAG)
+#define IS_NUM(t)		((t) <= FIELD_TYPE_INT24 || (t) == FIELD_TYPE_YEAR || (t) ==
FIELD_TYPE_NEWDECIMAL)
+
+
+/* see mysqlnd_charset.c for more information */
+#define MYSQLND_BINARY_CHARSET_NR	63
+
+#endif	/* MYSQLND_ENUM_N_DEF_H */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/mysqlnd_palloc.c
===================================================================
--- trunk/mysqlnd/mysqlnd_palloc.c	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_palloc.c	2007-06-15 11:51:09 UTC (rev 373)
@@ -560,3 +560,12 @@
 	}
 }
 /* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/mysqlnd_palloc.h
===================================================================
--- trunk/mysqlnd/mysqlnd_palloc.h	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_palloc.h	2007-06-15 11:51:09 UTC (rev 373)
@@ -98,3 +98,12 @@
 };
 
 #endif /* MYSQLND_PALLOC_H */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/mysqlnd_priv.h
===================================================================
--- trunk/mysqlnd/mysqlnd_priv.h	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_priv.h	2007-06-15 11:51:09 UTC (rev 373)
@@ -64,22 +64,22 @@
 
 
 
-#define SERVER_STATUS_IN_TRANS     1	/* Transaction has started */
-#define SERVER_STATUS_AUTOCOMMIT   2	/* Server in auto_commit mode */
-#define SERVER_MORE_RESULTS_EXISTS 8    /* Multi query - next query exists */
+#define SERVER_STATUS_IN_TRANS				1	/* Transaction has started */
+#define SERVER_STATUS_AUTOCOMMIT			2	/* Server in auto_commit mode */
+#define SERVER_MORE_RESULTS_EXISTS			8	/* Multi query - next query exists */
 /*
   The server was able to fulfill the clients request and opened a
   read-only non-scrollable cursor for a query. This flag comes
   in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands.
 */
-#define SERVER_STATUS_CURSOR_EXISTS 64
+#define SERVER_STATUS_CURSOR_EXISTS			64
 /*
   This flag is sent when a read-only cursor is exhausted, in reply to
   COM_STMT_FETCH command.
 */
-#define SERVER_STATUS_LAST_ROW_SENT 128
-#define SERVER_STATUS_DB_DROPPED        256 /* A database was dropped */
-#define SERVER_STATUS_NO_BACKSLASH_ESCAPES 512
+#define SERVER_STATUS_LAST_ROW_SENT			128
+#define SERVER_STATUS_DB_DROPPED			256 /* A database was dropped */
+#define SERVER_STATUS_NO_BACKSLASH_ESCAPES	512
 
 
 
@@ -89,9 +89,9 @@
 #define CR_SERVER_GONE_ERROR	2006
 #define CR_OUT_OF_MEMORY		2008
 #define CR_SERVER_LOST			2013
-#define CR_COMMANDS_OUT_OF_SYNC 2014
+#define CR_COMMANDS_OUT_OF_SYNC	2014
 #define CR_CANT_FIND_CHARSET	2019
-#define CR_MALFORMED_PACKET     2027
+#define CR_MALFORMED_PACKET		2027
 #define CR_NOT_IMPLEMENTED		2054
 #define CR_NO_PREPARE_STMT		2030
 #define CR_PARAMS_NOT_BOUND		2031
@@ -153,8 +153,6 @@
 
 extern struct st_mysqlnd_perm_bind mysqlnd_ps_fetch_functions[MYSQL_TYPE_LAST + 1];
 
-
-
 extern const char * mysqlnd_out_of_sync;
 
 

Modified: trunk/mysqlnd/mysqlnd_ps.c
===================================================================
--- trunk/mysqlnd/mysqlnd_ps.c	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_ps.c	2007-06-15 11:51:09 UTC (rev 373)
@@ -24,6 +24,7 @@
 #include "mysqlnd_wireprotocol.h"
 #include "mysqlnd_priv.h"
 #include "mysqlnd_result.h"
+#include "mysqlnd_result_meta.h"
 #include "mysqlnd_statistics.h"
 
 
@@ -264,7 +265,7 @@
 
 		result->type = MYSQLND_RES_PS;
 
-		if (FAIL == mysqlnd_read_result_metadata(stmt_to_prepare->conn, result TSRMLS_CC) ||
+		if (FAIL == result->m.read_result_metadata(result, stmt_to_prepare->conn
TSRMLS_CC) ||
 			FAIL == mysqlnd_stmt_prepare_read_eof(stmt_to_prepare TSRMLS_CC)) {
 			goto fail;
 		}
@@ -1171,7 +1172,7 @@
 	result->m.fetch_row = result->m.fetch_row_normal_unbuffered;
 	result->unbuf = ecalloc(1, sizeof(MYSQLND_RES_UNBUFFERED));
 	result->unbuf->eof_reached = TRUE;
-	result->meta = stmt->result->m.clone_metadata(stmt->result->meta, FALSE);
+	result->meta =
stmt->result->meta->m->clone_metadata(stmt->result->meta, FALSE);
 
 	return result;
 }
@@ -1546,3 +1547,12 @@
 	return stmt;
 }
 /* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/mysqlnd_ps_codec.c
===================================================================
--- trunk/mysqlnd/mysqlnd_ps_codec.c	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_ps_codec.c	2007-06-15 11:51:09 UTC (rev 373)
@@ -753,3 +753,12 @@
 	return cmd_buffer;
 }
 /* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/mysqlnd_qcache.c
===================================================================
--- trunk/mysqlnd/mysqlnd_qcache.c	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_qcache.c	2007-06-15 11:51:09 UTC (rev 373)
@@ -131,3 +131,11 @@
 }
 /* }}} */
 
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/mysqlnd_result.c
===================================================================
--- trunk/mysqlnd/mysqlnd_result.c	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_result.c	2007-06-15 11:51:09 UTC (rev 373)
@@ -24,6 +24,7 @@
 #include "mysqlnd_wireprotocol.h"
 #include "mysqlnd_priv.h"
 #include "mysqlnd_result.h"
+#include "mysqlnd_result_meta.h"
 #include "mysqlnd_statistics.h"
 #include "mysqlnd_charset.h"
 #include "ext/standard/basic_functions.h"
@@ -31,24 +32,6 @@
 #define MYSQLND_SILENT
 
 
-/* {{{ php_mysqlnd_free_field_metadata */
-static
-void php_mysqlnd_free_field_metadata(MYSQLND_FIELD *meta, zend_bool persistent)
-{
-	if (meta) {
-		if (meta->root) {
-			pefree(meta->root, persistent);
-			meta->root = NULL;
-		}
-		if (meta->def) {
-			pefree(meta->def, persistent);
-			meta->def = NULL;
-		}
-	}
-}
-/* }}} */
-
-
 /* {{{ mysqlnd_unbuffered_free_last_data */
 void mysqlnd_unbuffered_free_last_data(MYSQLND_RES *result TSRMLS_DC)
 {
@@ -151,40 +134,8 @@
 /* }}} */
 
 
-/* {{{ mysqlnd_internal_free_result_metadata */
-static
-void mysqlnd_internal_free_result_metadata(MYSQLND_RES_METADATA *meta, zend_bool
persistent TSRMLS_DC)
-{
-	int i;
-	MYSQLND_FIELD *fields;
 
-	if ((fields = meta->fields)) {
-		i = meta->field_count;
-		while (i--) {
-			php_mysqlnd_free_field_metadata(fields++, persistent);
-		}
-		pefree(meta->fields, persistent);
-		meta->fields = NULL;
-	}
 
-	if (meta->zend_hash_keys) {
-#if PHP_MAJOR_VERSION >= 6
-		if (UG(unicode)) {
-			for (i = 0; i < meta->field_count; i++) {
-				if (meta->zend_hash_keys[i].ustr.v) {
-					pefree(meta->zend_hash_keys[i].ustr.v, persistent);
-				}
-			}
-		}
-#endif
-		pefree(meta->zend_hash_keys, persistent);
-		meta->zend_hash_keys = NULL;
-	}
-	pefree(meta, persistent);
-}
-/* }}} */
-
-
 /* {{{ mysqlnd_internal_free_result_contents */
 void mysqlnd_internal_free_result_contents(MYSQLND_RES *result TSRMLS_DC)
 {
@@ -203,7 +154,7 @@
 	result->conn = NULL;
 
 	if (result->meta) {
-		mysqlnd_internal_free_result_metadata(result->meta, FALSE TSRMLS_CC);
+		result->meta->m->free_metadata(result->meta, FALSE TSRMLS_CC);
 		result->meta = NULL;
 	}
 
@@ -234,103 +185,9 @@
 /* }}} */
 
 
-/* {{{ mysqlnd_handle_numeric */
-/*
-  The following code is stolen from ZE - HANDLE_NUMERIC() macro from zend_hash.c
-  and modified for the needs of mysqlnd.
-*/
-static
-zend_bool mysqlnd_is_key_numeric(char *key, size_t length, long *idx)
+static enum_func_status
+MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQLND_RES *result, MYSQLND *conn
TSRMLS_DC)
 {
-	register char *tmp=key;
-
-	if (*tmp=='-') {
-		tmp++;
-	}
-	if ((*tmp>='0' && *tmp<='9')) {
-		do { /* possibly a numeric index */
-			char *end=key+length-1;
-
-			if (*tmp++=='0' && length>2) { /* don't accept numbers with leading zeros
*/
-				break;
-			}
-			while (tmp<end) {
-				if (!(*tmp>='0' && *tmp<='9')) {
-					break;
-				}
-				tmp++;
-			}
-			if (tmp==end && *tmp=='\0') { /* a numeric index */
-				if (*key=='-') {
-					*idx = strtol(key, NULL, 10);
-					if (*idx!=LONG_MIN) {
-						return TRUE;
-					}
-				} else {
-					*idx = strtol(key, NULL, 10);
-					if (*idx!=LONG_MAX) {
-						return TRUE;
-					}
-				}
-			}
-		} while (0);
-	}
-	return FALSE;
-}
-/* }}} */
-
-
-#if PHP_MAJOR_VERSION >= 6
-/* {{{ mysqlnd_unicode_is_key_numeric */
-static
-zend_bool mysqlnd_unicode_is_key_numeric(UChar *key, size_t length, long *idx)
-{
-	register UChar *tmp=key;
-
-	if (*tmp==0x2D /*'-'*/) {
-		tmp++;
-	}
-	if ((*tmp>=0x30 /*'0'*/ && *tmp<=0x39 /*'9'*/)) { /* possibly a numeric
index */
-		do {
-			UChar *end=key+length-1;
-
-			if (*tmp++==0x30 && length>2) { /* don't accept numbers with leading zeros
*/
-				break;
-			}
-			while (tmp<end) {
-				if (!(*tmp>=0x30 /*'0'*/ && *tmp<=0x39 /*'9'*/)) {
-					break;
-				}
-				tmp++;
-			}
-			if (tmp==end && *tmp==0) { /* a numeric index */
-				if (*key==0x2D /*'-'*/) {
-					*idx = zend_u_strtol(key, NULL, 10);
-					if (*idx!=LONG_MIN) {
-						return TRUE;
-					}
-				} else {
-					*idx = zend_u_strtol(key, NULL, 10);
-					if (*idx!=LONG_MAX) {
-						return TRUE;
-					}
-				}
-			}
-		} while (0);
-	}
-	return FALSE;
-}
-/* }}} */
-#endif
-
-
-/* {{{ mysqlnd_read_result_metadata */
-enum_func_status
-mysqlnd_read_result_metadata(MYSQLND *conn, MYSQLND_RES *result TSRMLS_DC)
-{
-	int i = 0;
-	php_mysql_packet_res_field field_packet;
-
 	/*
 	  Make it safe to call it repeatedly for PS -
 	  better free and allocate a new because the number of field might change 
@@ -338,83 +195,19 @@
 	  infrastructure.
 	*/
 	if (result->meta) {
-		mysqlnd_internal_free_result_metadata(result->meta, FALSE TSRMLS_CC);
+		result->meta->m->free_metadata(result->meta, FALSE TSRMLS_CC);
 		result->meta = NULL;
 	}
 
-	/* +1 is to have empty marker at the end */
-	result->meta = ecalloc(1, sizeof(MYSQLND_RES_METADATA));
-	result->meta->field_count = result->field_count;
-	result->meta->fields = ecalloc(result->field_count + 1, sizeof(MYSQLND_FIELD));
-	result->meta->zend_hash_keys = ecalloc(result->field_count,
-									 		sizeof(struct mysqlnd_field_hash_key));
+	result->meta = mysqlnd_result_meta_init(result->field_count);
 
 	/* 1. Read all fields metadata */
 
 	/* It's safe to reread without freeing */
-	PACKET_INIT_ALLOCA(field_packet, PROT_RSET_FLD_PACKET);
-	for (;i < result->field_count; i++) {
-		long idx;
-
-		if (result->meta->fields[i].root) {
-			/* We re-read metadata for PS */
-			efree(result->meta->fields[i].root);
-			result->meta->fields[i].root = NULL;
-		}
-
-		field_packet.metadata = &(result->meta->fields[i]);
-		if (FAIL == PACKET_READ_ALLOCA(field_packet, conn)) {
-			PACKET_FREE_ALLOCA(field_packet);
-			goto error;
-		}
-
-		if (mysqlnd_ps_fetch_functions[result->meta->fields[i].type].func == NULL) {
-			SET_CLIENT_ERROR(result->conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE,
-							 "Uknown field type sent by the server"); 
-			php_error_docref(NULL TSRMLS_CC, E_WARNING,
-							 "Unknown type %d sent by the server. "
-							 "Please send a report to the developers",
-							 result->meta->fields[i].type);
-			goto error;
-		}
-
-
-#if PHP_MAJOR_VERSION >= 6
-		if (UG(unicode)) {
-			UChar *ustr;
-			int ulen;
-			zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen,
-								   result->meta->fields[i].name,
-								   result->meta->fields[i].name_length TSRMLS_CC);
-			if ((result->meta->zend_hash_keys[i].is_numeric =
-				 			mysqlnd_unicode_is_key_numeric(ustr, ulen + 1, &idx)))
-			{
-				result->meta->zend_hash_keys[i].key = idx;
-				efree(ustr);
-			} else {
-				result->meta->zend_hash_keys[i].ustr.u = ustr;
-				result->meta->zend_hash_keys[i].ulen = ulen;
-				result->meta->zend_hash_keys[i].key = zend_u_get_hash_value(IS_UNICODE,
ZSTR(ustr), ulen + 1);
-			}
-
-		} else 
-#endif
-		{
-			/* For BC we have to check whether the key is numeric and use it like this */
-			if ((result->meta->zend_hash_keys[i].is_numeric =
-						mysqlnd_is_key_numeric(field_packet.metadata->name,
-									   		   field_packet.metadata->name_length + 1,
-											   &idx)))
-			{
-				result->meta->zend_hash_keys[i].key = idx;
-			} else {
-				result->meta->zend_hash_keys[i].key =
-						zend_get_hash_value(field_packet.metadata->name,
-											field_packet.metadata->name_length + 1);
-			}
-		}
+	if (FAIL == result->meta->m->read_metadata(result->meta, conn TSRMLS_CC)) {
+		mysqlnd_internal_free_result_contents(result TSRMLS_CC);
+		return FAIL;
 	}
-	PACKET_FREE_ALLOCA(field_packet);
 
 	/*
 	  2. Follows an EOF packet, which the client of mysqlnd_read_result_metadata()
@@ -424,11 +217,7 @@
 	*/
 
 	return PASS;
-error:
-	mysqlnd_internal_free_result_contents(result TSRMLS_CC);
-	return FAIL;
 }
-/* }}} */
 
 
 /* {{{ mysqlnd_query_read_result_set_header */
@@ -478,7 +267,7 @@
 				MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_NON_RSET_QUERY);
 				break;
 			}
-			case 0:				/* UPSERT		*/
+			case 0:				/* UPSERT */
 				conn->last_query_type = QUERY_UPSERT;
 				conn->field_count = rset_header.field_count;
 				conn->upsert_status.warning_count = rset_header.warning_count;
@@ -541,7 +330,7 @@
 					result = stmt->result;
 				}
 
-				if (FAIL == (ret = mysqlnd_read_result_metadata(conn, result TSRMLS_CC))) {
+				if (FAIL == (ret = result->m.read_result_metadata(result, conn TSRMLS_CC))) {
 					/* For PS, we leave them in Prepared state */
 					if (!stmt) {
 						efree(conn->current_result);
@@ -689,6 +478,7 @@
 			for (i = 0; i < field_count; i++) {
 				zval *data = result->unbuf->last_row_data[i];
 				int len = (Z_TYPE_P(data) == IS_NULL)? 0:Z_STRLEN_P(data);
+				MYSQLND_RES_METADATA *meta = result->meta;
 
 				if (lengths) {
 					lengths[i] = len;
@@ -711,31 +501,31 @@
 					  the index is a numeric and convert it to it. This however means constant
 					  hashing of the column name, which is not needed as it can be precomputed.
 					*/
-					if (result->meta->zend_hash_keys[i].is_numeric == FALSE) {
+					if (meta->zend_hash_keys[i].is_numeric == FALSE) {
 #if PHP_MAJOR_VERSION >= 6
 						if (UG(unicode)) {
 							zend_u_hash_quick_update(Z_ARRVAL_P(row), IS_UNICODE,
-													 result->meta->zend_hash_keys[i].ustr,
-													 result->meta->zend_hash_keys[i].ulen + 1,
-													 result->meta->zend_hash_keys[i].key,
+													 meta->zend_hash_keys[i].ustr,
+													 meta->zend_hash_keys[i].ulen + 1,
+													 meta->zend_hash_keys[i].key,
 													 (void *) &data, sizeof(zval *), NULL);
 						} else
 #endif
 						{
 							zend_hash_quick_update(Z_ARRVAL_P(row),
-												   result->meta->fields[i].name,
-												   result->meta->fields[i].name_length + 1,
-												   result->meta->zend_hash_keys[i].key,
+												   meta->fields[i].name,
+												   meta->fields[i].name_length + 1,
+												   meta->zend_hash_keys[i].key,
 												   (void *) &data, sizeof(zval *), NULL);
 						}
 					} else {
 						zend_hash_index_update(Z_ARRVAL_P(row),
-											   result->meta->zend_hash_keys[i].key,
+											   meta->zend_hash_keys[i].key,
 											   (void *) &data, sizeof(zval *), NULL);
 					}
 				}
-				if (result->meta->fields[i].max_length < len) {
-					result->meta->fields[i].max_length = len;
+				if (meta->fields[i].max_length < len) {
+					meta->fields[i].max_length = len;
 				}
 			}
 		}
@@ -1035,7 +825,8 @@
 																		STAT_FLUSHED_PS_SETS);
 
 		while ((PASS == result->m.fetch_row(result, NULL, 0, &fetched_anything
TSRMLS_CC)) &&
-			   fetched_anything == TRUE) {
+			   fetched_anything == TRUE)
+		{
 			/* do nothing */;
 		}
 	}
@@ -1202,62 +993,6 @@
 /* }}} */
 
 
-/* {{{ mysqlnd_res::clone_metadata */
-static MYSQLND_RES_METADATA *
-MYSQLND_METHOD(mysqlnd_res, clone_metadata)(const MYSQLND_RES_METADATA * const meta,
-											zend_bool persistent)
-{
-	unsigned int i;
-	/* +1 is to have empty marker at the end */
-	MYSQLND_RES_METADATA *new_meta = pemalloc(sizeof(MYSQLND_RES_METADATA), persistent);
-	MYSQLND_FIELD *new_fields = pecalloc(meta->field_count + 1, sizeof(MYSQLND_FIELD),
persistent);
-	MYSQLND_FIELD *original_fields = meta->fields;
-	size_t len = meta->field_count * sizeof(struct mysqlnd_field_hash_key);
-
-	new_meta->zend_hash_keys = pemalloc(len, persistent);
-	memcpy(new_meta->zend_hash_keys, meta->zend_hash_keys, len);
-
-	/*
-	  This will copy also the strings and the root, which we will have
-	  to adjust in the loop
-	*/
-	memcpy(new_fields, original_fields, (meta->field_count) * sizeof(MYSQLND_FIELD));
-	for (i = 0; i < meta->field_count; i++) {
-		/* First copy the root, then field by field adjust the pointers */
-		new_fields[i].root = pemalloc(original_fields[i].root_len, persistent);
-		memcpy(new_fields[i].root, original_fields[i].root, new_fields[i].root_len);
-
-		new_fields[i].name		= new_fields[i].root + (original_fields[i].name -
original_fields[i].root);
-		new_fields[i].org_name	= new_fields[i].root + (original_fields[i].org_name -
original_fields[i].root);
-
-		new_fields[i].table		= new_fields[i].root + (original_fields[i].table -
original_fields[i].root);
-		new_fields[i].org_table	= new_fields[i].root + (original_fields[i].org_table -
original_fields[i].root);
-
-		new_fields[i].db		= new_fields[i].root + (original_fields[i].db -
original_fields[i].root);
-		new_fields[i].catalog	= new_fields[i].root + (original_fields[i].catalog -
original_fields[i].root);
-		/* def is not on the root, if allocated at all */
-		if (original_fields[i].def) {
-			new_fields[i].def	= pemalloc(original_fields[i].def_length + 1, persistent);
-			/* copy the trailing \0 too */
-			memcpy(new_fields[i].def, original_fields[i].def, original_fields[i].def_length + 1);
-		}
-#if PHP_MAJOR_VERSION >= 6
-		if (new_meta->zend_hash_keys[i].ustr.u) {
-			new_meta->zend_hash_keys[i].ustr.u =
-					eustrndup(new_meta->zend_hash_keys[i].ustr.u,
new_meta->zend_hash_keys[i].ulen);
-		}
-#endif 
-	}
-	new_meta->current_field = 0;
-	new_meta->field_count = meta->field_count;
-
-	new_meta->fields = new_fields;
-
-	return new_meta;
-}
-/* }}} */
-
-
 /* {{{ mysqlnd_result_init */
 MYSQLND_RES *mysqlnd_result_init(unsigned int field_count, MYSQLND_THD_ZVAL_PCACHE
*cache)
 {
@@ -1270,7 +1005,6 @@
 	ret->m.use_result	= MYSQLND_METHOD(mysqlnd_res, use_result);
 	ret->m.store_result	= MYSQLND_METHOD(mysqlnd_res, store_result);
 	ret->m.free_result	= MYSQLND_METHOD(mysqlnd_res, free_result);
-	ret->m.clone_metadata=MYSQLND_METHOD(mysqlnd_res, clone_metadata);
 	ret->m.seek_data	= MYSQLND_METHOD(mysqlnd_res, data_seek);
 	ret->m.num_rows		= MYSQLND_METHOD(mysqlnd_res, num_rows);
 	ret->m.num_fields	= MYSQLND_METHOD(mysqlnd_res, num_fields);
@@ -1284,9 +1018,19 @@
 	ret->m.skip_result	= MYSQLND_METHOD(mysqlnd_res, skip_result);
 	ret->m.free_result_buffers	= MYSQLND_METHOD(mysqlnd_res, free_result_buffers);
 
+	ret->m.read_result_metadata = MYSQLND_METHOD(mysqlnd_res, read_result_metadata);
 	ret->m.fetch_row_normal_buffered	= mysqlnd_fetch_row_buffered;
 	ret->m.fetch_row_normal_unbuffered	= mysqlnd_fetch_row_unbuffered;
 
 	return ret;
 }
 /* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/mysqlnd_result.h
===================================================================
--- trunk/mysqlnd/mysqlnd_result.h	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_result.h	2007-06-15 11:51:09 UTC (rev 373)
@@ -31,9 +31,6 @@
 void mysqlnd_internal_free_result_buffers(MYSQLND_RES *result TSRMLS_DC);
 void mysqlnd_internal_free_result(MYSQLND_RES *result TSRMLS_DC);
 
-
-enum_func_status mysqlnd_read_result_metadata(MYSQLND *conn, MYSQLND_RES *result
TSRMLS_DC);
-
 enum_func_status
 mysqlnd_store_result_fetch_data(MYSQLND * const conn, MYSQLND_RES *result,
 								MYSQLND_RES_METADATA *meta,
@@ -47,4 +44,13 @@
 MYSQLND_RES * _mysqlnd_store_result(MYSQLND * const conn TSRMLS_DC);
 
 
-#endif
+#endif /* MYSQLND_RESULT_H */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Added: trunk/mysqlnd/mysqlnd_result_meta.c
===================================================================
--- trunk/mysqlnd/mysqlnd_result_meta.c	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_result_meta.c	2007-06-15 11:51:09 UTC (rev 373)
@@ -0,0 +1,334 @@
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 6                                                        |
+  +----------------------------------------------------------------------+
+  | 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        |
+  | available through the world-wide-web at the following url:           |
+  | http://www.php.net/license/3_01.txt                                  |
+  | If you did not receive a copy of the PHP license and are unable to   |
+  | obtain it through the world-wide-web, please send a note to          |
+  | license@stripped so we can mail you a copy immediately.               |
+  +----------------------------------------------------------------------+
+  | Authors: Georg Richter <georg@stripped>                             |
+  |          Andrey Hristov <andrey@stripped>                           |
+  |          Ulf Wendel <uwendel@stripped>                              |
+  +----------------------------------------------------------------------+
+*/
+
+/* $Id: header,v 1.17 2006/01/01 13:09:48 sniper Exp $ */
+#include "php.h"
+#include "mysqlnd.h"
+#include "mysqlnd_priv.h"
+#include "mysqlnd_result.h"
+#include "mysqlnd_wireprotocol.h"
+#include "ext/standard/basic_functions.h"
+
+
+/* {{{ php_mysqlnd_free_field_metadata */
+static
+void php_mysqlnd_free_field_metadata(MYSQLND_FIELD *meta, zend_bool persistent)
+{
+	if (meta) {
+		if (meta->root) {
+			pefree(meta->root, persistent);
+			meta->root = NULL;
+		}
+		if (meta->def) {
+			pefree(meta->def, persistent);
+			meta->def = NULL;
+		}
+	}
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_handle_numeric */
+/*
+  The following code is stolen from ZE - HANDLE_NUMERIC() macro from zend_hash.c
+  and modified for the needs of mysqlnd.
+*/
+static
+zend_bool mysqlnd_is_key_numeric(char *key, size_t length, long *idx)
+{
+	register char *tmp=key;
+
+	if (*tmp=='-') {
+		tmp++;
+	}
+	if ((*tmp>='0' && *tmp<='9')) {
+		do { /* possibly a numeric index */
+			char *end=key+length-1;
+
+			if (*tmp++=='0' && length>2) { /* don't accept numbers with leading zeros
*/
+				break;
+			}
+			while (tmp<end) {
+				if (!(*tmp>='0' && *tmp<='9')) {
+					break;
+				}
+				tmp++;
+			}
+			if (tmp==end && *tmp=='\0') { /* a numeric index */
+				if (*key=='-') {
+					*idx = strtol(key, NULL, 10);
+					if (*idx!=LONG_MIN) {
+						return TRUE;
+					}
+				} else {
+					*idx = strtol(key, NULL, 10);
+					if (*idx!=LONG_MAX) {
+						return TRUE;
+					}
+				}
+			}
+		} while (0);
+	}
+	return FALSE;
+}
+/* }}} */
+
+
+#if PHP_MAJOR_VERSION >= 6
+/* {{{ mysqlnd_unicode_is_key_numeric */
+static
+zend_bool mysqlnd_unicode_is_key_numeric(UChar *key, size_t length, long *idx)
+{
+	register UChar *tmp=key;
+
+	if (*tmp==0x2D /*'-'*/) {
+		tmp++;
+	}
+	if ((*tmp>=0x30 /*'0'*/ && *tmp<=0x39 /*'9'*/)) { /* possibly a numeric
index */
+		do {
+			UChar *end=key+length-1;
+
+			if (*tmp++==0x30 && length>2) { /* don't accept numbers with leading zeros
*/
+				break;
+			}
+			while (tmp<end) {
+				if (!(*tmp>=0x30 /*'0'*/ && *tmp<=0x39 /*'9'*/)) {
+					break;
+				}
+				tmp++;
+			}
+			if (tmp==end && *tmp==0) { /* a numeric index */
+				if (*key==0x2D /*'-'*/) {
+					*idx = zend_u_strtol(key, NULL, 10);
+					if (*idx!=LONG_MIN) {
+						return TRUE;
+					}
+				} else {
+					*idx = zend_u_strtol(key, NULL, 10);
+					if (*idx!=LONG_MAX) {
+						return TRUE;
+					}
+				}
+			}
+		} while (0);
+	}
+	return FALSE;
+}
+/* }}} */
+#endif
+
+
+/* {{{ mysqlnd_res_meta::read_metadata */
+static enum_func_status
+MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const meta,
+												MYSQLND *conn TSRMLS_DC)
+{
+	int i = 0;
+	php_mysql_packet_res_field field_packet;
+
+	PACKET_INIT_ALLOCA(field_packet, PROT_RSET_FLD_PACKET);
+	for (;i < meta->field_count; i++) {
+		long idx;
+
+		if (meta->fields[i].root) {
+			/* We re-read metadata for PS */
+			efree(meta->fields[i].root);
+			meta->fields[i].root = NULL;
+		}
+
+		field_packet.metadata = &(meta->fields[i]);
+		if (FAIL == PACKET_READ_ALLOCA(field_packet, conn)) {
+			PACKET_FREE_ALLOCA(field_packet);
+			return FAIL;
+		}
+
+		if (mysqlnd_ps_fetch_functions[meta->fields[i].type].func == NULL) {
+			php_error_docref(NULL TSRMLS_CC, E_WARNING,
+							 "Unknown type %d sent by the server. "
+							 "Please send a report to the developers",
+							 meta->fields[i].type);
+			PACKET_FREE_ALLOCA(field_packet);
+			return FAIL;
+		}
+
+
+#if PHP_MAJOR_VERSION >= 6
+		if (UG(unicode)) {
+			UChar *ustr;
+			int ulen;
+			zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen,
+								   meta->fields[i].name,
+								   meta->fields[i].name_length TSRMLS_CC);
+			if ((meta->zend_hash_keys[i].is_numeric =
+				 			mysqlnd_unicode_is_key_numeric(ustr, ulen + 1, &idx)))
+			{
+				meta->zend_hash_keys[i].key = idx;
+				efree(ustr);
+			} else {
+				meta->zend_hash_keys[i].ustr.u = ustr;
+				meta->zend_hash_keys[i].ulen = ulen;
+				meta->zend_hash_keys[i].key = zend_u_get_hash_value(IS_UNICODE, ZSTR(ustr), ulen +
1);
+			}
+
+		} else 
+#endif
+		{
+			/* For BC we have to check whether the key is numeric and use it like this */
+			if ((meta->zend_hash_keys[i].is_numeric =
+						mysqlnd_is_key_numeric(field_packet.metadata->name,
+											   field_packet.metadata->name_length + 1,
+											   &idx)))
+			{
+				meta->zend_hash_keys[i].key = idx;
+			} else {
+				meta->zend_hash_keys[i].key =
+						zend_get_hash_value(field_packet.metadata->name,
+											field_packet.metadata->name_length + 1);
+			}
+		}
+	}
+	PACKET_FREE_ALLOCA(field_packet);
+
+	return PASS;
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_res_meta::free */
+static void
+MYSQLND_METHOD(mysqlnd_res_meta, free)(MYSQLND_RES_METADATA *meta, zend_bool persistent
TSRMLS_DC)
+{
+	int i;
+	MYSQLND_FIELD *fields;
+
+	if ((fields = meta->fields)) {
+		i = meta->field_count;
+		while (i--) {
+			php_mysqlnd_free_field_metadata(fields++, persistent);
+		}
+		pefree(meta->fields, persistent);
+		meta->fields = NULL;
+	}
+
+	if (meta->zend_hash_keys) {
+#if PHP_MAJOR_VERSION >= 6
+		if (UG(unicode)) {
+			for (i = 0; i < meta->field_count; i++) {
+				if (meta->zend_hash_keys[i].ustr.v) {
+					pefree(meta->zend_hash_keys[i].ustr.v, persistent);
+				}
+			}
+		}
+#endif
+		pefree(meta->zend_hash_keys, persistent);
+		meta->zend_hash_keys = NULL;
+	}
+	pefree(meta, persistent);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_res::clone_metadata */
+static MYSQLND_RES_METADATA *
+MYSQLND_METHOD(mysqlnd_res_meta, clone_metadata)(const MYSQLND_RES_METADATA * const meta,
+												 zend_bool persistent)
+{
+	unsigned int i;
+	/* +1 is to have empty marker at the end */
+	MYSQLND_RES_METADATA *new_meta = pemalloc(sizeof(MYSQLND_RES_METADATA), persistent);
+	MYSQLND_FIELD *new_fields = pecalloc(meta->field_count + 1, sizeof(MYSQLND_FIELD),
persistent);
+	MYSQLND_FIELD *orig_fields = meta->fields;
+	size_t len = meta->field_count * sizeof(struct mysqlnd_field_hash_key);
+
+	new_meta->zend_hash_keys = pemalloc(len, persistent);
+	memcpy(new_meta->zend_hash_keys, meta->zend_hash_keys, len);
+	new_meta->m = meta->m;
+
+	/*
+	  This will copy also the strings and the root, which we will have
+	  to adjust in the loop
+	*/
+	memcpy(new_fields, orig_fields, (meta->field_count) * sizeof(MYSQLND_FIELD));
+	for (i = 0; i < meta->field_count; i++) {
+		/* First copy the root, then field by field adjust the pointers */
+		new_fields[i].root = pemalloc(orig_fields[i].root_len, persistent);
+		memcpy(new_fields[i].root, orig_fields[i].root, new_fields[i].root_len);
+
+		new_fields[i].name		= new_fields[i].root + (orig_fields[i].name - orig_fields[i].root);
+		new_fields[i].org_name	= new_fields[i].root + (orig_fields[i].org_name -
orig_fields[i].root);
+
+		new_fields[i].table		= new_fields[i].root + (orig_fields[i].table -
orig_fields[i].root);
+		new_fields[i].org_table	= new_fields[i].root + (orig_fields[i].org_table -
orig_fields[i].root);
+
+		new_fields[i].db		= new_fields[i].root + (orig_fields[i].db - orig_fields[i].root);
+		new_fields[i].catalog	= new_fields[i].root + (orig_fields[i].catalog -
orig_fields[i].root);
+		/* def is not on the root, if allocated at all */
+		if (orig_fields[i].def) {
+			new_fields[i].def	= pemalloc(orig_fields[i].def_length + 1, persistent);
+			/* copy the trailing \0 too */
+			memcpy(new_fields[i].def, orig_fields[i].def, orig_fields[i].def_length + 1);
+		}
+#if PHP_MAJOR_VERSION >= 6
+		if (new_meta->zend_hash_keys[i].ustr.u) {
+			new_meta->zend_hash_keys[i].ustr.u =
+					eustrndup(new_meta->zend_hash_keys[i].ustr.u,
new_meta->zend_hash_keys[i].ulen);
+		}
+#endif
+	}
+	new_meta->current_field = 0;
+	new_meta->field_count = meta->field_count;
+
+	new_meta->fields = new_fields;
+
+	return new_meta;
+}
+/* }}} */
+
+
+MYSQLND_CLASS_METHODS_START(mysqlnd_res_meta)
+	MYSQLND_METHOD(mysqlnd_res_meta, read_metadata),
+	MYSQLND_METHOD(mysqlnd_res_meta, clone_metadata),
+	MYSQLND_METHOD(mysqlnd_res_meta, free),
+MYSQLND_CLASS_METHODS_END;
+
+
+/* {{{ mysqlnd_result_meta_init */
+MYSQLND_RES_METADATA *mysqlnd_result_meta_init(unsigned int field_count)
+{
+	MYSQLND_RES_METADATA *ret;
+	/* +1 is to have empty marker at the end */
+	ret = ecalloc(1, sizeof(MYSQLND_RES_METADATA));
+	ret->field_count = field_count;
+	ret->fields = ecalloc(field_count + 1, sizeof(MYSQLND_FIELD));
+	ret->zend_hash_keys = ecalloc(field_count, sizeof(struct mysqlnd_field_hash_key));
+
+	ret->m = & mysqlnd_mysqlnd_res_meta_methods;
+	return ret;
+}
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Added: trunk/mysqlnd/mysqlnd_result_meta.h
===================================================================
--- trunk/mysqlnd/mysqlnd_result_meta.h	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_result_meta.h	2007-06-15 11:51:09 UTC (rev 373)
@@ -0,0 +1,40 @@
+/*
+  +----------------------------------------------------------------------+
+  | PHP Version 6                                                        |
+  +----------------------------------------------------------------------+
+  | 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        |
+  | available through the world-wide-web at the following url:           |
+  | http://www.php.net/license/3_01.txt                                  |
+  | If you did not receive a copy of the PHP license and are unable to   |
+  | obtain it through the world-wide-web, please send a note to          |
+  | license@stripped so we can mail you a copy immediately.               |
+  +----------------------------------------------------------------------+
+  | Authors: Georg Richter <georg@stripped>                             |
+  |          Andrey Hristov <andrey@stripped>                           |
+  |          Ulf Wendel <uwendel@stripped>                              |
+  +----------------------------------------------------------------------+
+*/
+
+/* $Id: header,v 1.17 2006/01/01 13:09:48 sniper Exp $ */
+
+#ifndef MYSQLND_RESULT_META_H
+#define MYSQLND_RESULT_META_H
+
+
+MYSQLND_RES_METADATA *mysqlnd_result_meta_init(unsigned int field_count);
+
+
+
+#endif /* MYSQLND_RESULT_META_H */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/mysqlnd_statistics.c
===================================================================
--- trunk/mysqlnd/mysqlnd_statistics.c	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_statistics.c	2007-06-15 11:51:09 UTC (rev 373)
@@ -120,3 +120,11 @@
 }
 
 
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/mysqlnd_wireprotocol.h
===================================================================
--- trunk/mysqlnd/mysqlnd_wireprotocol.h	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/mysqlnd_wireprotocol.h	2007-06-15 11:51:09 UTC (rev 373)
@@ -312,3 +312,12 @@
 zend_uchar *	php_mysqlnd_net_store_length(zend_uchar *packet, mynd_ulonglong length);
 
 #endif /* MYSQLND_WIREPROTOCOL_H */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Modified: trunk/mysqlnd/portability.h
===================================================================
--- trunk/mysqlnd/portability.h	2007-06-15 09:26:17 UTC (rev 372)
+++ trunk/mysqlnd/portability.h	2007-06-15 11:51:09 UTC (rev 373)
@@ -408,3 +408,34 @@
 #endif /* WORDS_BIGENDIAN */
 
 
+#ifdef PHP_WIN32
+#define MYSQLND_LLU_SPEC "%I64u"
+#define MYSQLND_LL_SPEC "%I64d"
+#ifndef L64
+#define L64(x) x##i64
+#endif
+typedef unsigned __int64 my_uint64;
+typedef __int64 my_int64;
+typedef unsigned __int64 mynd_ulonglong;
+typedef __int64 mynd_longlong;
+#else
+#define MYSQLND_LLU_SPEC "%llu"
+#define MYSQLND_LL_SPEC "%lld"
+#ifndef L64
+#define L64(x) x##LL
+#endif
+typedef unsigned long long my_uint64;
+typedef long long my_int64;
+typedef unsigned long long mynd_ulonglong;
+typedef long long mynd_longlong;
+#endif
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */

Thread
PHP mysqlnd svn commit: r373 - trunk/mysqlndahristov15 Jun