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/mysqlnd | ahristov | 15 Jun |