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/pdo_mysql.c | |
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/pdo_mysql.c')
-rwxr-xr-x | ext/pdo_mysql/pdo_mysql.c | 216 |
1 files changed, 177 insertions, 39 deletions
diff --git a/ext/pdo_mysql/pdo_mysql.c b/ext/pdo_mysql/pdo_mysql.c index 0000f8b40c..d13f45d71c 100755 --- a/ext/pdo_mysql/pdo_mysql.c +++ b/ext/pdo_mysql/pdo_mysql.c @@ -13,6 +13,7 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: George Schlossnagle <george@omniti.com> | + | Johannes Schlueter <johannes@mysql.com> | +----------------------------------------------------------------------+ */ @@ -30,82 +31,219 @@ #include "php_pdo_mysql.h" #include "php_pdo_mysql_int.h" -/* {{{ pdo_mysql_functions[] */ -const zend_function_entry pdo_mysql_functions[] = { - {NULL, NULL, NULL} -}; -/* }}} */ +#ifdef COMPILE_DL_PDO_MYSQL +ZEND_GET_MODULE(pdo_mysql) +#endif -/* {{{ pdo_mysql_functions[] */ -#if ZEND_MODULE_API_NO >= 20050922 -static const zend_module_dep pdo_mysql_deps[] = { - ZEND_MOD_REQUIRED("pdo") - {NULL, NULL, NULL} -}; +#if PDO_USE_MYSQLND +ZEND_DECLARE_MODULE_GLOBALS(pdo_mysql); + +#ifndef PHP_WIN32 +# ifndef PDO_MYSQL_UNIX_ADDR +# define PDO_MYSQL_UNIX_ADDR "/tmp/mysql.sock" +# endif #endif -/* }}} */ -/* {{{ pdo_mysql_module_entry */ -zend_module_entry pdo_mysql_module_entry = { -#if ZEND_MODULE_API_NO >= 20050922 - STANDARD_MODULE_HEADER_EX, NULL, - pdo_mysql_deps, -#else - STANDARD_MODULE_HEADER, + +/* {{{ PHP_INI_BEGIN +*/ +PHP_INI_BEGIN() +#ifndef PHP_WIN32 + STD_PHP_INI_ENTRY("pdo_mysql.default_socket", PDO_MYSQL_UNIX_ADDR, PHP_INI_SYSTEM, OnUpdateString, default_socket, zend_pdo_mysql_globals, pdo_mysql_globals) #endif - "pdo_mysql", - pdo_mysql_functions, - PHP_MINIT(pdo_mysql), - PHP_MSHUTDOWN(pdo_mysql), - NULL, - NULL, - PHP_MINFO(pdo_mysql), - "1.0.2", - STANDARD_MODULE_PROPERTIES -}; +#if PDO_DBG_ENABLED + STD_PHP_INI_ENTRY("pdo_mysql.debug", NULL, PHP_INI_SYSTEM, OnUpdateString, debug, zend_pdo_mysql_globals, pdo_mysql_globals) +#endif + STD_PHP_INI_ENTRY("pdo_mysql.cache_size", "2000", PHP_INI_SYSTEM, OnUpdateLong, cache_size, zend_pdo_mysql_globals, pdo_mysql_globals) +PHP_INI_END() /* }}} */ - -#ifdef COMPILE_DL_PDO_MYSQL -ZEND_GET_MODULE(pdo_mysql) #endif /* true global environment */ - +#ifdef PDO_USE_MYSQLND +static MYSQLND_ZVAL_PCACHE *mysql_mysqlnd_zval_cache; +#endif + + /* {{{ PHP_MINIT_FUNCTION */ -PHP_MINIT_FUNCTION(pdo_mysql) +static PHP_MINIT_FUNCTION(pdo_mysql) { +#if PDO_USE_MYSQLND + REGISTER_INI_ENTRIES(); +#endif + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_USE_BUFFERED_QUERY", (long)PDO_MYSQL_ATTR_USE_BUFFERED_QUERY); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_LOCAL_INFILE", (long)PDO_MYSQL_ATTR_LOCAL_INFILE); + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_LOCAL_INFILE", (long)PDO_MYSQL_ATTR_LOCAL_INFILE); +#ifndef PDO_USE_MYSQLND + REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_MAX_BUFFER_SIZE", (long)PDO_MYSQL_ATTR_MAX_BUFFER_SIZE); REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_INIT_COMMAND", (long)PDO_MYSQL_ATTR_INIT_COMMAND); REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_READ_DEFAULT_FILE", (long)PDO_MYSQL_ATTR_READ_DEFAULT_FILE); REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_READ_DEFAULT_GROUP", (long)PDO_MYSQL_ATTR_READ_DEFAULT_GROUP); - REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_MAX_BUFFER_SIZE", (long)PDO_MYSQL_ATTR_MAX_BUFFER_SIZE); +#endif REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_DIRECT_QUERY", (long)PDO_MYSQL_ATTR_DIRECT_QUERY); +#ifdef PDO_USE_MYSQLND + mysql_mysqlnd_zval_cache = mysqlnd_palloc_init_cache(PDO_MYSQL_G(cache_size)); +#endif + return php_pdo_register_driver(&pdo_mysql_driver); } /* }}} */ /* {{{ PHP_MSHUTDOWN_FUNCTION */ -PHP_MSHUTDOWN_FUNCTION(pdo_mysql) +static PHP_MSHUTDOWN_FUNCTION(pdo_mysql) { php_pdo_unregister_driver(&pdo_mysql_driver); +#if PDO_USE_MYSQLND + UNREGISTER_INI_ENTRIES(); +#endif + return SUCCESS; } /* }}} */ /* {{{ PHP_MINFO_FUNCTION */ -PHP_MINFO_FUNCTION(pdo_mysql) +static PHP_MINFO_FUNCTION(pdo_mysql) { php_info_print_table_start(); +#ifdef PDO_USE_MYSQLND + php_info_print_table_header(2, "PDO Driver for MySQL, mysql native driver version", mysql_get_client_info()); + + { + zval values; + + php_info_print_table_header(2, "Persistent cache", mysql_mysqlnd_zval_cache? "enabled":"disabled"); + + if (mysql_mysqlnd_zval_cache) { + /* Now report cache status */ + mysqlnd_palloc_stats(mysql_mysqlnd_zval_cache, &values); + mysqlnd_minfo_print_hash(&values); + zval_dtor(&values); + } + } +#else php_info_print_table_header(2, "PDO Driver for MySQL, client library version", mysql_get_client_info()); - php_info_print_table_row(2, "MYSQL_SOCKET", PDO_MYSQL_UNIX_ADDR); +#endif php_info_print_table_end(); + +#ifdef PDO_USE_MYSQLND + DISPLAY_INI_ENTRIES(); +#endif +} +/* }}} */ + + +#if PDO_USE_MYSQLND +/* {{{ PHP_RINIT_FUNCTION + */ +static PHP_RINIT_FUNCTION(pdo_mysql) +{ + PDO_MYSQL_G(mysqlnd_thd_zval_cache) = mysqlnd_palloc_rinit(mysql_mysqlnd_zval_cache); + +#if PDO_DBG_ENABLED + if (PDO_MYSQL_G(debug)) { + MYSQLND_DEBUG *dbg = mysqlnd_debug_init(TSRMLS_C); + if (!dbg) { + return FAILURE; + } + dbg->m->set_mode(dbg, PDO_MYSQL_G(debug)); + PDO_MYSQL_G(dbg) = dbg; + } +#endif + + return SUCCESS; +} +/* }}} */ + + +/* {{{ PHP_RSHUTDOWN_FUNCTION + */ +static PHP_RSHUTDOWN_FUNCTION(pdo_mysql) +{ + mysqlnd_palloc_rshutdown(PDO_MYSQL_G(mysqlnd_thd_zval_cache)); + +#if PDO_DBG_ENABLED + MYSQLND_DEBUG *dbg = PDO_MYSQL_G(dbg); + PDO_DBG_ENTER("RSHUTDOWN"); + if (dbg) { + dbg->m->close(dbg); + dbg->m->free_handle(dbg); + PDO_MYSQL_G(dbg) = NULL; + } +#endif + return SUCCESS; +} +/* }}} */ + + +/* {{{ PHP_GINIT_FUNCTION + */ +static PHP_GINIT_FUNCTION(pdo_mysql) +{ + pdo_mysql_globals->mysqlnd_thd_zval_cache = NULL; /* zval cache */ + pdo_mysql_globals->cache_size = 0; +#ifndef PHP_WIN32 + pdo_mysql_globals->default_socket = NULL; +#endif +#if PDO_DBG_ENABLED + pdo_mysql_globals->debug = NULL; /* The actual string */ + pdo_mysql_globals->dbg = NULL; /* The DBG object*/ +#endif } /* }}} */ +#endif + + +/* {{{ pdo_mysql_functions[] */ +const zend_function_entry pdo_mysql_functions[] = { + {NULL, NULL, NULL} +}; +/* }}} */ + +/* {{{ pdo_mysql_deps[] */ +#if ZEND_MODULE_API_NO >= 20050922 +static const zend_module_dep pdo_mysql_deps[] = { + ZEND_MOD_REQUIRED("pdo") +#ifdef PDO_USE_MYSQLND + ZEND_MOD_REQUIRED("mysqlnd") +#endif + {NULL, NULL, NULL} +}; +#endif +/* }}} */ + +/* {{{ pdo_mysql_module_entry */ +zend_module_entry pdo_mysql_module_entry = { + STANDARD_MODULE_HEADER_EX, NULL, + pdo_mysql_deps, + "pdo_mysql", + pdo_mysql_functions, + PHP_MINIT(pdo_mysql), + PHP_MSHUTDOWN(pdo_mysql), +#if PDO_USE_MYSQLND + PHP_RINIT(pdo_mysql), + PHP_RSHUTDOWN(pdo_mysql), +#else + NULL, + NULL, +#endif + PHP_MINFO(pdo_mysql), + "1.0.2", +#if PDO_USE_MYSQLND + PHP_MODULE_GLOBALS(pdo_mysql), + PHP_GINIT(pdo_mysql), + NULL, + NULL, + STANDARD_MODULE_PROPERTIES_EX +#else + STANDARD_MODULE_PROPERTIES +#endif +}; +/* }}} */ + /* * Local variables: |