Sync mysqlnd with HEAD. Same sources as in 5_3

This commit is contained in:
Andrey Hristov 2007-10-16 20:58:35 +00:00
parent 0655ad3833
commit a0aa80a3f8
9 changed files with 200 additions and 156 deletions

View File

@ -59,7 +59,7 @@
#endif #endif
#include "php_ini.h" #include "php_ini.h"
#include "php_mysql.h" #include "php_mysql_structs.h"
/* True globals, no need for thread safety */ /* True globals, no need for thread safety */
static int le_result, le_link, le_plink; static int le_result, le_link, le_plink;

View File

@ -21,128 +21,13 @@
#ifndef PHP_MYSQL_H #ifndef PHP_MYSQL_H
#define PHP_MYSQL_H #define PHP_MYSQL_H
#ifdef PHP_WIN32
#define PHP_MYSQL_API __declspec(dllexport)
#else
#define PHP_MYSQL_API
#endif
#if HAVE_MYSQL #if HAVE_MYSQL
#ifdef ZTS
#include "TSRM.h"
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#if defined(HAVE_MYSQLND)
#include "ext/mysqlnd/mysqlnd.h"
#include "ext/mysql/mysql_mysqlnd.h"
#else
#include <mysql.h>
#endif
#if (MYSQL_VERSION_ID >= 40113 && MYSQL_VERSION_ID < 50000) || MYSQL_VERSION_ID >= 50007 || HAVE_MYSQLND
#define MYSQL_HAS_SET_CHARSET
#endif
extern zend_module_entry mysql_module_entry; extern zend_module_entry mysql_module_entry;
#define mysql_module_ptr &mysql_module_entry #define mysql_module_ptr &mysql_module_entry
PHP_MINIT_FUNCTION(mysql);
PHP_RINIT_FUNCTION(mysql);
PHP_MSHUTDOWN_FUNCTION(mysql);
PHP_RSHUTDOWN_FUNCTION(mysql);
PHP_MINFO_FUNCTION(mysql);
PHP_FUNCTION(mysql_connect);
PHP_FUNCTION(mysql_pconnect);
PHP_FUNCTION(mysql_close);
PHP_FUNCTION(mysql_select_db);
#if MYSQL_VERSION_ID < 40000
PHP_FUNCTION(mysql_create_db);
PHP_FUNCTION(mysql_drop_db);
#endif
PHP_FUNCTION(mysql_query);
PHP_FUNCTION(mysql_unbuffered_query);
PHP_FUNCTION(mysql_db_query);
PHP_FUNCTION(mysql_list_dbs);
PHP_FUNCTION(mysql_list_tables);
PHP_FUNCTION(mysql_list_fields);
PHP_FUNCTION(mysql_list_processes);
PHP_FUNCTION(mysql_error);
PHP_FUNCTION(mysql_errno);
PHP_FUNCTION(mysql_affected_rows);
PHP_FUNCTION(mysql_insert_id);
PHP_FUNCTION(mysql_result);
PHP_FUNCTION(mysql_num_rows);
PHP_FUNCTION(mysql_num_fields);
PHP_FUNCTION(mysql_fetch_row);
PHP_FUNCTION(mysql_fetch_array);
PHP_FUNCTION(mysql_fetch_assoc);
PHP_FUNCTION(mysql_fetch_object);
PHP_FUNCTION(mysql_data_seek);
PHP_FUNCTION(mysql_fetch_lengths);
PHP_FUNCTION(mysql_fetch_field);
PHP_FUNCTION(mysql_field_seek);
PHP_FUNCTION(mysql_free_result);
PHP_FUNCTION(mysql_field_name);
PHP_FUNCTION(mysql_field_table);
PHP_FUNCTION(mysql_field_len);
PHP_FUNCTION(mysql_field_type);
PHP_FUNCTION(mysql_field_flags);
PHP_FUNCTION(mysql_escape_string);
PHP_FUNCTION(mysql_real_escape_string);
PHP_FUNCTION(mysql_get_client_info);
PHP_FUNCTION(mysql_get_host_info);
PHP_FUNCTION(mysql_get_proto_info);
PHP_FUNCTION(mysql_get_server_info);
PHP_FUNCTION(mysql_info);
PHP_FUNCTION(mysql_stat);
PHP_FUNCTION(mysql_thread_id);
PHP_FUNCTION(mysql_client_encoding);
PHP_FUNCTION(mysql_ping);
PHP_FUNCTION(mysql_set_charset);
ZEND_BEGIN_MODULE_GLOBALS(mysql)
long default_link;
long num_links,num_persistent;
long max_links,max_persistent;
long allow_persistent;
long default_port;
char *default_host, *default_user, *default_password;
char *default_socket;
char *connect_error;
long connect_errno;
long connect_timeout;
long result_allocated;
long trace_mode;
long allow_local_infile;
#ifdef HAVE_MYSQLND
MYSQLND_THD_ZVAL_PCACHE *mysqlnd_thd_zval_cache;
MYSQLND_QCACHE *mysqlnd_qcache;
long cache_size;
#endif
ZEND_END_MODULE_GLOBALS(mysql)
#ifdef ZTS
# define MySG(v) TSRMG(mysql_globals_id, zend_mysql_globals *, v)
#else #else
# define MySG(v) (mysql_globals.v)
#endif
#else
#define mysql_module_ptr NULL #define mysql_module_ptr NULL
#endif #endif
#define phpext_mysql_ptr mysql_module_ptr #define phpext_mysql_ptr mysql_module_ptr

View File

@ -0,0 +1,151 @@
/*
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-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@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Zeev Suraski <zeev@zend.com> |
| Andrey Hristov <andrey@php.net> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
#ifndef PHP_MYSQL_STRUCTS_H
#define PHP_MYSQL_STRUCTS_H
#ifdef PHP_WIN32
#define PHP_MYSQL_API __declspec(dllexport)
#else
#define PHP_MYSQL_API
#endif
#if HAVE_MYSQL
#ifdef ZTS
#include "TSRM.h"
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#if defined(HAVE_MYSQLND)
#include "ext/mysqlnd/mysqlnd.h"
#include "ext/mysql/mysql_mysqlnd.h"
#else
#include <mysql.h>
#endif
#if (MYSQL_VERSION_ID >= 40113 && MYSQL_VERSION_ID < 50000) || MYSQL_VERSION_ID >= 50007 || HAVE_MYSQLND
#define MYSQL_HAS_SET_CHARSET
#endif
extern zend_module_entry mysql_module_entry;
#define mysql_module_ptr &mysql_module_entry
PHP_MINIT_FUNCTION(mysql);
PHP_RINIT_FUNCTION(mysql);
PHP_MSHUTDOWN_FUNCTION(mysql);
PHP_RSHUTDOWN_FUNCTION(mysql);
PHP_MINFO_FUNCTION(mysql);
PHP_FUNCTION(mysql_connect);
PHP_FUNCTION(mysql_pconnect);
PHP_FUNCTION(mysql_close);
PHP_FUNCTION(mysql_select_db);
#if MYSQL_VERSION_ID < 40000
PHP_FUNCTION(mysql_create_db);
PHP_FUNCTION(mysql_drop_db);
#endif
PHP_FUNCTION(mysql_query);
PHP_FUNCTION(mysql_unbuffered_query);
PHP_FUNCTION(mysql_db_query);
PHP_FUNCTION(mysql_list_dbs);
PHP_FUNCTION(mysql_list_tables);
PHP_FUNCTION(mysql_list_fields);
PHP_FUNCTION(mysql_list_processes);
PHP_FUNCTION(mysql_error);
PHP_FUNCTION(mysql_errno);
PHP_FUNCTION(mysql_affected_rows);
PHP_FUNCTION(mysql_insert_id);
PHP_FUNCTION(mysql_result);
PHP_FUNCTION(mysql_num_rows);
PHP_FUNCTION(mysql_num_fields);
PHP_FUNCTION(mysql_fetch_row);
PHP_FUNCTION(mysql_fetch_array);
PHP_FUNCTION(mysql_fetch_assoc);
PHP_FUNCTION(mysql_fetch_object);
PHP_FUNCTION(mysql_data_seek);
PHP_FUNCTION(mysql_fetch_lengths);
PHP_FUNCTION(mysql_fetch_field);
PHP_FUNCTION(mysql_field_seek);
PHP_FUNCTION(mysql_free_result);
PHP_FUNCTION(mysql_field_name);
PHP_FUNCTION(mysql_field_table);
PHP_FUNCTION(mysql_field_len);
PHP_FUNCTION(mysql_field_type);
PHP_FUNCTION(mysql_field_flags);
PHP_FUNCTION(mysql_escape_string);
PHP_FUNCTION(mysql_real_escape_string);
PHP_FUNCTION(mysql_get_client_info);
PHP_FUNCTION(mysql_get_host_info);
PHP_FUNCTION(mysql_get_proto_info);
PHP_FUNCTION(mysql_get_server_info);
PHP_FUNCTION(mysql_info);
PHP_FUNCTION(mysql_stat);
PHP_FUNCTION(mysql_thread_id);
PHP_FUNCTION(mysql_client_encoding);
PHP_FUNCTION(mysql_ping);
PHP_FUNCTION(mysql_set_charset);
ZEND_BEGIN_MODULE_GLOBALS(mysql)
long default_link;
long num_links,num_persistent;
long max_links,max_persistent;
long allow_persistent;
long default_port;
char *default_host, *default_user, *default_password;
char *default_socket;
char *connect_error;
long connect_errno;
long connect_timeout;
long result_allocated;
long trace_mode;
long allow_local_infile;
#ifdef HAVE_MYSQLND
MYSQLND_THD_ZVAL_PCACHE *mysqlnd_thd_zval_cache;
MYSQLND_QCACHE *mysqlnd_qcache;
long cache_size;
#endif
ZEND_END_MODULE_GLOBALS(mysql)
#ifdef ZTS
# define MySG(v) TSRMG(mysql_globals_id, zend_mysql_globals *, v)
#else
# define MySG(v) (mysql_globals.v)
#endif
#else
#define mysql_module_ptr NULL
#endif
#define phpext_mysql_ptr mysql_module_ptr
#endif /* PHP_MYSQL_STRUCTS_H */

View File

@ -1,10 +1,8 @@
// $Id$ // $Id$
// vim:ft=javascript // vim:ft=javascript
ARG_WITH("mysqli", "MySQLi support", "no"); mysqld_source = "";
ARG_ENABLE("mysqlnd", "MySQLi with mysqlnd support", "no"); if (CHECK_LIB("ws2_32.lib", "mysqlnd")) {
if (PHP_MYSQLI == "mysqlnd" || PHP_MYSQL == "mysqlnd") {
mysqlnd_source = mysqlnd_source =
"mysqlnd.c " + "mysqlnd.c " +
"mysqlnd_debug.c " + "mysqlnd_debug.c " +
@ -18,9 +16,5 @@ if (PHP_MYSQLI == "mysqlnd" || PHP_MYSQL == "mysqlnd") {
"mysqlnd_result_meta.c " + "mysqlnd_result_meta.c " +
"mysqlnd_statistics.c " + "mysqlnd_statistics.c " +
"mysqlnd_wireprotocol.c"; "mysqlnd_wireprotocol.c";
if (CHECK_LIB("ws2_32.lib", "mysqlnd")) { EXTENSION("mysqlnd", mysqlnd_source, false);
EXTENSION("mysqlnd", mysqlnd_source);
AC_DEFINE('HAVE_MYSQLND', 1, 'MySQL native driver support enabled');
}
} }

View File

@ -86,14 +86,14 @@ MYSQLND_METHOD(mysqlnd_debug, log)(MYSQLND_DEBUG * self,
unsigned int level, const char * type, const char * message) unsigned int level, const char * type, const char * message)
{ {
char pipe_buffer[512]; char pipe_buffer[512];
MYSQLND_ZTS(self);
enum_func_status ret; enum_func_status ret;
int i; int i;
char * message_line; char * message_line;
size_t message_line_len; uint message_line_len;
unsigned int flags = self->flags; unsigned int flags = self->flags;
char pid_buffer[10], time_buffer[30], file_buffer[200], char pid_buffer[10], time_buffer[30], file_buffer[200],
line_buffer[6], level_buffer[7]; line_buffer[6], level_buffer[7];
MYSQLND_ZTS(self);
if (!self->stream) { if (!self->stream) {
if (FAIL == self->m->open(self, FALSE)) { if (FAIL == self->m->open(self, FALSE)) {
@ -185,15 +185,15 @@ MYSQLND_METHOD(mysqlnd_debug, log_va)(MYSQLND_DEBUG *self,
const char *format, ...) const char *format, ...)
{ {
char pipe_buffer[512]; char pipe_buffer[512];
MYSQLND_ZTS(self);
int i; int i;
enum_func_status ret; enum_func_status ret;
char * message_line, *buffer; char * message_line, *buffer;
size_t message_line_len; uint message_line_len;
va_list args; va_list args;
unsigned int flags = self->flags; unsigned int flags = self->flags;
char pid_buffer[10], time_buffer[30], file_buffer[200], char pid_buffer[10], time_buffer[30], file_buffer[200],
line_buffer[6], level_buffer[7]; line_buffer[6], level_buffer[7];
MYSQLND_ZTS(self);
if (!self->stream) { if (!self->stream) {
if (FAIL == self->m->open(self, FALSE)) { if (FAIL == self->m->open(self, FALSE)) {
@ -289,7 +289,7 @@ MYSQLND_METHOD(mysqlnd_debug, log_va)(MYSQLND_DEBUG *self,
static zend_bool static zend_bool
MYSQLND_METHOD(mysqlnd_debug, func_enter)(MYSQLND_DEBUG * self, MYSQLND_METHOD(mysqlnd_debug, func_enter)(MYSQLND_DEBUG * self,
unsigned int line, const char * const file, unsigned int line, const char * const file,
char * func_name, size_t func_name_len) char * func_name, uint func_name_len)
{ {
if ((self->flags & MYSQLND_DEBUG_DUMP_TRACE) == 0 || self->file_name == NULL) { if ((self->flags & MYSQLND_DEBUG_DUMP_TRACE) == 0 || self->file_name == NULL) {
return FALSE; return FALSE;
@ -396,7 +396,7 @@ enum mysqlnd_debug_parser_state
static void static void
MYSQLND_METHOD(mysqlnd_debug, set_mode)(MYSQLND_DEBUG * self, const char * const mode) MYSQLND_METHOD(mysqlnd_debug, set_mode)(MYSQLND_DEBUG * self, const char * const mode)
{ {
size_t mode_len = strlen(mode), i; uint mode_len = strlen(mode), i;
enum mysqlnd_debug_parser_state state = PARSER_WAIT_MODIFIER; enum mysqlnd_debug_parser_state state = PARSER_WAIT_MODIFIER;
self->flags = 0; self->flags = 0;
@ -460,7 +460,7 @@ MYSQLND_METHOD(mysqlnd_debug, set_mode)(MYSQLND_DEBUG * self, const char * const
if (mode[j] == ',' || mode[j] == ':') { if (mode[j] == ',' || mode[j] == ':') {
if (j > i + 2) { if (j > i + 2) {
char func_name[1024]; char func_name[1024];
size_t func_name_len = MIN(sizeof(func_name) - 1, j - i - 1); uint func_name_len = MIN(sizeof(func_name) - 1, j - i - 1);
memcpy(func_name, mode + i + 1, func_name_len); memcpy(func_name, mode + i + 1, func_name_len);
func_name[func_name_len] = '\0'; func_name[func_name_len] = '\0';
@ -630,6 +630,13 @@ void _mysqlnd_debug(const char *mode TSRMLS_DC)
/* }}} */ /* }}} */
#if ZEND_DEBUG
#else
#define __zend_filename "/unknown/unknown"
#define __zend_lineno 0
#endif
/* {{{ _mysqlnd_emalloc */ /* {{{ _mysqlnd_emalloc */
void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D) void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D)
{ {

View File

@ -36,7 +36,7 @@ struct st_mysqlnd_debug_methods
enum_func_status (*log_va)(MYSQLND_DEBUG *self, unsigned int line, const char * const file, enum_func_status (*log_va)(MYSQLND_DEBUG *self, unsigned int line, const char * const file,
unsigned int level, const char * type, const char *format, ...); unsigned int level, const char * type, const char *format, ...);
zend_bool (*func_enter)(MYSQLND_DEBUG *self, unsigned int line, const char * const file, zend_bool (*func_enter)(MYSQLND_DEBUG *self, unsigned int line, const char * const file,
char * func_name, size_t func_name_len); char * func_name, uint func_name_len);
enum_func_status (*func_leave)(MYSQLND_DEBUG *self, unsigned int line, const char * const file); enum_func_status (*func_leave)(MYSQLND_DEBUG *self, unsigned int line, const char * const file);
enum_func_status (*close)(MYSQLND_DEBUG *self); enum_func_status (*close)(MYSQLND_DEBUG *self);
enum_func_status (*free)(MYSQLND_DEBUG *self); enum_func_status (*free)(MYSQLND_DEBUG *self);
@ -91,15 +91,13 @@ char * mysqlnd_get_backtrace(TSRMLS_D);
#else #else
#define DBG_INF(msg) static inline void DBG_INF(char *msg) {}
#define DBG_ERR(msg) static inline void DBG_ERR(char *msg) {}
#define DBG_INF_FMT(...) static inline void DBG_INF_FMT(char *format, ...) {}
#define DBG_ERR_FMT(...) static inline void DBG_ERR_FMT(char *format, ...) {}
static inline void DBG_ENTER(char *func_name) {}
#define DBG_ENTER(func_name)
#define DBG_RETURN(value) return (value) #define DBG_RETURN(value) return (value)
#define DBG_VOID_RETURN return; #define DBG_VOID_RETURN return;
#endif #endif

View File

@ -359,7 +359,7 @@ void mysqlnd_palloc_zval_ptr_dtor(zval **zv, MYSQLND_THD_ZVAL_PCACHE * const thd
*/ */
if (type == MYSQLND_RES_PS_BUF || type == MYSQLND_RES_PS_UNBUF) { if (type == MYSQLND_RES_PS_BUF || type == MYSQLND_RES_PS_UNBUF) {
; /* do nothing, zval_ptr_dtor will do the job*/ ; /* do nothing, zval_ptr_dtor will do the job*/
} else if (Z_REFCOUNT_P(*zv) > 1) { } else if (Z_REFCOUNT_PP(zv) > 1) {
/* /*
Not a prepared statement, then we have to Not a prepared statement, then we have to
call copy_ctor and then zval_ptr_dtor() call copy_ctor and then zval_ptr_dtor()
@ -389,7 +389,7 @@ void mysqlnd_palloc_zval_ptr_dtor(zval **zv, MYSQLND_THD_ZVAL_PCACHE * const thd
/* The zval is from our cache */ /* The zval is from our cache */
/* refcount is always > 1, because we call Z_ADDREF_P(). Thus test refcount > 2 */ /* refcount is always > 1, because we call Z_ADDREF_P(). Thus test refcount > 2 */
if (Z_REFCOUNT_P(*zv) > 2) { if (Z_REFCOUNT_PP(zv) > 2) {
/* /*
Because the zval is first element in mysqlnd_zval structure, then we can Because the zval is first element in mysqlnd_zval structure, then we can
do upcasting from zval to mysqlnd_zval here. Because we know that this do upcasting from zval to mysqlnd_zval here. Because we know that this
@ -435,7 +435,7 @@ void mysqlnd_palloc_zval_ptr_dtor(zval **zv, MYSQLND_THD_ZVAL_PCACHE * const thd
++cache->put_hits; ++cache->put_hits;
++cache->free_items; ++cache->free_items;
((mysqlnd_zval *)*zv)->point_type = MYSQLND_POINTS_FREE; ((mysqlnd_zval *)*zv)->point_type = MYSQLND_POINTS_FREE;
Z_DELREF_P(*zv); /* Make it 1 */ Z_DELREF_PP(zv); /* Make it 1 */
ZVAL_NULL(*zv); ZVAL_NULL(*zv);
#ifdef ZTS #ifdef ZTS
memset(&((mysqlnd_zval *)*zv)->thread_id, 0, sizeof(THREAD_T)); memset(&((mysqlnd_zval *)*zv)->thread_id, 0, sizeof(THREAD_T));

View File

@ -280,7 +280,6 @@ typedef union {
(((uint32) ((uchar) (A)[1])) << 8) +\ (((uint32) ((uchar) (A)[1])) << 8) +\
(((uint32) ((uchar) (A)[2])) << 16) +\ (((uint32) ((uchar) (A)[2])) << 16) +\
(((uint32) ((uchar) (A)[3])) << 24)) (((uint32) ((uchar) (A)[3])) << 24))
#undef bit_uint5korr
#define bit_uint5korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\ #define bit_uint5korr(A) ((ulonglong)(((uint32) ((uchar) (A)[0])) +\
(((uint32) ((uchar) (A)[1])) << 8) +\ (((uint32) ((uchar) (A)[1])) << 8) +\
(((uint32) ((uchar) (A)[2])) << 16) +\ (((uint32) ((uchar) (A)[2])) << 16) +\

View File

@ -23,6 +23,16 @@
#ifndef MYSQLND_PRIV_H #ifndef MYSQLND_PRIV_H
#define MYSQLND_PRIV_H #define MYSQLND_PRIV_H
#ifndef Z_ADDREF_P
/* PHP 5.2, old GC */
#define Z_ADDREF_P(pz) (++(pz)->refcount)
#define Z_DELREF_P(pz) (--(pz)->refcount)
#define Z_REFCOUNT_P(pz) ((pz)->refcount)
#define Z_SET_REFCOUNT_P(pz, rc) ((pz)->refcount = rc)
#define Z_REFCOUNT_PP(ppz) Z_REFCOUNT_P(*(ppz))
#define Z_DELREF_PP(ppz) Z_DELREF_P(*(ppz))
#endif
#ifdef ZTS #ifdef ZTS
#include "TSRM.h" #include "TSRM.h"
#endif #endif