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

Reply via email to