summaryrefslogtreecommitdiff
path: root/ext/mysqli/mysqli_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mysqli/mysqli_api.c')
-rw-r--r--ext/mysqli/mysqli_api.c145
1 files changed, 120 insertions, 25 deletions
diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c
index b87b741a1..81cfeef7e 100644
--- a/ext/mysqli/mysqli_api.c
+++ b/ext/mysqli/mysqli_api.c
@@ -2,7 +2,7 @@
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2009 The PHP Group |
+ | Copyright (c) 1997-2010 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 |
@@ -17,7 +17,7 @@
| Ulf Wendel <uw@php.net> |
+----------------------------------------------------------------------+
- $Id: mysqli_api.c 289630 2009-10-14 13:51:25Z johannes $
+ $Id: mysqli_api.c 294543 2010-02-04 20:28:55Z johannes $
*/
#ifdef HAVE_CONFIG_H
@@ -31,7 +31,6 @@
#include "php_globals.h"
#include "ext/standard/info.h"
#include "php_mysqli_structs.h"
-#include "ext/mysqlnd/mysqlnd_portability.h"
/* {{{ proto mixed mysqli_affected_rows(object link)
Get number of affected rows in previous MySQL operation */
@@ -552,22 +551,12 @@ PHP_FUNCTION(mysqli_character_set_name)
}
/* }}} */
-/* {{{ proto bool mysqli_close(object link)
- Close connection */
-PHP_FUNCTION(mysqli_close)
-{
- zval *mysql_link;
- MY_MYSQL *mysql;
-
- if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
- return;
- }
-
- MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED);
+/* {{{ php_mysqli_close */
+void php_mysqli_close(MY_MYSQL * mysql, int close_type TSRMLS_DC)
+{
if (!mysql->persistent) {
- mysqli_close(mysql->mysql, MYSQLI_CLOSE_EXPLICIT);
- mysql->mysql = NULL;
+ mysqli_close(mysql->mysql, close_type);
} else {
zend_rsrc_list_entry *le;
if (zend_hash_find(&EG(persistent_list), mysql->hash_key, strlen(mysql->hash_key) + 1, (void **)&le) == SUCCESS) {
@@ -580,9 +569,29 @@ PHP_FUNCTION(mysqli_close)
MyG(num_inactive_persistent)++;
}
}
+ mysql->persistent = FALSE;
}
+ mysql->mysql = NULL;
php_clear_mysql(mysql);
+}
+/* }}} */
+
+
+/* {{{ proto bool mysqli_close(object link)
+ Close connection */
+PHP_FUNCTION(mysqli_close)
+{
+ zval *mysql_link;
+ MY_MYSQL *mysql;
+
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
+ return;
+ }
+
+ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED);
+
+ php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT TSRMLS_CC);
MYSQLI_CLEAR_RESOURCE(&mysql_link);
efree(mysql);
@@ -1324,9 +1333,9 @@ PHP_FUNCTION(mysqli_info)
}
/* }}} */
-/* {{{ proto resource mysqli_init(void)
- Initialize mysqli and return a resource for use with mysql_real_connect */
-PHP_FUNCTION(mysqli_init)
+
+/* {{{ php_mysqli_init() */
+void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS)
{
MYSQLI_RESOURCE *mysqli_resource;
MY_MYSQL *mysql;
@@ -1363,6 +1372,15 @@ PHP_FUNCTION(mysqli_init)
}
/* }}} */
+
+/* {{{ proto resource mysqli_init(void)
+ Initialize mysqli and return a resource for use with mysql_real_connect */
+PHP_FUNCTION(mysqli_init)
+{
+ php_mysqli_init(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+}
+/* }}} */
+
/* {{{ proto mixed mysqli_insert_id(object link)
Get the ID generated from the previous INSERT operation */
PHP_FUNCTION(mysqli_insert_id)
@@ -1579,6 +1597,68 @@ PHP_FUNCTION(mysqli_num_rows)
}
/* }}} */
+/* {{{ mysqli_options_get_option_zval_type */
+static int mysqli_options_get_option_zval_type(int option)
+{
+ switch (option) {
+#ifdef MYSQLI_USE_MYSQLND
+#if PHP_MAJOR_VERSION >= 6
+ case MYSQLND_OPT_NUMERIC_AND_DATETIME_AS_UNICODE:
+#endif
+ case MYSQLND_OPT_NET_CMD_BUFFER_SIZE:
+ case MYSQLND_OPT_NET_READ_BUFFER_SIZE:
+#ifdef MYSQLND_STRING_TO_INT_CONVERSION
+ case MYSQLND_OPT_INT_AND_FLOAT_NATIVE:
+#endif
+#endif /* MYSQLI_USE_MYSQLND */
+ case MYSQL_OPT_CONNECT_TIMEOUT:
+#ifdef MYSQL_REPORT_DATA_TRUNCATION
+ case MYSQL_REPORT_DATA_TRUNCATION:
+#endif
+ case MYSQL_OPT_LOCAL_INFILE:
+ case MYSQL_OPT_NAMED_PIPE:
+#ifdef MYSQL_OPT_PROTOCOL
+ case MYSQL_OPT_PROTOCOL:
+#endif /* MySQL 4.1.0 */
+#ifdef MYSQL_OPT_READ_TIMEOUT
+ case MYSQL_OPT_READ_TIMEOUT:
+ case MYSQL_OPT_WRITE_TIMEOUT:
+ case MYSQL_OPT_GUESS_CONNECTION:
+ case MYSQL_OPT_USE_EMBEDDED_CONNECTION:
+ case MYSQL_OPT_USE_REMOTE_CONNECTION:
+ case MYSQL_SECURE_AUTH:
+#endif /* MySQL 4.1.1 */
+#ifdef MYSQL_OPT_RECONNECT
+ case MYSQL_OPT_RECONNECT:
+#endif /* MySQL 5.0.13 */
+#ifdef MYSQL_OPT_SSL_VERIFY_SERVER_CERT
+ case MYSQL_OPT_SSL_VERIFY_SERVER_CERT:
+#endif /* MySQL 5.0.23 */
+#ifdef MYSQL_OPT_COMPRESS
+ case MYSQL_OPT_COMPRESS:
+#endif /* mysqlnd @ PHP 5.3.2 */
+ return IS_LONG;
+
+#ifdef MYSQL_SHARED_MEMORY_BASE_NAME
+ case MYSQL_SHARED_MEMORY_BASE_NAME:
+#endif /* MySQL 4.1.0 */
+#ifdef MYSQL_SET_CLIENT_IP
+ case MYSQL_SET_CLIENT_IP:
+#endif /* MySQL 4.1.1 */
+ case MYSQL_READ_DEFAULT_FILE:
+ case MYSQL_READ_DEFAULT_GROUP:
+ case MYSQL_INIT_COMMAND:
+ case MYSQL_SET_CHARSET_NAME:
+ case MYSQL_SET_CHARSET_DIR:
+ return IS_STRING;
+
+ default:
+ return IS_NULL;
+ }
+}
+/* }}} */
+
+
/* {{{ proto bool mysqli_options(object link, int flags, mixed values)
Set options */
PHP_FUNCTION(mysqli_options)
@@ -1589,6 +1669,7 @@ PHP_FUNCTION(mysqli_options)
long mysql_option;
unsigned int l_value;
long ret;
+ int expected_type;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olz", &mysql_link, mysqli_link_class_entry, &mysql_option, &mysql_value) == FAILURE) {
return;
@@ -1600,16 +1681,30 @@ PHP_FUNCTION(mysqli_options)
RETURN_FALSE;
}
}
-
- switch (Z_TYPE_PP(&mysql_value)) {
+ expected_type = mysqli_options_get_option_zval_type(mysql_option);
+ if (expected_type != Z_TYPE_P(mysql_value)) {
+ switch (expected_type) {
+ case IS_STRING:
+ convert_to_string_ex(&mysql_value);
+ break;
+ case IS_LONG:
+ convert_to_long_ex(&mysql_value);
+ break;
+ default:
+ break;
+ }
+ }
+ switch (expected_type) {
case IS_STRING:
ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_PP(&mysql_value));
break;
- default:
- convert_to_long_ex(&mysql_value);
+ case IS_LONG:
l_value = Z_LVAL_PP(&mysql_value);
ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value);
break;
+ default:
+ ret = 1;
+ break;
}
RETURN_BOOL(!ret);
@@ -1673,7 +1768,7 @@ PHP_FUNCTION(mysqli_prepare)
memcpy(last_error, stmt->stmt->last_error, MYSQL_ERRMSG_SIZE);
memcpy(sqlstate, mysql->mysql->net.sqlstate, SQLSTATE_LENGTH+1);
#else
- mysqlnd_error_info error_info = mysql->mysql->error_info;
+ MYSQLND_ERROR_INFO error_info = mysql->mysql->error_info;
#endif
mysqli_stmt_close(stmt->stmt, FALSE);
stmt->stmt = NULL;