diff options
Diffstat (limited to 'ext/mysql/php_mysql.c')
| -rw-r--r-- | ext/mysql/php_mysql.c | 543 | 
1 files changed, 307 insertions, 236 deletions
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));  }  /* }}} */  | 
