summaryrefslogtreecommitdiff
path: root/ext/mysql
diff options
context:
space:
mode:
authorAndrey Hristov <andrey@php.net>2007-10-05 21:23:56 +0000
committerAndrey Hristov <andrey@php.net>2007-10-05 21:23:56 +0000
commit8b9b553aa264d3c0afe611f49499e787004983c7 (patch)
tree840ea2b1127ec97a63f36ffda689a1a1fe5fb975 /ext/mysql
parent9f9495a48483aac9f6bc92ceea5841a8d243e2aa (diff)
downloadphp-git-8b9b553aa264d3c0afe611f49499e787004983c7.tar.gz
Import mysqlnd
Patch ext/mysql and ext/mysqli to support mysqlnd
Diffstat (limited to 'ext/mysql')
-rw-r--r--ext/mysql/config.m423
-rw-r--r--ext/mysql/config.w3215
-rw-r--r--ext/mysql/mysql_mysqlnd.h41
-rw-r--r--ext/mysql/php_mysql.c543
-rw-r--r--ext/mysql/php_mysql.h28
5 files changed, 400 insertions, 250 deletions
diff --git a/ext/mysql/config.m4 b/ext/mysql/config.m4
index 5870be02e1..f5ed71c6c5 100644
--- a/ext/mysql/config.m4
+++ b/ext/mysql/config.m4
@@ -40,7 +40,8 @@ AC_DEFUN([PHP_MYSQL_SOCKET_SEARCH], [
PHP_ARG_WITH(mysql, for MySQL support,
-[ --with-mysql[=DIR] Include MySQL support. DIR is the MySQL base directory])
+[ --with-mysql[=DIR] Include MySQL support. DIR is the MySQL base directory.
+ If mysqlnd is passed as DIR, the MySQL native driver will be used])
PHP_ARG_WITH(mysql-sock, for specified location of the MySQL UNIX socket,
[ --with-mysql-sock[=DIR] MySQL: Location of the MySQL unix socket pointer.
@@ -51,9 +52,11 @@ if test -z "$PHP_ZLIB_DIR"; then
[ --with-zlib-dir[=DIR] MySQL: Set the path to libz install prefix], no, no)
fi
+if test "$PHP_MYSQL" = "mysqlnd"; then
+ dnl enables build of mysqnd library
+ PHP_MYSQLND_ENABLED=yes
-if test "$PHP_MYSQL" != "no"; then
- AC_DEFINE(HAVE_MYSQL, 1, [Whether you have MySQL])
+elif test "$PHP_MYSQL" != "no"; then
AC_MSG_CHECKING([for MySQL UNIX socket location])
if test "$PHP_MYSQL_SOCK" != "no" && test "$PHP_MYSQL_SOCK" != "yes"; then
@@ -137,14 +140,22 @@ Note that the MySQL client library is not bundled anymore!])
PHP_ADD_LIBRARY_WITH_PATH($MYSQL_LIBNAME, $MYSQL_LIB_DIR, MYSQL_SHARED_LIBADD)
PHP_ADD_INCLUDE($MYSQL_INC_DIR)
- PHP_NEW_EXTENSION(mysql, php_mysql.c, $ext_shared)
-
MYSQL_MODULE_TYPE=external
MYSQL_LIBS="-L$MYSQL_LIB_DIR -l$MYSQL_LIBNAME $MYSQL_LIBS"
MYSQL_INCLUDE=-I$MYSQL_INC_DIR
- PHP_SUBST(MYSQL_SHARED_LIBADD)
PHP_SUBST_OLD(MYSQL_MODULE_TYPE)
PHP_SUBST_OLD(MYSQL_LIBS)
PHP_SUBST_OLD(MYSQL_INCLUDE)
fi
+
+dnl Enable extension
+if test "$PHP_MYSQL" != "no"; then
+ AC_DEFINE(HAVE_MYSQL, 1, [Whether you have MySQL])
+ PHP_NEW_EXTENSION(mysql, php_mysql.c, $ext_shared)
+ PHP_SUBST(MYSQL_SHARED_LIBADD)
+
+ if test "$PHP_MYSQLI" = "mysqlnd"; then
+ PHP_ADD_EXTENSION_DEP(mysqli, mysqlnd)
+ fi
+fi
diff --git a/ext/mysql/config.w32 b/ext/mysql/config.w32
index 95f689e1d6..45fc13c8d1 100644
--- a/ext/mysql/config.w32
+++ b/ext/mysql/config.w32
@@ -4,12 +4,17 @@
ARG_WITH("mysql", "MySQL support", "no");
if (PHP_MYSQL != "no") {
- if (CHECK_LIB("libmysql.lib", "mysql", PHP_MYSQL) &&
+ if (PHP_MYSQLI != "mysqlnd") {
+ if (CHECK_LIB("libmysql.lib", "mysql", PHP_MYSQL) &&
CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_MYSQL",
- PHP_MYSQL + "\\include;" + PHP_PHP_BUILD + "\\include\\mysql;" + PHP_MYSQL)) {
- EXTENSION("mysql", "php_mysql.c");
- AC_DEFINE('HAVE_MYSQL', 1, 'Have MySQL library');
+ PHP_MYSQL + "\\include;" + PHP_PHP_BUILD + "\\include\\mysql;" + PHP_MYSQL)) {
+ } else {
+ WARNING("mysql not enabled; libraries and headers not found");
+ }
} else {
- WARNING("mysql not enabled; libraries and headers not found");
+ AC_DEFINE('HAVE_MYSQLND', 1, 'MySQL native driver support enabled');
+ ADD_EXTENSION_DEP('mysql', 'mysqlnd', true);
}
+ EXTENSION("mysql", "php_mysql.c");
+ AC_DEFINE('HAVE_MYSQL', 1, 'Have MySQL library');
}
diff --git a/ext/mysql/mysql_mysqlnd.h b/ext/mysql/mysql_mysqlnd.h
new file mode 100644
index 0000000000..cc8d162a90
--- /dev/null
+++ b/ext/mysql/mysql_mysqlnd.h
@@ -0,0 +1,41 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | 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@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Georg Richter <georg@mysql.com> |
+ | Andrey Hristov <andrey@mysql.com> |
+ | Ulf Wendel <uwendel@mysql.com> |
+ +----------------------------------------------------------------------+
+
+*/
+
+#ifndef MYSQL_MYSQLND_H
+#define MYSQL_MYSQLND_H
+
+#include "ext/mysqlnd/mysqlnd_libmysql_compat.h"
+
+/* Here comes non-libmysql API to have less ifdefs in mysqli*/
+#define MYSQLI_CLOSE_EXPLICIT MYSQLND_CLOSE_EXPLICIT
+#define MYSQLI_CLOSE_IMPLICIT MYSQLND_CLOSE_IMPLICIT
+#define MYSQLI_CLOSE_DISCONNECTED MYSQLND_CLOSE_DISCONNECTED
+
+#define mysqli_result_is_unbuffered(r) ((r)->unbuf)
+#define mysqli_server_status(c) (c)->upsert_status.server_status
+#define mysqli_stmt_warning_count(s) mysqlnd_stmt_warning_count((s))
+#define mysqli_stmt_server_status(s) (s)->upsert_status.server_status
+#define mysqli_stmt_get_connection(s) (s)->conn
+#define mysqli_close(c, how) mysqlnd_close((c), (how))
+#define mysqli_stmt_close(c, implicit) mysqlnd_stmt_close((c), (implicit))
+#define mysqli_free_result(r, implicit) mysqlnd_free_result((r), (implicit))
+
+#endif
diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c
index 3edf6b9cb5..41a90c622d 100644
--- a/ext/mysql/php_mysql.c
+++ b/ext/mysql/php_mysql.c
@@ -33,6 +33,7 @@
#include "php_globals.h"
#include "ext/standard/info.h"
#include "ext/standard/php_string.h"
+#include "ext/standard/basic_functions.h"
#ifdef ZEND_ENGINE_2
# include "zend_exceptions.h"
@@ -64,7 +65,6 @@
# endif
#endif
-#include <mysql.h>
#include "php_ini.h"
#include "php_mysql.h"
@@ -79,7 +79,7 @@ static int le_result, le_link, le_plink;
#define SAFE_STRING(s) ((s)?(s):"")
-#if MYSQL_VERSION_ID > 32199
+#if MYSQL_VERSION_ID > 32199 || defined(HAVE_MYSQLND)
# define mysql_row_length_type unsigned long
# define HAVE_MYSQL_ERRNO
#else
@@ -89,7 +89,7 @@ static int le_result, le_link, le_plink;
# endif
#endif
-#if MYSQL_VERSION_ID >= 32032
+#if MYSQL_VERSION_ID >= 32032 || defined(HAVE_MYSQLND)
#define HAVE_GETINFO_FUNCS
#endif
@@ -101,10 +101,6 @@ static int le_result, le_link, le_plink;
#define MYSQL_HAS_YEAR
#endif
-#if (MYSQL_VERSION_ID >= 40113 && MYSQL_VERSION_ID < 50000) || MYSQL_VERSION_ID >= 50007
-#define MYSQL_HAS_SET_CHARSET
-#endif
-
#define MYSQL_ASSOC 1<<0
#define MYSQL_NUM 1<<1
#define MYSQL_BOTH (MYSQL_ASSOC|MYSQL_NUM)
@@ -124,13 +120,24 @@ ZEND_DECLARE_MODULE_GLOBALS(mysql)
static PHP_GINIT_FUNCTION(mysql);
typedef struct _php_mysql_conn {
- MYSQL conn;
+ MYSQL *conn;
int active_result_id;
+ int multi_query;
} php_mysql_conn;
+#ifdef HAVE_MYSQLND
+static MYSQLND_ZVAL_PCACHE *mysql_mysqlnd_zval_cache;
+static MYSQLND_QCACHE *mysql_mysqlnd_qcache;
+#endif
+
+#define MYSQL_DISABLE_MQ if (mysql->multi_query) { \
+ mysql_set_server_option(mysql->conn, MYSQL_OPTION_MULTI_STATEMENTS_OFF); \
+ mysql->multi_query = 0; \
+}
+
/* {{{ mysql_functions[]
*/
-const zend_function_entry mysql_functions[] = {
+static const zend_function_entry mysql_functions[] = {
PHP_FE(mysql_connect, NULL)
PHP_FE(mysql_pconnect, NULL)
PHP_FE(mysql_close, NULL)
@@ -184,10 +191,8 @@ const zend_function_entry mysql_functions[] = {
PHP_FE(mysql_get_server_info, NULL)
#endif
- PHP_FE(mysql_info, NULL)
-#ifdef MYSQL_HAS_SET_CHARSET
- PHP_FE(mysql_set_charset, NULL)
-#endif
+ PHP_FE(mysql_info, NULL)
+
/* for downwards compatability */
PHP_FALIAS(mysql, mysql_db_query, NULL)
PHP_FALIAS(mysql_fieldname, mysql_field_name, NULL)
@@ -216,10 +221,23 @@ const zend_function_entry mysql_functions[] = {
};
/* }}} */
+/* Dependancies */
+static const zend_module_dep mysql_deps[] = {
+#if defined(HAVE_MYSQLND)
+ ZEND_MOD_REQUIRED("mysqlnd")
+#endif
+ {NULL, NULL, NULL}
+};
+
/* {{{ mysql_module_entry
*/
zend_module_entry mysql_module_entry = {
- STANDARD_MODULE_HEADER,
+#if ZEND_MODULE_API_NO >= 20050922
+ STANDARD_MODULE_HEADER_EX, NULL,
+ mysql_deps,
+#elif ZEND_MODULE_API_NO >= 20010901
+ STANDARD_MODULE_HEADER,
+#endif
"mysql",
mysql_functions,
ZEND_MODULE_STARTUP_N(mysql),
@@ -244,6 +262,26 @@ void timeout(int sig);
#define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } }
+#if defined(HAVE_MYSQLND)
+#define PHPMY_UNBUFFERED_QUERY_CHECK() \
+{\
+ if (mysql->active_result_id) { \
+ do { \
+ int type; \
+ MYSQL_RES *mysql_result; \
+ \
+ mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \
+ if (mysql_result && type==le_result) { \
+ if (mysqli_result_is_unbuffered(mysql_result) && !mysql_eof(mysql_result)) { \
+ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Function called without first fetching all rows from a previous unbuffered query"); \
+ } \
+ zend_list_delete(mysql->active_result_id); \
+ mysql->active_result_id = 0; \
+ } \
+ } while(0); \
+ }\
+}
+#else
#define PHPMY_UNBUFFERED_QUERY_CHECK() \
{ \
if (mysql->active_result_id) { \
@@ -262,7 +300,8 @@ void timeout(int sig);
} \
} while(0); \
} \
-} \
+}
+#endif
/* {{{ _free_mysql_result
* This wrapper is required since mysql_free_result() returns an integer, and
@@ -295,7 +334,7 @@ static int php_mysql_select_db(php_mysql_conn *mysql, char *db TSRMLS_DC)
{
PHPMY_UNBUFFERED_QUERY_CHECK();
- if (mysql_select_db(&mysql->conn, db) != 0) {
+ if (mysql_select_db(mysql->conn, db) != 0) {
return 0;
} else {
return 1;
@@ -311,7 +350,7 @@ static void _close_mysql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
void (*handler) (int);
handler = signal(SIGPIPE, SIG_IGN);
- mysql_close(&link->conn);
+ mysql_close(link->conn);
signal(SIGPIPE, handler);
efree(link);
MySG(num_links)--;
@@ -326,7 +365,7 @@ static void _close_mysql_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC)
void (*handler) (int);
handler = signal(SIGPIPE, SIG_IGN);
- mysql_close(&link->conn);
+ mysql_close(link->conn);
signal(SIGPIPE, handler);
free(link);
@@ -361,6 +400,10 @@ PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("mysql.default_socket", NULL, PHP_INI_ALL, OnUpdateStringUnempty, default_socket, zend_mysql_globals, mysql_globals)
STD_PHP_INI_ENTRY("mysql.connect_timeout", "60", PHP_INI_ALL, OnUpdateLong, connect_timeout, zend_mysql_globals, mysql_globals)
STD_PHP_INI_BOOLEAN("mysql.trace_mode", "0", PHP_INI_ALL, OnUpdateLong, trace_mode, zend_mysql_globals, mysql_globals)
+ STD_PHP_INI_BOOLEAN("mysql.allow_local_infile", "1", PHP_INI_SYSTEM, OnUpdateLong, allow_local_infile, zend_mysql_globals, mysql_globals)
+#ifdef HAVE_MYSQLND
+ STD_PHP_INI_ENTRY("mysql.cache_size", "2000", PHP_INI_SYSTEM, OnUpdateLong, cache_size, zend_mysql_globals, mysql_globals)
+#endif
PHP_INI_END()
/* }}} */
@@ -377,7 +420,12 @@ static PHP_GINIT_FUNCTION(mysql)
mysql_globals->connect_error = NULL;
mysql_globals->connect_timeout = 0;
mysql_globals->trace_mode = 0;
+ mysql_globals->allow_local_infile = 1;
mysql_globals->result_allocated = 0;
+#ifdef HAVE_MYSQLND
+ mysql_globals->cache_size = 0;
+ mysql_globals->mysqlnd_thd_zval_cache = NULL;
+#endif
}
/* }}} */
@@ -401,11 +449,16 @@ ZEND_MODULE_STARTUP_D(mysql)
REGISTER_LONG_CONSTANT("MYSQL_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYSQL_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT);
+#ifndef HAVE_MYSQLND
#if MYSQL_VERSION_ID >= 40000
if (mysql_server_init(0, NULL, NULL)) {
return FAILURE;
}
#endif
+#else
+ mysql_mysqlnd_zval_cache = mysqlnd_palloc_init_cache(MySG(cache_size));
+ mysql_mysqlnd_qcache = mysqlnd_qcache_init_cache();
+#endif
return SUCCESS;
}
@@ -415,17 +468,25 @@ ZEND_MODULE_STARTUP_D(mysql)
*/
PHP_MSHUTDOWN_FUNCTION(mysql)
{
+#ifndef HAVE_MYSQLND
#if MYSQL_VERSION_ID >= 40000
#ifdef PHP_WIN32
unsigned long client_ver = mysql_get_client_version();
- /* Can't call mysql_server_end() multiple times prior to 5.0.42 on Windows */
- if ((client_ver > 50042 && client_ver < 50100) || client_ver > 50122) {
+ /*
+ Can't call mysql_server_end() multiple times prior to 5.0.42 on Windows.
+ PHP bug#41350 MySQL bug#25621
+ */
+ if ((client_ver >= 50042 && client_ver < 50100) || client_ver > 50122) {
mysql_server_end();
}
#else
mysql_server_end();
#endif
#endif
+#else
+ mysqlnd_palloc_free_cache(mysql_mysqlnd_zval_cache);
+ mysqlnd_qcache_free_cache_reference(&mysql_mysqlnd_qcache);
+#endif
UNREGISTER_INI_ENTRIES();
return SUCCESS;
@@ -436,7 +497,7 @@ PHP_MSHUTDOWN_FUNCTION(mysql)
*/
PHP_RINIT_FUNCTION(mysql)
{
-#if defined(ZTS) && MYSQL_VERSION_ID >= 40000
+#if !defined(HAVE_MYSQLND) && defined(ZTS) && MYSQL_VERSION_ID >= 40000
if (mysql_thread_init()) {
return FAILURE;
}
@@ -448,6 +509,10 @@ PHP_RINIT_FUNCTION(mysql)
MySG(connect_errno) =0;
MySG(result_allocated) = 0;
+#ifdef HAVE_MYSQLND
+ MySG(mysqlnd_thd_zval_cache) = mysqlnd_palloc_rinit(mysql_mysqlnd_zval_cache);
+#endif
+
return SUCCESS;
}
/* }}} */
@@ -456,7 +521,7 @@ PHP_RINIT_FUNCTION(mysql)
*/
PHP_RSHUTDOWN_FUNCTION(mysql)
{
-#if defined(ZTS) && MYSQL_VERSION_ID >= 40000
+#if !defined(HAVE_MYSQLND) && defined(ZTS) && MYSQL_VERSION_ID >= 40000
mysql_thread_end();
#endif
@@ -469,6 +534,10 @@ PHP_RSHUTDOWN_FUNCTION(mysql)
if (MySG(connect_error)!=NULL) {
efree(MySG(connect_error));
}
+#ifdef HAVE_MYSQLND
+ mysqlnd_palloc_rshutdown(MySG(mysqlnd_thd_zval_cache));
+#endif
+
return SUCCESS;
}
/* }}} */
@@ -486,12 +555,26 @@ PHP_MINFO_FUNCTION(mysql)
snprintf(buf, sizeof(buf), "%ld", MySG(num_links));
php_info_print_table_row(2, "Active Links", buf);
php_info_print_table_row(2, "Client API version", mysql_get_client_info());
-#if !defined (PHP_WIN32) && !defined (NETWARE)
+#if !defined (PHP_WIN32) && !defined (NETWARE) && !defined(HAVE_MYSQLND)
php_info_print_table_row(2, "MYSQL_MODULE_TYPE", PHP_MYSQL_TYPE);
php_info_print_table_row(2, "MYSQL_SOCKET", MYSQL_UNIX_ADDR);
php_info_print_table_row(2, "MYSQL_INCLUDE", PHP_MYSQL_INCLUDE);
php_info_print_table_row(2, "MYSQL_LIBS", PHP_MYSQL_LIBS);
#endif
+#if defined(HAVE_MYSQLND)
+ {
+ 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);
+ }
+ }
+#endif
php_info_print_table_end();
@@ -511,9 +594,14 @@ PHP_MINFO_FUNCTION(mysql)
MYSQL_DO_CONNECT_CLEANUP(); \
RETURN_FALSE;
+#ifdef HAVE_MYSQLND
+#define MYSQL_PORT 0
+#endif
+
static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
{
char *user=NULL, *passwd=NULL, *host_and_port=NULL, *socket=NULL, *tmp=NULL, *host=NULL;
+ int user_len, passwd_len, host_len;
char *hashed_details=NULL;
int hashed_details_length, port = MYSQL_PORT;
int client_flags = 0;
@@ -521,7 +609,6 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
#if MYSQL_VERSION_ID <= 32230
void (*handler) (int);
#endif
- zval **z_host=NULL, **z_user=NULL, **z_passwd=NULL, **z_new_link=NULL, **z_client_flags=NULL;
zend_bool free_host=0, new_link=0;
long connect_timeout;
@@ -560,93 +647,20 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
user = MySG(default_user);
passwd = MySG(default_password);
- switch(ZEND_NUM_ARGS()) {
- case 0: /* defaults */
- break;
- case 1: {
- if (zend_get_parameters_ex(1, &z_host)==FAILURE) {
- MYSQL_DO_CONNECT_RETURN_FALSE();
- }
- }
- break;
- case 2: {
- if (zend_get_parameters_ex(2, &z_host, &z_user)==FAILURE) {
- MYSQL_DO_CONNECT_RETURN_FALSE();
- }
- convert_to_string_ex(z_user);
- user = Z_STRVAL_PP(z_user);
- }
- break;
- case 3: {
- if (zend_get_parameters_ex(3, &z_host, &z_user, &z_passwd) == FAILURE) {
- MYSQL_DO_CONNECT_RETURN_FALSE();
- }
- convert_to_string_ex(z_user);
- convert_to_string_ex(z_passwd);
- user = Z_STRVAL_PP(z_user);
- passwd = Z_STRVAL_PP(z_passwd);
- }
- break;
- case 4: {
- if (!persistent) {
- if (zend_get_parameters_ex(4, &z_host, &z_user, &z_passwd, &z_new_link) == FAILURE) {
- MYSQL_DO_CONNECT_RETURN_FALSE();
- }
- convert_to_string_ex(z_user);
- convert_to_string_ex(z_passwd);
- convert_to_boolean_ex(z_new_link);
- user = Z_STRVAL_PP(z_user);
- passwd = Z_STRVAL_PP(z_passwd);
- new_link = Z_BVAL_PP(z_new_link);
- }
- else {
- if (zend_get_parameters_ex(4, &z_host, &z_user, &z_passwd, &z_client_flags) == FAILURE) {
- MYSQL_DO_CONNECT_RETURN_FALSE();
- }
- convert_to_string_ex(z_user);
- convert_to_string_ex(z_passwd);
- convert_to_long_ex(z_client_flags);
- user = Z_STRVAL_PP(z_user);
- passwd = Z_STRVAL_PP(z_passwd);
- client_flags = Z_LVAL_PP(z_client_flags);
- }
- }
- break;
- case 5: {
- if (zend_get_parameters_ex(5, &z_host, &z_user, &z_passwd, &z_new_link, &z_client_flags) == FAILURE) {
- MYSQL_DO_CONNECT_RETURN_FALSE();
- }
- convert_to_string_ex(z_user);
- convert_to_string_ex(z_passwd);
- convert_to_boolean_ex(z_new_link);
- convert_to_long_ex(z_client_flags);
- user = Z_STRVAL_PP(z_user);
- passwd = Z_STRVAL_PP(z_passwd);
- new_link = Z_BVAL_PP(z_new_link);
- client_flags = Z_LVAL_PP(z_client_flags);
- }
- break;
- default:
- WRONG_PARAM_COUNT;
- break;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sssll", &host_and_port, &host_len,
+ &user, &user_len, &passwd, &passwd_len,
+ &new_link, &client_flags)==FAILURE) {
+ WRONG_PARAM_COUNT;
}
- /* disable local infile option for open_basedir */
- if (((PG(open_basedir) && PG(open_basedir)[0] != '\0') || PG(safe_mode)) && (client_flags & CLIENT_LOCAL_FILES)) {
- client_flags ^= CLIENT_LOCAL_FILES;
+
+ /* mysql_pconnect does not support new_link parameter */
+ if (persistent) {
+ client_flags= new_link;
}
- if (z_host) {
- SEPARATE_ZVAL(z_host); /* We may modify z_host if it contains a port, separate */
- convert_to_string_ex(z_host);
- host_and_port = Z_STRVAL_PP(z_host);
- if (z_user) {
- convert_to_string_ex(z_user);
- user = Z_STRVAL_PP(z_user);
- if (z_passwd) {
- convert_to_string_ex(z_passwd);
- passwd = Z_STRVAL_PP(z_passwd);
- }
- }
+ /* disable local infile option for open_basedir */
+ if (((PG(open_basedir) && PG(open_basedir)[0] != '\0') || PG(safe_mode)) && (client_flags & CLIENT_LOCAL_FILES)) {
+ client_flags ^= CLIENT_LOCAL_FILES;
}
hashed_details_length = spprintf(&hashed_details, 0, "mysql_%s_%s_%s_%d", SAFE_STRING(host_and_port), SAFE_STRING(user), SAFE_STRING(passwd), client_flags);
@@ -687,12 +701,12 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) { /* we don't */
zend_rsrc_list_entry new_le;
- if (MySG(max_links)!=-1 && MySG(num_links)>=MySG(max_links)) {
+ if (MySG(max_links) != -1 && MySG(num_links) >= MySG(max_links)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MySG(num_links));
efree(hashed_details);
MYSQL_DO_CONNECT_RETURN_FALSE();
}
- if (MySG(max_persistent)!=-1 && MySG(num_persistent)>=MySG(max_persistent)) {
+ if (MySG(max_persistent) != -1 && MySG(num_persistent) >= MySG(max_persistent)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%ld)", MySG(num_persistent));
efree(hashed_details);
MYSQL_DO_CONNECT_RETURN_FALSE();
@@ -700,28 +714,36 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
/* create the link */
mysql = (php_mysql_conn *) malloc(sizeof(php_mysql_conn));
mysql->active_result_id = 0;
-#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
- mysql_init(&mysql->conn);
-
- if (connect_timeout != -1) {
- mysql_options(&mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout);
- }
+ mysql->multi_query = 1;
+#ifndef HAVE_MYSQLND
+ mysql->conn = mysql_init(NULL);
+#else
+ mysql->conn = mysql_init(persistent);
+#endif
- if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) {
+ if (connect_timeout != -1)
+ mysql_options(mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout);
+#ifndef HAVE_MYSQLND
+ if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL)
#else
- if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) {
+ if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0,
+ port, socket, client_flags, MySG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL)
#endif
+ {
/* Populate connect error globals so that the error functions can read them */
- if (MySG(connect_error)!=NULL) efree(MySG(connect_error));
- MySG(connect_error)=estrdup(mysql_error(&mysql->conn));
+ if (MySG(connect_error) != NULL) {
+ efree(MySG(connect_error));
+ }
+ MySG(connect_error) = estrdup(mysql_error(mysql->conn));
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", MySG(connect_error));
#if defined(HAVE_MYSQL_ERRNO)
- MySG(connect_errno)=mysql_errno(&mysql->conn);
+ MySG(connect_errno) = mysql_errno(mysql->conn);
#endif
free(mysql);
efree(hashed_details);
MYSQL_DO_CONNECT_RETURN_FALSE();
}
+ mysql_options(mysql->conn, MYSQL_OPT_LOCAL_INFILE, (char *)&MySG(allow_local_infile));
/* hash it up */
Z_TYPE(new_le) = le_plink;
@@ -737,36 +759,31 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
if (Z_TYPE_P(le) != le_plink) {
MYSQL_DO_CONNECT_RETURN_FALSE();
}
+ mysql = (php_mysql_conn *) le->ptr;
+ mysql->active_result_id = 0;
+ mysql->multi_query = 1;
/* ensure that the link did not die */
-#if MYSQL_VERSION_ID > 32230 /* Use mysql_ping to ensure link is alive (and to reconnect if needed) */
- if (mysql_ping(le->ptr)) {
-#else /* Use mysql_stat() to check if server is alive */
- handler=signal(SIGPIPE, SIG_IGN);
-#if defined(HAVE_MYSQL_ERRNO) && defined(CR_SERVER_GONE_ERROR)
- mysql_stat(le->ptr);
- if (mysql_errno(&((php_mysql_conn *) le->ptr)->conn) == CR_SERVER_GONE_ERROR) {
-#else
- if (!strcasecmp(mysql_stat(le->ptr), "mysql server has gone away")) { /* the link died */
-#endif
- signal(SIGPIPE, handler);
-#endif /* end mysql_ping */
-#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
- if (mysql_real_connect(le->ptr, host, user, passwd, NULL, port, socket, client_flags)==NULL) {
+ if (mysql_ping(mysql->conn)) {
+ if (mysql_errno(mysql->conn) == 2006) {
+#ifndef HAVE_MYSQLND
+ if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL)
#else
- if (mysql_connect(le->ptr, host, user, passwd)==NULL) {
+ if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0,
+ port, socket, client_flags, MySG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL)
#endif
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Link to server lost, unable to reconnect");
- zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length+1);
- efree(hashed_details);
- MYSQL_DO_CONNECT_RETURN_FALSE();
+ {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Link to server lost, unable to reconnect");
+ zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length+1);
+ efree(hashed_details);
+ MYSQL_DO_CONNECT_RETURN_FALSE();
+ }
+ mysql_options(mysql->conn, MYSQL_OPT_LOCAL_INFILE, (char *)&MySG(allow_local_infile));
}
- }
-#if MYSQL_VERSION_ID < 32231
- signal(SIGPIPE, handler);
+ } else {
+#ifdef HAVE_MYSQLND
+ mysqlnd_restart_psession(mysql->conn);
#endif
-
- mysql = (php_mysql_conn *) le->ptr;
- mysql->active_result_id = 0;
+ }
}
ZEND_REGISTER_RESOURCE(return_value, mysql, le_plink);
} else { /* non persistent */
@@ -799,7 +816,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length+1);
}
}
- if (MySG(max_links)!=-1 && MySG(num_links)>=MySG(max_links)) {
+ if (MySG(max_links) != -1 && MySG(num_links) >= MySG(max_links)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MySG(num_links));
efree(hashed_details);
MYSQL_DO_CONNECT_RETURN_FALSE();
@@ -807,28 +824,41 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
mysql = (php_mysql_conn *) emalloc(sizeof(php_mysql_conn));
mysql->active_result_id = 0;
-#if MYSQL_VERSION_ID > 32199 /* this lets us set the port number */
- mysql_init(&mysql->conn);
+ mysql->multi_query = 1;
+#ifndef HAVE_MYSQLND
+ mysql->conn = mysql_init(NULL);
+#else
+ mysql->conn = mysql_init(persistent);
+#endif
- if (connect_timeout != -1) {
- mysql_options(&mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout);
- }
+ if (connect_timeout != -1)
+ mysql_options(mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout);
- if (mysql_real_connect(&mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) {
+#ifndef HAVE_MYSQLND
+ if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL)
#else
- if (mysql_connect(&mysql->conn, host, user, passwd)==NULL) {
+ if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0,
+ port, socket, client_flags, MySG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL)
#endif
+ {
/* Populate connect error globals so that the error functions can read them */
- if (MySG(connect_error)!=NULL) efree(MySG(connect_error));
- MySG(connect_error)=estrdup(mysql_error(&mysql->conn));
+ if (MySG(connect_error) != NULL) {
+ efree(MySG(connect_error));
+ }
+ MySG(connect_error) = estrdup(mysql_error(mysql->conn));
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", MySG(connect_error));
#if defined(HAVE_MYSQL_ERRNO)
- MySG(connect_errno)=mysql_errno(&mysql->conn);
+ MySG(connect_errno) = mysql_errno(mysql->conn);
+#endif
+ /* free mysql structure */
+#ifdef HAVE_MYSQLND
+ mysqli_close(mysql->conn, MYSQLI_CLOSE_DISCONNECTED);
#endif
efree(hashed_details);
efree(mysql);
MYSQL_DO_CONNECT_RETURN_FALSE();
}
+ mysql_options(mysql->conn, MYSQL_OPT_LOCAL_INFILE, (char *)&MySG(allow_local_infile));
/* add it to the list */
ZEND_REGISTER_RESOURCE(return_value, mysql, le_link);
@@ -997,7 +1027,7 @@ PHP_FUNCTION(mysql_get_host_info)
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
- RETURN_STRING((char *)mysql_get_host_info(&mysql->conn),1);
+ RETURN_STRING((char *)mysql_get_host_info(mysql->conn),1);
}
/* }}} */
@@ -1027,7 +1057,7 @@ PHP_FUNCTION(mysql_get_proto_info)
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
- RETURN_LONG(mysql_get_proto_info(&mysql->conn));
+ RETURN_LONG(mysql_get_proto_info(mysql->conn));
}
/* }}} */
@@ -1057,7 +1087,7 @@ PHP_FUNCTION(mysql_get_server_info)
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
- RETURN_STRING((char *)mysql_get_server_info(&mysql->conn),1);
+ RETURN_STRING((char *)mysql_get_server_info(mysql->conn),1);
}
/* }}} */
@@ -1081,7 +1111,7 @@ PHP_FUNCTION(mysql_info)
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
- if ((str = (char *)mysql_info(&mysql->conn))) {
+ if ((str = (char *)mysql_info(mysql->conn))) {
RETURN_STRING(str,1);
} else {
RETURN_FALSE;
@@ -1107,7 +1137,7 @@ PHP_FUNCTION(mysql_thread_id)
}
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
- RETURN_LONG(mysql_thread_id(&mysql->conn));
+ RETURN_LONG(mysql_thread_id(mysql->conn));
}
/* }}} */
@@ -1118,6 +1148,10 @@ PHP_FUNCTION(mysql_stat)
zval *mysql_link = NULL;
int id = -1;
php_mysql_conn *mysql;
+ char *stat;
+#ifdef HAVE_MYSQLND
+ uint stat_len;
+#endif
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
return;
@@ -1130,8 +1164,16 @@ PHP_FUNCTION(mysql_stat)
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
PHPMY_UNBUFFERED_QUERY_CHECK();
-
- RETURN_STRING((char *)mysql_stat(&mysql->conn), 1);
+#ifndef HAVE_MYSQLND
+ if ((stat = (char *)mysql_stat(mysql->conn))) {
+ RETURN_STRING(stat, 1);
+#else
+ if (mysqlnd_stat(mysql->conn, &stat, &stat_len) == PASS) {
+ RETURN_STRINGL(stat, stat_len, 0);
+#endif
+ } else {
+ RETURN_FALSE;
+ }
}
/* }}} */
@@ -1153,38 +1195,7 @@ PHP_FUNCTION(mysql_client_encoding)
}
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
-
- RETURN_STRING((char *)mysql_character_set_name(&mysql->conn), 1);
-}
-/* }}} */
-#endif
-
-#ifdef MYSQL_HAS_SET_CHARSET
-/* {{{ proto bool mysql_set_charset(string csname [, int link_identifier])
- sets client character set */
-PHP_FUNCTION(mysql_set_charset)
-{
- zval *mysql_link = NULL;
- char *csname;
- int id = -1, csname_len;
- php_mysql_conn *mysql;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &csname, &csname_len, &mysql_link) == FAILURE) {
- return;
- }
-
- if (ZEND_NUM_ARGS() == 1) {
- id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
- CHECK_LINK(id);
- }
-
- ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
-
- if (!mysql_set_character_set(&mysql->conn, csname)) {
- RETURN_TRUE;
- } else {
- RETURN_FALSE;
- }
+ RETURN_STRING((char *)mysql_character_set_name(mysql->conn), 1);
}
/* }}} */
#endif
@@ -1224,7 +1235,7 @@ PHP_FUNCTION(mysql_create_db)
convert_to_string_ex(db);
- if (mysql_create_db(&mysql->conn, Z_STRVAL_PP(db))==0) {
+ if (mysql_create_db(mysql->conn, Z_STRVAL_PP(db))==0) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -1263,7 +1274,7 @@ PHP_FUNCTION(mysql_drop_db)
convert_to_string_ex(db);
- if (mysql_drop_db(&mysql->conn, Z_STRVAL_PP(db))==0) {
+ if (mysql_drop_db(mysql->conn, Z_STRVAL_PP(db))==0) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -1291,8 +1302,11 @@ static void php_mysql_do_query_general(zval **query, zval **mysql_link, int link
PHPMY_UNBUFFERED_QUERY_CHECK();
+ MYSQL_DISABLE_MQ;
+
convert_to_string_ex(query);
+#ifndef HAVE_MYSQLND
/* check explain */
if (MySG(trace_mode)) {
if (!strncasecmp("select", Z_STRVAL_PP(query), 6)){
@@ -1300,14 +1314,14 @@ static void php_mysql_do_query_general(zval **query, zval **mysql_link, int link
char *newquery;
int newql = spprintf (&newquery, 0, "EXPLAIN %s", Z_STRVAL_PP(query));
- mysql_real_query(&mysql->conn, newquery, newql);
+ mysql_real_query(mysql->conn, newquery, newql);
efree (newquery);
- if (mysql_errno(&mysql->conn)) {
- php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "%s", mysql_error(&mysql->conn));
+ if (mysql_errno(mysql->conn)) {
+ php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "%s", mysql_error(mysql->conn));
RETURN_FALSE;
}
else {
- mysql_result = mysql_use_result(&mysql->conn);
+ mysql_result = mysql_use_result(mysql->conn);
while ((row = mysql_fetch_row(mysql_result))) {
if (!strcmp("ALL", row[1])) {
php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "Your query requires a full tablescan (table %s, %s rows affected). Use EXPLAIN to optimize your query.", row[0], row[6]);
@@ -1319,36 +1333,37 @@ static void php_mysql_do_query_general(zval **query, zval **mysql_link, int link
}
}
} /* end explain */
+#endif
/* mysql_query is binary unsafe, use mysql_real_query */
#if MYSQL_VERSION_ID > 32199
- if (mysql_real_query(&mysql->conn, Z_STRVAL_PP(query), Z_STRLEN_PP(query))!=0) {
+ if (mysql_real_query(mysql->conn, Z_STRVAL_PP(query), Z_STRLEN_PP(query))!=0) {
/* check possible error */
if (MySG(trace_mode)){
- if (mysql_errno(&mysql->conn)){
- php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "%s", mysql_error(&mysql->conn));
+ if (mysql_errno(mysql->conn)){
+ php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "%s", mysql_error(mysql->conn));
}
}
RETURN_FALSE;
}
#else
- if (mysql_query(&mysql->conn, Z_STRVAL_PP(query))!=0) {
+ if (mysql_query(mysql->conn, Z_STRVAL_PP(query))!=0) {
/* check possible error */
if (MySG(trace_mode)){
- if (mysql_errno(&mysql->conn)){
- php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "%s", mysql_error(&mysql->conn));
+ if (mysql_errno(mysql->conn)){
+ php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "%s", mysql_error(mysql->conn));
}
}
RETURN_FALSE;
}
#endif
if(use_store == MYSQL_USE_RESULT) {
- mysql_result=mysql_use_result(&mysql->conn);
+ mysql_result=mysql_use_result(mysql->conn);
} else {
- mysql_result=mysql_store_result(&mysql->conn);
+ mysql_result=mysql_store_result(mysql->conn);
}
if (!mysql_result) {
- if (PHP_MYSQL_VALID_RESULT(&mysql->conn)) { /* query should have returned rows */
+ if (PHP_MYSQL_VALID_RESULT(mysql->conn)) { /* query should have returned rows */
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save result set");
RETURN_FALSE;
} else {
@@ -1474,7 +1489,7 @@ PHP_FUNCTION(mysql_list_dbs)
PHPMY_UNBUFFERED_QUERY_CHECK();
- if ((mysql_result=mysql_list_dbs(&mysql->conn, NULL))==NULL) {
+ if ((mysql_result=mysql_list_dbs(mysql->conn, NULL))==NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL query result");
RETURN_FALSE;
}
@@ -1519,7 +1534,7 @@ PHP_FUNCTION(mysql_list_tables)
PHPMY_UNBUFFERED_QUERY_CHECK();
- if ((mysql_result=mysql_list_tables(&mysql->conn, NULL))==NULL) {
+ if ((mysql_result=mysql_list_tables(mysql->conn, NULL))==NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL query result");
RETURN_FALSE;
}
@@ -1566,7 +1581,7 @@ PHP_FUNCTION(mysql_list_fields)
PHPMY_UNBUFFERED_QUERY_CHECK();
convert_to_string_ex(table);
- if ((mysql_result=mysql_list_fields(&mysql->conn, Z_STRVAL_PP(table), NULL))==NULL) {
+ if ((mysql_result=mysql_list_fields(mysql->conn, Z_STRVAL_PP(table), NULL))==NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL query result");
RETURN_FALSE;
}
@@ -1596,7 +1611,7 @@ PHP_FUNCTION(mysql_list_processes)
PHPMY_UNBUFFERED_QUERY_CHECK();
- mysql_result = mysql_list_processes(&mysql->conn);
+ mysql_result = mysql_list_processes(mysql->conn);
if (mysql_result == NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL query result");
RETURN_FALSE;
@@ -1639,7 +1654,7 @@ PHP_FUNCTION(mysql_error)
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
- RETURN_STRING((char *)mysql_error(&mysql->conn), 1);
+ RETURN_STRING((char *)mysql_error(mysql->conn), 1);
}
/* }}} */
@@ -1677,7 +1692,7 @@ PHP_FUNCTION(mysql_errno)
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
- RETURN_LONG(mysql_errno(&mysql->conn));
+ RETURN_LONG(mysql_errno(mysql->conn));
}
#endif
/* }}} */
@@ -1710,7 +1725,7 @@ PHP_FUNCTION(mysql_affected_rows)
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
/* conversion from int64 to long happing here */
- Z_LVAL_P(return_value) = (long) mysql_affected_rows(&mysql->conn);
+ Z_LVAL_P(return_value) = (long) mysql_affected_rows(mysql->conn);
Z_TYPE_P(return_value) = IS_LONG;
}
/* }}} */
@@ -1722,8 +1737,9 @@ PHP_FUNCTION(mysql_escape_string)
{
zval **str;
+
if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &str) == FAILURE) {
- ZEND_WRONG_PARAM_COUNT();
+ WRONG_PARAM_COUNT;
}
convert_to_string_ex(str);
/* assume worst case situation, which is 2x of the original string.
@@ -1738,7 +1754,6 @@ PHP_FUNCTION(mysql_escape_string)
if (MySG(trace_mode)){
php_error_docref("function.mysql-real-escape-string" TSRMLS_CC, E_WARNING, "This function is deprecated; use mysql_real_escape_string() instead.");
}
-
}
/* }}} */
@@ -1765,7 +1780,7 @@ PHP_FUNCTION(mysql_real_escape_string)
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
new_str = safe_emalloc(str_len, 2, 1);
- new_str_len = mysql_real_escape_string(&mysql->conn, new_str, str, str_len);
+ new_str_len = mysql_real_escape_string(mysql->conn, new_str, str, str_len);
new_str = erealloc(new_str, new_str_len + 1);
RETURN_STRINGL(new_str, new_str_len, 0);
@@ -1799,7 +1814,7 @@ PHP_FUNCTION(mysql_insert_id)
ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, id, "MySQL-Link", le_link, le_plink);
/* conversion from int64 to long happing here */
- Z_LVAL_P(return_value) = (long) mysql_insert_id(&mysql->conn);
+ Z_LVAL_P(return_value) = (long) mysql_insert_id(mysql->conn);
Z_TYPE_P(return_value) = IS_LONG;
}
/* }}} */
@@ -1811,8 +1826,10 @@ PHP_FUNCTION(mysql_result)
{
zval **result, **row, **field=NULL;
MYSQL_RES *mysql_result;
+#ifndef HAVE_MYSQLND
MYSQL_ROW sql_row;
mysql_row_length_type *sql_row_lengths;
+#endif
int field_offset=0;
switch (ZEND_NUM_ARGS()) {
@@ -1839,10 +1856,6 @@ PHP_FUNCTION(mysql_result)
RETURN_FALSE;
}
mysql_data_seek(mysql_result, Z_LVAL_PP(row));
- if ((sql_row=mysql_fetch_row(mysql_result))==NULL
- || (sql_row_lengths=mysql_fetch_lengths(mysql_result))==NULL) { /* shouldn't happen? */
- RETURN_FALSE;
- }
if (field) {
switch(Z_TYPE_PP(field)) {
@@ -1892,6 +1905,11 @@ PHP_FUNCTION(mysql_result)
}
}
+#ifndef HAVE_MYSQLND
+ if ((sql_row=mysql_fetch_row(mysql_result))==NULL
+ || (sql_row_lengths=mysql_fetch_lengths(mysql_result))==NULL) { /* shouldn't happen? */
+ RETURN_FALSE;
+ }
if (sql_row[field_offset]) {
Z_TYPE_P(return_value) = IS_STRING;
@@ -1904,6 +1922,9 @@ PHP_FUNCTION(mysql_result)
} else {
Z_TYPE_P(return_value) = IS_NULL;
}
+#else
+ mysqlnd_result_fetch_field_data(mysql_result, field_offset, return_value);
+#endif
}
/* }}} */
@@ -1951,12 +1972,14 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type,
{
zval **result, **arg2;
MYSQL_RES *mysql_result;
- MYSQL_ROW mysql_row;
- MYSQL_FIELD *mysql_field;
- mysql_row_length_type *mysql_row_lengths;
- int i;
zval *res, *ctor_params = NULL;
zend_class_entry *ce = NULL;
+#ifndef HAVE_MYSQLND
+ int i;
+ MYSQL_FIELD *mysql_field;
+ MYSQL_ROW mysql_row;
+ mysql_row_length_type *mysql_row_lengths;
+#endif
#ifdef ZEND_ENGINE_2
if (into_object) {
@@ -2007,20 +2030,24 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type,
}
if ((result_type & MYSQL_BOTH) == 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQL_NUM, MYSQL_ASSOC or MYSQL_BOTH.");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQL_NUM, MYSQL_ASSOC or MYSQL_BOTH");
}
ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result);
- if ((mysql_row=mysql_fetch_row(mysql_result))==NULL
- || (mysql_row_lengths=mysql_fetch_lengths(mysql_result))==NULL) {
+#ifndef HAVE_MYSQLND
+ if ((mysql_row = mysql_fetch_row(mysql_result)) == NULL ||
+ (mysql_row_lengths = mysql_fetch_lengths(mysql_result)) == NULL) {
RETURN_FALSE;
}
array_init(return_value);
mysql_field_seek(mysql_result, 0);
- for (mysql_field=mysql_fetch_field(mysql_result), i=0; mysql_field; mysql_field=mysql_fetch_field(mysql_result), i++) {
+ for (mysql_field = mysql_fetch_field(mysql_result), i = 0;
+ mysql_field;
+ mysql_field = mysql_fetch_field(mysql_result), i++)
+ {
if (mysql_row[i]) {
zval *data;
@@ -2053,9 +2080,13 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type,
}
}
}
+#else
+ mysqlnd_fetch_into(mysql_result, MYSQLND_FETCH_ASSOC, return_value, MYSQLND_MYSQL);
+#endif
#ifdef ZEND_ENGINE_2
- if (into_object) {
+ /* mysqlnd might return FALSE if no more rows */
+ if (into_object && Z_TYPE_P(return_value) != IS_BOOL) {
zval dataset = *return_value;
zend_fcall_info fci;
zend_fcall_info_cache fcc;
@@ -2127,7 +2158,19 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type,
Gets a result row as an enumerated array */
PHP_FUNCTION(mysql_fetch_row)
{
+#ifdef HAVE_MYSQLND
+ MYSQL_RES *result;
+ zval *mysql_result;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &mysql_result) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, -1, "MySQL result", le_result);
+
+ mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, return_value, MYSQLND_MYSQL);
+#else
php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_NUM, 1, 0);
+#endif
}
/* }}} */
@@ -2149,7 +2192,20 @@ PHP_FUNCTION(mysql_fetch_object)
Fetch a result row as an array (associative, numeric or both) */
PHP_FUNCTION(mysql_fetch_array)
{
+#ifndef HAVE_MYSQLND
php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 2, 0);
+#else
+ MYSQL_RES *result;
+ zval *mysql_result;
+ long mode = MYSQLND_FETCH_BOTH;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &mysql_result, &mode) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, -1, "MySQL result", le_result);
+
+ mysqlnd_fetch_into(result, mode, return_value, MYSQLND_MYSQL);
+#endif
}
/* }}} */
@@ -2158,7 +2214,19 @@ PHP_FUNCTION(mysql_fetch_array)
Fetch a result row as an associative array */
PHP_FUNCTION(mysql_fetch_assoc)
{
+#ifndef HAVE_MYSQLND
php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_ASSOC, 1, 0);
+#else
+ MYSQL_RES *result;
+ zval *mysql_result;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &mysql_result) == FAILURE) {
+ return;
+ }
+ ZEND_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, -1, "MySQL result", le_result);
+
+ mysqlnd_fetch_into(result, MYSQLND_FETCH_ASSOC, return_value, MYSQLND_MYSQL);
+#endif
}
/* }}} */
@@ -2223,6 +2291,9 @@ static char *php_mysql_get_field_name(int field_type)
case FIELD_TYPE_VAR_STRING:
return "string";
break;
+#if MYSQL_VERSION_ID > 50002 || defined(HAVE_MYSQLND)
+ case MYSQL_TYPE_BIT:
+#endif
#ifdef MYSQL_HAS_TINY
case FIELD_TYPE_TINY:
#endif
@@ -2585,7 +2656,7 @@ PHP_FUNCTION(mysql_ping)
PHPMY_UNBUFFERED_QUERY_CHECK();
- RETURN_BOOL(! mysql_ping(&mysql->conn));
+ RETURN_BOOL(! mysql_ping(mysql->conn));
}
/* }}} */
diff --git a/ext/mysql/php_mysql.h b/ext/mysql/php_mysql.h
index a088208a4b..fe21af15c5 100644
--- a/ext/mysql/php_mysql.h
+++ b/ext/mysql/php_mysql.h
@@ -34,6 +34,25 @@
#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
@@ -91,9 +110,6 @@ PHP_FUNCTION(mysql_stat);
PHP_FUNCTION(mysql_thread_id);
PHP_FUNCTION(mysql_client_encoding);
PHP_FUNCTION(mysql_ping);
-#if (MYSQL_VERSION_ID >= 40113 && MYSQL_VERSION_ID < 50000) || MYSQL_VERSION_ID >= 50007
-PHP_FUNCTION(mysql_set_charset);
-#endif
ZEND_BEGIN_MODULE_GLOBALS(mysql)
long default_link;
@@ -108,6 +124,12 @@ ZEND_BEGIN_MODULE_GLOBALS(mysql)
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