summaryrefslogtreecommitdiff
path: root/ext/pdo_mysql/pdo_mysql.c
diff options
context:
space:
mode:
authorJohannes Schlüter <johannes@php.net>2008-07-21 13:09:28 +0000
committerJohannes Schlüter <johannes@php.net>2008-07-21 13:09:28 +0000
commitbe0793d2e7892a394c3d7105e157ede37d692400 (patch)
tree3f613ef2beddf8dfc099250fd58efcc90b978a9e /ext/pdo_mysql/pdo_mysql.c
parentc6c238c772b2762c51893c22ba8ef3f2d1b6f740 (diff)
downloadphp-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-xext/pdo_mysql/pdo_mysql.c216
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: