uw Tue, 03 Nov 2009 14:56:04 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=290170
Log: Fix for bug #49965 . Let mysqli_options() try to cast option values to the appropriate type. Bug: http://bugs.php.net/49965 (Assigned) Setting MYSQLI_OPT_CONNECT_TIMEOUT does not seem to have an effect on timeout Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_api.c U php/php-src/branches/PHP_5_3/ext/mysqli/tests/mysqli_options.phpt U php/php-src/trunk/ext/mysqli/mysqli_api.c U php/php-src/trunk/ext/mysqli/tests/mysqli_options.phpt Modified: php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_api.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_api.c 2009-11-03 13:14:33 UTC (rev 290169) +++ php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_api.c 2009-11-03 14:56:04 UTC (rev 290170) @@ -1589,6 +1589,66 @@ } /* }}} */ +/* {{{ 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: + case MYSQL_REPORT_DATA_TRUNCATION: + 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) @@ -1599,6 +1659,7 @@ 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; @@ -1610,16 +1671,30 @@ 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); Modified: php/php-src/branches/PHP_5_3/ext/mysqli/tests/mysqli_options.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqli/tests/mysqli_options.phpt 2009-11-03 13:14:33 UTC (rev 290169) +++ php/php-src/branches/PHP_5_3/ext/mysqli/tests/mysqli_options.phpt 2009-11-03 14:56:04 UTC (rev 290170) @@ -111,6 +111,8 @@ bool(true) %s(23) "MYSQLI_OPT_LOCAL_INFILE" bool(true) + +Notice: Array to string conversion in %s on line %d %s(19) "MYSQLI_INIT_COMMAND" bool(true) %s(25) "MYSQLI_READ_DEFAULT_GROUP" Modified: php/php-src/trunk/ext/mysqli/mysqli_api.c =================================================================== --- php/php-src/trunk/ext/mysqli/mysqli_api.c 2009-11-03 13:14:33 UTC (rev 290169) +++ php/php-src/trunk/ext/mysqli/mysqli_api.c 2009-11-03 14:56:04 UTC (rev 290170) @@ -1642,6 +1642,65 @@ } /* }}} */ +/* {{{ 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: + case MYSQL_REPORT_DATA_TRUNCATION: + 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) U Set options */ PHP_FUNCTION(mysqli_options) @@ -1652,6 +1711,7 @@ 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; @@ -1664,17 +1724,31 @@ } } - switch (Z_TYPE_PP(&mysql_value)) { - case IS_UNICODE: - zval_unicode_to_string(mysql_value TSRMLS_CC); + 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); Modified: php/php-src/trunk/ext/mysqli/tests/mysqli_options.phpt =================================================================== --- php/php-src/trunk/ext/mysqli/tests/mysqli_options.phpt 2009-11-03 13:14:33 UTC (rev 290169) +++ php/php-src/trunk/ext/mysqli/tests/mysqli_options.phpt 2009-11-03 14:56:04 UTC (rev 290170) @@ -111,6 +111,8 @@ bool(true) %s(23) "MYSQLI_OPT_LOCAL_INFILE" bool(true) + +Notice: Array to string conversion in %s on line %d %s(19) "MYSQLI_INIT_COMMAND" bool(true) %s(25) "MYSQLI_READ_DEFAULT_GROUP"
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php