diff options
author | Johannes Schlüter <johannes@php.net> | 2008-07-21 13:09:28 +0000 |
---|---|---|
committer | Johannes Schlüter <johannes@php.net> | 2008-07-21 13:09:28 +0000 |
commit | be0793d2e7892a394c3d7105e157ede37d692400 (patch) | |
tree | 3f613ef2beddf8dfc099250fd58efcc90b978a9e /ext/pdo_mysql/php_pdo_mysql_int.h | |
parent | c6c238c772b2762c51893c22ba8ef3f2d1b6f740 (diff) | |
download | php-git-be0793d2e7892a394c3d7105e157ede37d692400.tar.gz |
MFH: Add mysqlnd support for PDO_mysql, fixes at least bug#41997,#42499,
pecl#12794, pecl#12401
# Running the tests:
# (Note: Doesn't work currnetly on HEAD, see:
# http://news.php.net/php.qa/64378)
#
# PDO_MYSQL_TEST_DSN - DSN
# For example: mysql:dbname=test;host=localhost;port=3306
#
# PDO_MYSQL_TEST_HOST - database host
# PDO_MYSQL_TEST_DB - database (schema) name
# PDO_MYSQL_TEST_SOCKET - database server socket
# PDO_MYSQL_TEST_ENGINE - storage engine to use
# PDO_MYSQL_TEST_USER - database user
# PDO_MYSQL_TEST_PASS - database user password
# PDO_MYSQL_TEST_CHARSET - database charset
#
# NOTE: if any of PDO_MYSQL_TEST_[HOST|DB|SOCKET|ENGINE|CHARSET] is
# part of PDO_MYSQL_TEST_DSN, the values must match. That is, for example,
# for PDO_MYSQL_TEST_DSN = mysql:dbname=test you MUST set PDO_MYSQL_TEST_DB=test.
Diffstat (limited to 'ext/pdo_mysql/php_pdo_mysql_int.h')
-rwxr-xr-x | ext/pdo_mysql/php_pdo_mysql_int.h | 106 |
1 files changed, 86 insertions, 20 deletions
diff --git a/ext/pdo_mysql/php_pdo_mysql_int.h b/ext/pdo_mysql/php_pdo_mysql_int.h index 65bcbd2a2b..3ed96c9029 100755 --- a/ext/pdo_mysql/php_pdo_mysql_int.h +++ b/ext/pdo_mysql/php_pdo_mysql_int.h @@ -14,6 +14,7 @@ +----------------------------------------------------------------------+ | Author: George Schlossnagle <george@omniti.com> | | Wez Furlong <wez@php.net> | + | Johannes Schlueter <johannes@mysql.com> | +----------------------------------------------------------------------+ */ @@ -22,7 +23,66 @@ #ifndef PHP_PDO_MYSQL_INT_H #define PHP_PDO_MYSQL_INT_H -#include <mysql.h> +#if defined(PDO_USE_MYSQLND) +# include "ext/mysqlnd/mysqlnd.h" +# include "ext/mysql/mysql_mysqlnd.h" +# include "ext/mysqlnd/mysqlnd_libmysql_compat.h" +# define PDO_MYSQL_PARAM_BIND MYSQLND_PARAM_BIND +#else +# include <mysql.h> +# define PDO_MYSQL_PARAM_BIND MYSQL_BIND +#endif + +#if defined(PDO_USE_MYSQLND) && PHP_DEBUG && !defined(PHP_WIN32) +#define PDO_DBG_ENABLED 1 + +#define PDO_DBG_INF(msg) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "info : ", (msg)); } while (0) +#define PDO_DBG_ERR(msg) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "error: ", (msg)); } while (0) +#define PDO_DBG_INF_FMT(...) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log_va(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "info : ", __VA_ARGS__); } while (0) +#define PDO_DBG_ERR_FMT(...) do { if (dbg_skip_trace == FALSE) PDO_MYSQL_G(dbg)->m->log_va(PDO_MYSQL_G(dbg), __LINE__, __FILE__, -1, "error: ", __VA_ARGS__); } while (0) +#define PDO_DBG_ENTER(func_name) zend_bool dbg_skip_trace = TRUE; if (PDO_MYSQL_G(dbg)) dbg_skip_trace = !PDO_MYSQL_G(dbg)->m->func_enter(PDO_MYSQL_G(dbg), __LINE__, __FILE__, func_name, strlen(func_name)); +#define PDO_DBG_RETURN(value) do { if (PDO_MYSQL_G(dbg)) PDO_MYSQL_G(dbg)->m->func_leave(PDO_MYSQL_G(dbg), __LINE__, __FILE__); return (value); } while (0) +#define PDO_DBG_VOID_RETURN do { if (PDO_MYSQL_G(dbg)) PDO_MYSQL_G(dbg)->m->func_leave(PDO_MYSQL_G(dbg), __LINE__, __FILE__); return; } while (0) + +#else +#define PDO_DBG_ENABLED 0 + +static inline void PDO_DBG_INF(char *msg) {} +static inline void PDO_DBG_ERR(char *msg) {} +static inline void PDO_DBG_INF_FMT(char *format, ...) {} +static inline void PDO_DBG_ERR_FMT(char *format, ...) {} +static inline void PDO_DBG_ENTER(char *func_name) {} +#define PDO_DBG_RETURN(value) return (value) +#define PDO_DBG_VOID_RETURN return; + +#endif + +#if defined(PDO_USE_MYSQLND) +#include "ext/mysqlnd/mysqlnd_debug.h" +#endif + +#ifdef PDO_USE_MYSQLND +ZEND_BEGIN_MODULE_GLOBALS(pdo_mysql) + MYSQLND_THD_ZVAL_PCACHE *mysqlnd_thd_zval_cache; + long cache_size; +#ifndef PHP_WIN32 + char *default_socket; +#endif +#if PDO_DBG_ENABLED + char *debug; /* The actual string */ + MYSQLND_DEBUG *dbg; /* The DBG object */ +#endif +ZEND_END_MODULE_GLOBALS(pdo_mysql) + +ZEND_EXTERN_MODULE_GLOBALS(pdo_mysql); +#endif + +#ifdef ZTS +#define PDO_MYSQL_G(v) TSRMG(pdo_mysql_globals_id, zend_pdo_mysql_globals *, v) +#else +#define PDO_MYSQL_G(v) (pdo_mysql_globals.v) +#endif + typedef struct { const char *file; @@ -38,8 +98,11 @@ typedef struct { unsigned attached:1; unsigned buffered:1; unsigned emulate_prepare:1; - unsigned _reserved:31; + unsigned fetch_table_names:1; + unsigned _reserved:31; +#if !PDO_USE_MYSQLND unsigned long max_buffer_size; +#endif pdo_mysql_error_info einfo; } pdo_mysql_db_handle; @@ -51,22 +114,31 @@ typedef struct { typedef struct { pdo_mysql_db_handle *H; MYSQL_RES *result; - MYSQL_FIELD *fields; + const MYSQL_FIELD *fields; MYSQL_ROW current_data; +#if PDO_USE_MYSQLND + unsigned long *current_lengths; +#else long *current_lengths; +#endif pdo_mysql_error_info einfo; -#if HAVE_MYSQL_STMT_PREPARE - MYSQL_STMT *stmt; - +#if HAVE_MYSQL_STMT_PREPARE || PDO_USE_MYSQLND +#if PDO_USE_MYSQLND + MYSQLND_STMT *stmt; +#else + MYSQL_STMT *stmt; +#endif int num_params; - MYSQL_BIND *params; + PDO_MYSQL_PARAM_BIND *params; +#ifndef PDO_USE_MYSQLND my_bool *in_null; - unsigned long *in_length; - - MYSQL_BIND *bound_result; + unsigned long *in_length; +#endif + PDO_MYSQL_PARAM_BIND *bound_result; my_bool *out_null; - unsigned long *out_length; - unsigned max_length:1; + unsigned long *out_length; + unsigned int params_given; + unsigned max_length:1; #endif } pdo_mysql_stmt; @@ -81,19 +153,13 @@ extern struct pdo_stmt_methods mysql_stmt_methods; enum { PDO_MYSQL_ATTR_USE_BUFFERED_QUERY = PDO_ATTR_DRIVER_SPECIFIC, PDO_MYSQL_ATTR_LOCAL_INFILE, +#ifndef PDO_USE_MYSQLND PDO_MYSQL_ATTR_INIT_COMMAND, PDO_MYSQL_ATTR_READ_DEFAULT_FILE, PDO_MYSQL_ATTR_READ_DEFAULT_GROUP, PDO_MYSQL_ATTR_MAX_BUFFER_SIZE, +#endif PDO_MYSQL_ATTR_DIRECT_QUERY, }; -#ifndef PDO_MYSQL_UNIX_ADDR -# ifdef PHP_WIN32 -# define PDO_MYSQL_UNIX_ADDR "MySQL" -# else -# define PDO_MYSQL_UNIX_ADDR "/tmp/mysql.sock" -# endif -#endif - #endif |