]> granicus.if.org Git - php/commitdiff
ZTS fixes. Implemented Andrei's hints (simplifying unicode stuff)
authorGeorg Richter <georg@php.net>
Wed, 27 Sep 2006 15:25:52 +0000 (15:25 +0000)
committerGeorg Richter <georg@php.net>
Wed, 27 Sep 2006 15:25:52 +0000 (15:25 +0000)
ext/mysqli/mysqli.c
ext/mysqli/mysqli_api.c
ext/mysqli/mysqli_driver.c
ext/mysqli/mysqli_nonapi.c
ext/mysqli/mysqli_prop.c
ext/mysqli/php_mysqli.h

index d76845faf4232547da8524edcc0343b322dfda38..15c78d6501c9f5e3447724ab57c7a1245d6a0f23 100644 (file)
@@ -166,6 +166,13 @@ static void mysqli_link_free_storage(void *object TSRMLS_DC)
 }
 /* }}} */
 
+/* {{{ mysql_driver_free_storage */
+static void mysqli_driver_free_storage(void *object TSRMLS_DC)
+{
+       mysqli_objects_free_storage(object TSRMLS_CC);
+}
+/* }}} */
+
 /* {{{ mysqli_stmt_free_storage
  */
 static void mysqli_stmt_free_storage(void *object TSRMLS_DC)
@@ -251,22 +258,13 @@ zval *mysqli_read_property(zval *object, zval *member, int type TSRMLS_DC)
        }
 
        if (obj->prop_handler != NULL) {
-               ret = zend_u_hash_find(obj->prop_handler, UG(unicode)?IS_UNICODE:IS_STRING, Z_UNIVAL_P(member), Z_UNILEN_P(member)+1, (void **) &hnd);
+               ret = zend_u_hash_find(obj->prop_handler, ZEND_STR_TYPE, Z_UNIVAL_P(member), Z_UNILEN_P(member)+1, (void **) &hnd);
        }
 
        if (ret == SUCCESS) {
-               int is_driver;
 
-               if (UG(unicode)) {
-                       UChar *ustr = USTR_MAKE("mysqli_driver");
-                       is_driver = u_strcmp(obj->zo.ce->name.u, ustr);
-                       USTR_FREE(ustr);
-               } else {
-                       is_driver = strcmp(obj->zo.ce->name.s, "mysqli_driver");
-               }
-               
-               if (is_driver && (!obj->ptr || ((MYSQLI_RESOURCE *)(obj->ptr))->status < MYSQLI_STATUS_INITIALIZED)) {
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %R", UG(unicode)?IS_UNICODE:IS_STRING, obj->zo.ce->name );
+               if ((!obj->ptr || ((MYSQLI_RESOURCE *)(obj->ptr))->status < MYSQLI_STATUS_INITIALIZED)) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %v", obj->zo.ce->name );
                        retval = EG(uninitialized_zval_ptr);
                        return(retval);
                }
@@ -396,7 +394,7 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_
                mysqli_base_class = mysqli_base_class->parent;
        }
 
-       zend_u_hash_find(&classes, UG(unicode)?IS_UNICODE:IS_STRING, mysqli_base_class->name, mysqli_base_class->name_length + 1, 
+       zend_u_hash_find(&classes, ZEND_STR_TYPE, mysqli_base_class->name, mysqli_base_class->name_length + 1, 
                                        (void **) &intern->prop_handler);
 
        zend_object_std_init(&intern->zo, class_type TSRMLS_CC);
@@ -406,6 +404,8 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_
        /* link object */
        if (instanceof_function(class_type, mysqli_link_class_entry TSRMLS_CC)) {
                free_storage = mysqli_link_free_storage;
+       } else if (instanceof_function(class_type, mysqli_driver_class_entry TSRMLS_CC)) { /* stmt object */
+               free_storage = mysqli_driver_free_storage;
        } else if (instanceof_function(class_type, mysqli_stmt_class_entry TSRMLS_CC)) { /* stmt object */
                free_storage = mysqli_stmt_free_storage;
        } else if (instanceof_function(class_type, mysqli_result_class_entry TSRMLS_CC)) { /* result object */
@@ -720,7 +720,8 @@ ZEND_FUNCTION(mysqli_stmt_construct)
        zval                            *mysql_link;
        MY_STMT                         *stmt;
        MYSQLI_RESOURCE         *mysqli_resource;
-       MYSQLI_STRING           statement;
+       char                            *statement;
+       int                                     statement_len;
 
        switch (ZEND_NUM_ARGS())
        {
@@ -735,19 +736,16 @@ ZEND_FUNCTION(mysqli_stmt_construct)
                        stmt->stmt = mysql_stmt_init(mysql->mysql);
                break;
                case 2:
-                       if (zend_parse_parameters(2 TSRMLS_CC, "OT", &mysql_link, mysqli_link_class_entry, MYSQLI_GET_STRING(statement))==FAILURE) {
+                       if (zend_parse_parameters(2 TSRMLS_CC, "Os&", &mysql_link, mysqli_link_class_entry, &statement, &statement_len, UG(utf8_conv))==FAILURE) {
                                return;
                        }
                        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
                        stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
 
-                       MYSQLI_CONVERT_PARAM_STRING(statement, MYSQLI_CONV_UTF8);
-       
                        if ((stmt->stmt = mysql_stmt_init(mysql->mysql))) {
-                               mysql_stmt_prepare(stmt->stmt, (char *)statement.buf, statement.buflen);
+                               mysql_stmt_prepare(stmt->stmt, (char *)statement, statement_len);
                        }
-                       MYSQLI_FREE_STRING(statement);
                break;
                default:
                        WRONG_PARAM_COUNT;
@@ -885,7 +883,7 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags
                                UChar *ustr;
                                int ulen;
 
-                               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, row[i], field_len[i]);
+                               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, row[i], field_len[i] TSRMLS_CC);
                                ZVAL_UNICODEL(res, ustr, ulen, 0);
                        } else {
                                ZVAL_STRINGL(res, row[i], field_len[i], 1);     
@@ -902,7 +900,7 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags
                                        UChar *ustr;
                                        int ulen;
 
-                                       zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, fields[i].name, strlen(fields[i].name));
+                                       zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, fields[i].name, strlen(fields[i].name) TSRMLS_CC);
                                        /* maybe a bug in add_u_assoc_zval_ex: string is truncated when specifying ulen only */
                                        add_u_assoc_zval_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen + 1, res);
                                        efree(ustr);
index 2031aca73b235e1172f0ae3c3256dc7b90176b72..959df2d69f2c9d6902f79082132293179b73986e 100644 (file)
@@ -84,7 +84,8 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
        MY_STMT                 *stmt;
        zval                    *mysql_stmt;
        MYSQL_BIND              *bind;
-       MYSQLI_STRING   types;
+       char                    *types;
+       int                             types_len;
        unsigned long   rc;
 
        /* calculate and check number of parameters */
@@ -93,12 +94,12 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
                WRONG_PARAM_COUNT;
        }
 
-       if (zend_parse_method_parameters((getThis()) ? 1:2 TSRMLS_CC, getThis(), "Os", &mysql_stmt, mysqli_stmt_class_entry, MYSQLI_GET_STRING(types)) == FAILURE) {
+       if (zend_parse_method_parameters((getThis()) ? 1:2 TSRMLS_CC, getThis(), "Os&", &mysql_stmt, mysqli_stmt_class_entry, 
+                                                                        &types, &types_len, UG(utf8_conv)) == FAILURE) {
                return; 
        }
 
        MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
-       MYSQLI_CONVERT_PARAM_STRING(types, MYSQLI_CONV_ASCII);
 
        num_vars = argc - 1;
        if (getThis()) {
@@ -108,17 +109,15 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
                --num_vars;
        }
 
-       if (types.buflen != argc - start) {
+       if (types_len != argc - start) {
                /* number of bind variables doesn't match number of elements in type definition string */
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of elements in type definition string doesn't match number of bind variables");
-               RETVAL_FALSE;
-               goto end_2;
+               RETURN_FALSE;
        }
 
-       if (types.buflen != stmt->stmt->param_count) {
+       if (types_len != stmt->stmt->param_count) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of variables doesn't match number of parameters in prepared statement");
-               RETVAL_FALSE;
-               goto end_2;
+               RETURN_FALSE;
        }
 
        /* prevent leak if variables are already bound */
@@ -131,7 +130,7 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
        if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
                efree(args);
                zend_wrong_param_count(TSRMLS_C); 
-               goto end_2;
+               RETURN_FALSE;
        }
 
        stmt->param.is_null = ecalloc(num_vars, sizeof(char));
@@ -141,7 +140,7 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
        for (i=start; i < argc; i++) {
 
                /* set specified type */
-               switch (((char *)types.buf)[ofs]) {
+               switch (types[ofs]) {
                        case 'd': /* Double */
                                bind[ofs].buffer_type = MYSQL_TYPE_DOUBLE;
                                bind[ofs].buffer = (gptr)&Z_DVAL_PP(args[i]);
@@ -166,7 +165,7 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
                                break;
 
                        default:
-                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Undefined fieldtype %c (parameter %d)", ((char *)types.buf)[ofs], i+1);
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Undefined fieldtype %c (parameter %d)", types[ofs], i+1);
                                RETVAL_FALSE;
                                goto end_1;
                }
@@ -194,8 +193,6 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
 end_1:
        efree(args);
        efree(bind);
-end_2:
-       MYSQLI_FREE_STRING(types);
 }
 /* }}} */
 
@@ -409,26 +406,20 @@ PHP_FUNCTION(mysqli_change_user)
 {
        MY_MYSQL                *mysql;
        zval                    *mysql_link = NULL;
-       MYSQLI_STRING   user, password, dbname;
+       char                    *user, *password, *dbname;
+       int                             user_len, password_len, dbname_len;
        ulong           rc;
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osss", &mysql_link, mysqli_link_class_entry, 
-                                                                       MYSQLI_GET_STRING(user), MYSQLI_GET_STRING(password), MYSQLI_GET_STRING(dbname)) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&&ss&", &mysql_link, mysqli_link_class_entry, 
+                                                                       &user, &user_len, UG(utf8_conv), &password, &password_len, UG(utf8_conv),
+                                                                       &dbname, &dbname_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
-       MYSQLI_CONVERT_PARAM_STRING(user, MYSQLI_CONV_UTF8);
-       MYSQLI_CONVERT_PARAM_STRING(password, MYSQLI_CONV_UTF8);
-       MYSQLI_CONVERT_PARAM_STRING(dbname, MYSQLI_CONV_UTF8);
-
-       rc = mysql_change_user(mysql->mysql, user.buf, password.buf, dbname.buf);
+       rc = mysql_change_user(mysql->mysql, user, password, dbname);
        MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
 
-       MYSQLI_FREE_STRING(user);
-       MYSQLI_FREE_STRING(password);
-       MYSQLI_FREE_STRING(dbname);
-
        if (rc) {
                RETURN_FALSE;
        }
@@ -453,7 +444,7 @@ PHP_FUNCTION(mysqli_character_set_name)
 
        csname = (char *)mysql_character_set_name(mysql->mysql);
  
-    MYSQLI_RETURN_CONV_STRINGL(MYSQLI_CONV_UTF8, csname, strlen(csname), 1);
+       ZVAL_UTF8_STRINGL(return_value, csname, strlen(csname), ZSTR_DUPLICATE);
 }
 /* }}} */
 
@@ -528,16 +519,14 @@ PHP_FUNCTION(mysqli_data_seek)
 */
 PHP_FUNCTION(mysqli_debug)
 {
-       MYSQLI_STRING   debug;
+       char    *debug;
+       int             debug_len;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", MYSQLI_GET_STRING(debug)) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&", &debug, &debug_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
        
-       MYSQLI_CONVERT_PARAM_STRING(debug, MYSQLI_CONV_ASCII);
-
-       mysql_debug((char *)debug.buf);
-       MYSQLI_FREE_STRING(debug);
+       mysql_debug(debug);
        RETURN_TRUE;
 }
 /* }}} */
@@ -593,7 +582,7 @@ PHP_FUNCTION(mysqli_error)
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        strerr = (char *)mysql_error(mysql->mysql);
-    MYSQLI_RETURN_CONV_STRINGL(MYSQLI_CONV_UTF8, strerr, strlen(strerr), 1);
+       ZVAL_UTF8_STRINGL(return_value, strerr, strlen(strerr), ZSTR_DUPLICATE);
 }
 /* }}} */
 
@@ -616,8 +605,8 @@ PHP_FUNCTION(mysqli_stmt_execute)
                                switch (stmt->stmt->params[i].buffer_type) {
                                        case MYSQL_TYPE_VAR_STRING:
                                                if (UG(unicode) && Z_TYPE_P(stmt->param.vars[i]) == IS_UNICODE) {
-                                                       zend_unicode_to_string(MYSQLI_CONV_UTF8, &stmt->stmt->params[i].buffer, (int *)&stmt->stmt->params[i].buffer_length, 
-                                                                                                         Z_USTRVAL_PP(&stmt->param.vars[i]), Z_USTRLEN_PP(&stmt->param.vars[i]));
+                                                       zend_unicode_to_string(UG(utf8_conv), (char **)&stmt->stmt->params[i].buffer, (int *)&stmt->stmt->params[i].buffer_length, 
+                                                                                                         Z_USTRVAL_PP(&stmt->param.vars[i]), Z_USTRLEN_PP(&stmt->param.vars[i]) TSRMLS_CC);
                                                } else {
                                                        if (Z_TYPE_P(stmt->param.vars[i]) != IS_STRING) {
                                                        convert_to_string_ex(&stmt->param.vars[i]);
@@ -724,7 +713,7 @@ PHP_FUNCTION(mysqli_stmt_fetch)
                                                                if (UG(unicode)) {
                                                                        UChar *ubuf = NULL;
                                                                        int ulen;
-                                                                       zend_string_to_unicode(MYSQLI_CONV_ASCII, &ubuf, &ulen, tmp, strlen(tmp));
+                                                                       zend_string_to_unicode(UG(ascii_conv), &ubuf, &ulen, tmp, strlen(tmp) TSRMLS_CC);
                                                                        ZVAL_UNICODEL(stmt->result.vars[i], ubuf, ulen, 0);
                                                                        efree(tmp);
                                                                } else {
@@ -763,7 +752,7 @@ PHP_FUNCTION(mysqli_stmt_fetch)
                                                                if (UG(unicode)) {
                                                                        UChar *ubuf = NULL;
                                                                        int ulen;
-                                                                       zend_string_to_unicode(MYSQLI_CONV_UTF8, &ubuf, &ulen, tmp, strlen(tmp));
+                                                                       zend_string_to_unicode(UG(utf8_conv), &ubuf, &ulen, tmp, strlen(tmp) TSRMLS_CC);
                                                                        ZVAL_UNICODEL(stmt->result.vars[i], ubuf, ulen, 0);
                                                                } else {                                                
                                                                        ZVAL_STRING(stmt->result.vars[i], tmp, 1);
@@ -782,8 +771,8 @@ PHP_FUNCTION(mysqli_stmt_fetch)
                                                        if (UG(unicode)) {
                                                                UChar *ubuf = NULL;
                                                                int ulen;
-                                                               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ubuf, &ulen, stmt->result.buf[i].val,
-                                                                                                               stmt->result.buf[i].buflen);
+                                                               zend_string_to_unicode(UG(utf8_conv), &ubuf, &ulen, stmt->result.buf[i].val,
+                                                                                                               stmt->result.buf[i].buflen TSRMLS_CC);
                                                                ZVAL_UNICODEL(stmt->result.vars[i], ubuf, ulen, 0);
                                                        } else {
                                                                ZVAL_STRINGL(stmt->result.vars[i], stmt->result.buf[i].val, stmt->result.buf[i].buflen, 1);
@@ -824,26 +813,26 @@ PHP_FUNCTION(mysqli_stmt_fetch)
 /* }}} */
 
 
-void php_add_field_properties(zval *value, MYSQL_FIELD *field)
+static void php_add_field_properties(zval *value, MYSQL_FIELD *field TSRMLS_DC)
 {
        if (UG(unicode)) {
                UChar *ustr;
                int ulen;
 
-               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, (field->name) ? field->name : "", 
-                                                               (field->name) ? strlen(field->name) : 0);
+               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, (field->name) ? field->name : "", 
+                                                               (field->name) ? strlen(field->name) : 0 TSRMLS_CC);
                add_property_unicodel(value, "name", ustr, ulen, 0);
-               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, (field->org_name) ? field->org_name : "", 
-                                                               (field->org_name) ? strlen(field->org_name) : 0);
+               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, (field->org_name) ? field->org_name : "", 
+                                                               (field->org_name) ? strlen(field->org_name) : 0 TSRMLS_CC);
                add_property_unicodel(value, "orgname", ustr, ulen, 0);
-               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, (field->table) ? field->table : "", 
-                                                               (field->table) ? strlen(field->table) : 0);
+               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, (field->table) ? field->table : "", 
+                                                               (field->table) ? strlen(field->table) : 0 TSRMLS_CC);
                add_property_unicodel(value, "table", ustr, ulen, 0);
-               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, (field->org_table) ? field->org_table : "", 
-                                                               (field->org_table) ? strlen(field->org_table) : 0);
+               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, (field->org_table) ? field->org_table : "", 
+                                                               (field->org_table) ? strlen(field->org_table) : 0 TSRMLS_CC);
                add_property_unicodel(value, "orgtable", ustr, ulen, 0);
-               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, (field->def) ? field->def : "", 
-                                                               (field->def) ? strlen(field->def) : 0);
+               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, (field->def) ? field->def : "", 
+                                                               (field->def) ? strlen(field->def) : 0 TSRMLS_CC);
                add_property_unicodel(value, "def", ustr, ulen, 0);
        } else {
                add_property_string(value, "name",(field->name ? field->name : ""), 1);
@@ -879,7 +868,7 @@ PHP_FUNCTION(mysqli_fetch_field)
        }
 
        object_init(return_value);
-       php_add_field_properties(return_value, field);
+       php_add_field_properties(return_value, field TSRMLS_CC);
 }
 /* }}} */
 
@@ -908,7 +897,7 @@ PHP_FUNCTION(mysqli_fetch_fields)
                MAKE_STD_ZVAL(obj);
                object_init(obj);
 
-               php_add_field_properties(obj, field);
+               php_add_field_properties(obj, field TSRMLS_CC);
                add_index_zval(return_value, i, obj);
        }
 }
@@ -939,7 +928,7 @@ PHP_FUNCTION(mysqli_fetch_field_direct)
        }
 
        object_init(return_value);
-       php_add_field_properties(return_value, field);
+       php_add_field_properties(return_value, field TSRMLS_CC);
 }
 /* }}} */
 
@@ -1080,7 +1069,7 @@ PHP_FUNCTION(mysqli_get_host_info)
        }
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
-       MYSQLI_RETURN_CONV_STRING(MYSQLI_CONV_ASCII, mysql->mysql->host_info);
+       ZVAL_UTF8_STRING(return_value, mysql->mysql->host_info, ZSTR_DUPLICATE);
 }
 /* }}} */
 
@@ -1112,7 +1101,7 @@ PHP_FUNCTION(mysqli_get_server_info)
        }
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
-       MYSQLI_RETURN_CONV_STRING(MYSQLI_CONV_ASCII, (char *)mysql_get_server_info(mysql->mysql));
+       ZVAL_UTF8_STRING(return_value, (char *)mysql_get_server_info(mysql->mysql), ZSTR_DUPLICATE);
 }
 
 /* }}} */
@@ -1145,7 +1134,7 @@ PHP_FUNCTION(mysqli_info)
        }
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
-       MYSQLI_RETURN_CONV_STRING(MYSQLI_CONV_ASCII, mysql->mysql->info);
+       ZVAL_UTF8_STRING(return_value, mysql->mysql->info, ZSTR_DUPLICATE);
 }
 /* }}} */
 
@@ -1353,21 +1342,11 @@ PHP_FUNCTION(mysqli_options)
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED);
 
        switch (Z_TYPE_PP(&mysql_value)) {
+               case IS_UNICODE:
+                       zval_unicode_to_string(mysql_value TSRMLS_CC);
                case IS_STRING:
                        ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_PP(&mysql_value));
                        break;
-               case IS_UNICODE:
-               {       
-                       MYSQLI_STRING   optstr;
-
-                       optstr.buf = Z_USTRVAL_P(mysql_value);
-                       optstr.buflen = Z_USTRLEN_P(mysql_value);
-                       optstr.buftype = IS_UNICODE;
-                       MYSQLI_CONVERT_PARAM_STRING(optstr, MYSQLI_CONV_UTF8);
-                       ret = mysql_options(mysql->mysql, mysql_option, (char *)optstr.buf);
-                       MYSQLI_FREE_STRING(optstr);
-                       break;
-               }
                default:
                        convert_to_long_ex(&mysql_value);
                        l_value = Z_LVAL_PP(&mysql_value);
@@ -1404,14 +1383,17 @@ PHP_FUNCTION(mysqli_prepare)
 {
        MY_MYSQL                *mysql;
        MY_STMT                 *stmt;
-       MYSQLI_STRING   query;
+       char                    *query;
+       int                             query_len;
        zval                    *mysql_link;
        MYSQLI_RESOURCE *mysqli_resource; 
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OT",&mysql_link, mysqli_link_class_entry, MYSQLI_GET_STRING(query)) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&",&mysql_link, mysqli_link_class_entry, 
+                                                                       &query, &query_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
+
        if (mysql->mysql->status == MYSQL_STATUS_GET_RESULT) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "All data must be fetched before a new statement prepare takes place");
                RETURN_FALSE;
@@ -1420,8 +1402,7 @@ PHP_FUNCTION(mysqli_prepare)
        stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
 
        if ((stmt->stmt = mysql_stmt_init(mysql->mysql))) {
-               MYSQLI_CONVERT_PARAM_STRING(query, MYSQLI_CONV_UTF8);
-               if (mysql_stmt_prepare(stmt->stmt, query.buf, query.buflen)) {
+               if (mysql_stmt_prepare(stmt->stmt, query, query_len)) {
                        char  last_error[MYSQL_ERRMSG_SIZE];
                        char  sqlstate[SQLSTATE_LENGTH+1];      
                        unsigned int last_errno;
@@ -1443,14 +1424,12 @@ PHP_FUNCTION(mysqli_prepare)
 
        /* don't initialize stmt->query with NULL, we ecalloc()-ed the memory */
        /* Get performance boost if reporting is switched off */
-       if (stmt->stmt && query.buflen && (MyG(report_mode) & MYSQLI_REPORT_INDEX)) {
-               stmt->query = (char *)emalloc(query.buflen + 1);
-               memcpy(stmt->query, query.buf, query.buflen);
-               stmt->query[query.buflen] = '\0';
+       if (stmt->stmt && query_len && (MyG(report_mode) & MYSQLI_REPORT_INDEX)) {
+               stmt->query = (char *)emalloc(query_len + 1);
+               memcpy(stmt->query, query, query_len);
+               stmt->query[query_len] = '\0';
        }
 
-       MYSQLI_FREE_STRING(query);
-
        /* don't join to the previous if because it won't work if mysql_stmt_prepare_fails */
        if (!stmt->stmt) {
                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
@@ -1473,29 +1452,23 @@ PHP_FUNCTION(mysqli_prepare)
 PHP_FUNCTION(mysqli_real_connect)
 {
        MY_MYSQL                *mysql;
-       MYSQLI_STRING   hostname, username, passwd, dbname, socket;
+       char                    *hostname, *username, *passwd, *dbname, *socket;
+       int                             hostname_len, username_len, passwd_len, dbname_len, socket_len;
        unsigned long   port=0, flags=0;
        zval                    *mysql_link;
 
-       /* optional MYSQLI_STRING parameters have to be initialized */
-       memset(&hostname, 0, sizeof(MYSQLI_STRING));
-       memset(&username, 0, sizeof(MYSQLI_STRING));
-       memset(&dbname,   0, sizeof(MYSQLI_STRING));
-       memset(&passwd,   0, sizeof(MYSQLI_STRING));
-       memset(&socket,   0, sizeof(MYSQLI_STRING));
+       /* optional parameters have to be initialized */
+       hostname = username = dbname = passwd = socket = NULL;
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|TTTTlTl", &mysql_link, mysqli_link_class_entry,
-               MYSQLI_GET_STRING(hostname), MYSQLI_GET_STRING(username), MYSQLI_GET_STRING(passwd), MYSQLI_GET_STRING(dbname), &port, MYSQLI_GET_STRING(socket),
-               &flags) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|s&s&s&s&ls&l", &mysql_link, mysqli_link_class_entry,
+               &hostname, &hostname_len, UG(utf8_conv), &username, &username_len, UG(utf8_conv), &passwd, &passwd_len, UG(utf8_conv),
+               &dbname, &dbname_len, UG(utf8_conv), &port, &socket, &socket_len, UG(utf8_conv), &flags) == FAILURE) {
                return;
        }
 
-       MYSQLI_CONVERT_PARAM_STRING(hostname, MYSQLI_CONV_ASCII);
-       MYSQLI_CONVERT_PARAM_STRING(username, MYSQLI_CONV_UTF8);
-       MYSQLI_CONVERT_PARAM_STRING(passwd, MYSQLI_CONV_UTF8);
-       MYSQLI_CONVERT_PARAM_STRING(dbname, MYSQLI_CONV_UTF8);
-       MYSQLI_CONVERT_PARAM_STRING(socket, MYSQLI_CONV_ASCII);
-
+       if (!socket_len) {
+               socket = NULL;
+       }
        /* TODO: default values */
 
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED);
@@ -1506,15 +1479,14 @@ PHP_FUNCTION(mysqli_real_connect)
                flags ^= CLIENT_LOCAL_FILES;
        }
 
-       if (mysql_real_connect(mysql->mysql, hostname.buf, username.buf, passwd.buf, dbname.buf ,port,(socket.buflen) ? socket.buf : NULL,flags) == NULL) {
+       if (mysql_real_connect(mysql->mysql, hostname, username, passwd, dbname ,port, socket ,flags) == NULL) {
                php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql) TSRMLS_CC);
                php_mysqli_throw_sql_exception( mysql->mysql->net.sqlstate, mysql->mysql->net.last_errno TSRMLS_CC,
                                                                                "%s", mysql->mysql->net.last_error);
 
                /* change status */
                MYSQLI_SET_STATUS(&mysql_link, MYSQLI_STATUS_INITIALIZED);
-               RETVAL_FALSE;
-               goto end;
+               RETURN_FALSE;
        }
 
        php_mysqli_set_error(mysql_errno(mysql->mysql), (char *)mysql_error(mysql->mysql) TSRMLS_CC);
@@ -1527,13 +1499,7 @@ PHP_FUNCTION(mysqli_real_connect)
        /* change status */
        MYSQLI_SET_STATUS(&mysql_link, MYSQLI_STATUS_VALID);
 
-       RETVAL_TRUE;
-end:
-       MYSQLI_FREE_STRING(hostname);
-       MYSQLI_FREE_STRING(username);
-       MYSQLI_FREE_STRING(passwd);
-       MYSQLI_FREE_STRING(dbname);
-       MYSQLI_FREE_STRING(socket);
+       RETURN_TRUE;
 }
 /* }}} */
 
@@ -1543,28 +1509,28 @@ PHP_FUNCTION(mysqli_real_query)
 {
        MY_MYSQL                *mysql;
        zval                    *mysql_link;
-       MYSQLI_STRING   query;
+       char                    *query;
+       int                             query_len;
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, MYSQLI_GET_STRING(query)) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &mysql_link, mysqli_link_class_entry, 
+                                                                        &query, &query_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
-       MYSQLI_CONVERT_PARAM_STRING(query, MYSQLI_CONV_UTF8);
 
        MYSQLI_DISABLE_MQ; /* disable multi statements/queries */
 
-       if (mysql_real_query(mysql->mysql, query.buf, query.buflen)) {
+       if (mysql_real_query(mysql->mysql, query, query_len)) {
                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
                RETVAL_FALSE;
        } else {
                if (!mysql_field_count(mysql->mysql)) {
                        if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
-                       php_mysqli_report_index(query.buf, mysql->mysql->server_status TSRMLS_CC);
+                       php_mysqli_report_index(query, mysql->mysql->server_status TSRMLS_CC);
                        }
                }
                RETVAL_TRUE;
        }
-       MYSQLI_FREE_STRING(query);
 }
 /* }}} */
 
@@ -1573,22 +1539,22 @@ PHP_FUNCTION(mysqli_real_query)
 PHP_FUNCTION(mysqli_real_escape_string) {
        MY_MYSQL                *mysql;
        zval                    *mysql_link = NULL;
-       MYSQLI_STRING   escapestr;
+       char                    *escapestr;
+       int                             escapestr_len;
        char                    *newstr;
        int                             newstr_len;
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, MYSQLI_GET_STRING(escapestr)) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &mysql_link, mysqli_link_class_entry, 
+                                                                        &escapestr, &escapestr_len, UG(utf8_conv)) == FAILURE) {
                return;
        }       
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
-       MYSQLI_CONVERT_PARAM_STRING(escapestr, MYSQLI_CONV_UTF8);
 
-       newstr = safe_emalloc(2, escapestr.buflen, 1);
-       newstr_len = mysql_real_escape_string(mysql->mysql, newstr, escapestr.buf, escapestr.buflen);
+       newstr = safe_emalloc(2, escapestr_len, 1);
+       newstr_len = mysql_real_escape_string(mysql->mysql, newstr, escapestr, escapestr_len);
        newstr = erealloc(newstr, newstr_len + 1);
 
-       MYSQLI_FREE_STRING(escapestr);          
-       MYSQLI_RETURN_CONV_STRINGL(MYSQLI_CONV_UTF8, newstr, newstr_len, 0);
+       ZVAL_UTF8_STRING(return_value, newstr, 0);      
 }
 /* }}} */
 
@@ -1618,27 +1584,25 @@ PHP_FUNCTION(mysqli_stmt_send_long_data)
        MY_STMT *stmt;
        zval    *mysql_stmt;
        long    param_nr;
-       MYSQLI_STRING data;
+       char    *data;
+       int             data_len;
 
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols", &mysql_stmt, mysqli_stmt_class_entry, &param_nr, MYSQLI_GET_STRING(data)) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols&", &mysql_stmt, mysqli_stmt_class_entry, &param_nr, 
+                                                                        &data, &data_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
        MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
-       MYSQLI_CONVERT_PARAM_STRING(data, MYSQLI_CONV_UTF8);
 
        if (param_nr < 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter number");
-               RETVAL_FALSE;
-               goto end;
+               RETURN_FALSE;
        } 
-       if (mysql_stmt_send_long_data(stmt->stmt, param_nr, data.buf, data.buflen)) {
-               RETVAL_FALSE;
+       if (mysql_stmt_send_long_data(stmt->stmt, param_nr, data, data_len)) {
+               RETURN_FALSE;
        } else {
-               RETVAL_TRUE;
+               RETURN_TRUE;
        }
-end:
-       MYSQLI_FREE_STRING(data);
 }
 /* }}} */
 
@@ -1816,22 +1780,22 @@ PHP_FUNCTION(mysqli_select_db)
 {
        MY_MYSQL                *mysql;
        zval                    *mysql_link;
-       MYSQLI_STRING   dbname;
+       char                    *dbname;
+       int                             dbname_len;
 
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, MYSQLI_GET_STRING(dbname)) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &mysql_link, mysqli_link_class_entry, 
+                                                                        &dbname, &dbname_len, UG(utf8_conv)) == FAILURE) {
                return;
        } 
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
-       MYSQLI_CONVERT_PARAM_STRING(dbname, MYSQLI_CONV_UTF8);
        
-       if (!mysql_select_db(mysql->mysql, (char *)dbname.buf)) {
+       if (!mysql_select_db(mysql->mysql, dbname)) {
                RETVAL_TRUE;
        } else {
                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
                RETURN_FALSE;
        }
-       MYSQLI_FREE_STRING(dbname);
 }
 /* }}} */
 
@@ -1846,7 +1810,7 @@ PHP_FUNCTION(mysqli_sqlstate)
                return;
        }
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
-       MYSQLI_RETURN_CONV_STRING(MYSQLI_CONV_ASCII, (char *)mysql_sqlstate(mysql->mysql));
+       ZVAL_UTF8_STRING(return_value, (char *)mysql_sqlstate(mysql->mysql), ZSTR_DUPLICATE);
 }
 /* }}} */
 
@@ -1856,29 +1820,19 @@ PHP_FUNCTION(mysqli_ssl_set)
 {
        MY_MYSQL                *mysql;
        zval                    *mysql_link;
-       MYSQLI_STRING   ssl_parm[5];
-       int                     i;
+       char                    *ssl_parm[5];
+       int                             ssl_parm_len[5];
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osssss", &mysql_link, mysqli_link_class_entry,
-                                                                       MYSQLI_GET_STRING(ssl_parm[0]), MYSQLI_GET_STRING(ssl_parm[1]), MYSQLI_GET_STRING(ssl_parm[2]),
-                                                                       MYSQLI_GET_STRING(ssl_parm[3]), MYSQLI_GET_STRING(ssl_parm[4])) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&s&s&s&s&", &mysql_link, mysqli_link_class_entry,
+                                                                       &ssl_parm[0], &ssl_parm_len[0], UG(utf8_conv), &ssl_parm[1], &ssl_parm_len[1], UG(utf8_conv),
+                                                                       &ssl_parm[2], &ssl_parm_len[2], UG(utf8_conv), &ssl_parm[3], &ssl_parm_len[3], UG(utf8_conv),
+                                                                       &ssl_parm[4], &ssl_parm_len[4], UG(utf8_conv)) == FAILURE) {
                return;
        }
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
-       for (i=0; i < 5; i++) {
-               MYSQLI_CONVERT_PARAM_STRING(ssl_parm[0], MYSQLI_CONV_ASCII);
-               if (!ssl_parm[i].buflen) {
-                       ssl_parm[i].buf = NULL;
-               }
-       }
-
-       mysql_ssl_set(mysql->mysql, ssl_parm[0].buf, ssl_parm[1].buf, ssl_parm[2].buf, ssl_parm[3].buf, ssl_parm[4].buf);
+       mysql_ssl_set(mysql->mysql, ssl_parm[0], ssl_parm[1], ssl_parm[2], ssl_parm[3], ssl_parm[4]);
        
-       for (i=0; i < 5; i++) {
-               MYSQLI_FREE_STRING(ssl_parm[i]);
-       }
-
        RETURN_TRUE;
 }
 /* }}} */
@@ -1897,9 +1851,10 @@ PHP_FUNCTION(mysqli_stat)
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if ((stat = (char *)mysql_stat(mysql->mysql))) {
-               MYSQLI_RETURN_CONV_STRING(MYSQLI_CONV_ASCII, stat);
+               ZVAL_UTF8_STRING(return_value, stat, ZSTR_DUPLICATE);
+       } else {
+               RETURN_FALSE;
        }
-       RETURN_FALSE;
 }
 
 /* }}} */
@@ -1980,7 +1935,7 @@ PHP_FUNCTION(mysqli_stmt_error)
        }
        MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_INITIALIZED);
        
-       MYSQLI_RETURN_CONV_STRING(MYSQLI_CONV_UTF8, (char *)mysql_stmt_error(stmt->stmt));
+       ZVAL_UTF8_STRING(return_value, (char *)mysql_stmt_error(stmt->stmt), ZSTR_DUPLICATE);
 }
 /* }}} */
 
@@ -2020,24 +1975,22 @@ PHP_FUNCTION(mysqli_stmt_prepare)
 {
        MY_STMT                 *stmt;
        zval                    *mysql_stmt;
-       MYSQLI_STRING   query;
+       char                    *query;
+       int                             query_len;
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_stmt, mysqli_stmt_class_entry, MYSQLI_GET_STRING(query)) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &mysql_stmt, mysqli_stmt_class_entry, 
+                                                                        &query, &query_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
        MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_INITIALIZED);
-       MYSQLI_CONVERT_PARAM_STRING(query, MYSQLI_CONV_UTF8);
 
-       if (mysql_stmt_prepare(stmt->stmt, query.buf, query.buflen)) {
+       if (mysql_stmt_prepare(stmt->stmt, query, query_len)) {
                MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
-               RETVAL_FALSE;
-               goto end;
+               RETURN_FALSE;
        }
        /* change status */
        MYSQLI_SET_STATUS(&mysql_stmt, MYSQLI_STATUS_VALID);
-       RETVAL_TRUE;
-end:
-       MYSQLI_FREE_STRING(query);
+       RETURN_TRUE;
 }
 /* }}} */
 
@@ -2115,7 +2068,7 @@ PHP_FUNCTION(mysqli_stmt_sqlstate)
        }
        MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
        
-       MYSQLI_RETURN_CONV_STRING(MYSQLI_CONV_ASCII, (char *)mysql_stmt_sqlstate(stmt->stmt));
+       ZVAL_UTF8_STRING(return_value, (char *)mysql_stmt_sqlstate(stmt->stmt), ZSTR_DUPLICATE);
 }
 /* }}} */
 
index 50c33dbe1098daffb2d812d23ccc8d2e2a633024..a8eb97e0f9a7e6e783ea27d809c55de6086568d8 100644 (file)
@@ -132,7 +132,12 @@ MAP_PROPERTY_MYG_LONG_READ(driver_report_read, report_mode);
 
 ZEND_FUNCTION(mysqli_driver_construct)
 {
-       
+       MYSQLI_RESOURCE         *mysqli_resource;
+
+       mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
+       mysqli_resource->ptr = 1;
+       mysqli_resource->status = (ZEND_NUM_ARGS() == 1) ? MYSQLI_STATUS_INITIALIZED : MYSQLI_STATUS_VALID;
+       ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
 }
 
 mysqli_property_entry mysqli_driver_property_entries[] = {
index 2e041ca96d68735ac76c6ca4e1bf24dc8c930a14..cfed17880ebaa912558a5da6517505d3561a9a44 100644 (file)
@@ -36,47 +36,31 @@ PHP_FUNCTION(mysqli_connect)
        MY_MYSQL                        *mysql;
        MYSQLI_RESOURCE         *mysqli_resource;
        zval                            *object = getThis();
-       MYSQLI_STRING           hostname, username, passwd, dbname, socket;
+       char                            *hostname, *username, *passwd, *dbname, *socket;
+       int                                     hostname_len, username_len, passwd_len, dbname_len, socket_len;
        long                            port=0;
 
        if (getThis() && !ZEND_NUM_ARGS()) {
                RETURN_NULL();
        }
 
-       /* optional MYSQLI_STRING parameters have to be initialized */
-       memset(&hostname, 0, sizeof(MYSQLI_STRING));
-       memset(&username, 0, sizeof(MYSQLI_STRING));
-       memset(&dbname,   0, sizeof(MYSQLI_STRING));
-       memset(&passwd,   0, sizeof(MYSQLI_STRING));
-       memset(&socket,   0, sizeof(MYSQLI_STRING));
+       hostname = username = dbname = passwd = socket = NULL;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|TTTTlT", MYSQLI_GET_STRING(hostname), MYSQLI_GET_STRING(username),
-                                                       MYSQLI_GET_STRING(passwd), MYSQLI_GET_STRING(dbname), &port, MYSQLI_GET_STRING(socket)) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&s&s&s&ls&", &hostname, &hostname_len, UG(utf8_conv),
+                                                         &username, &username_len, UG(utf8_conv), &passwd, &passwd_len, UG(utf8_conv), 
+                                                         &dbname, &dbname_len, UG(utf8_conv), &port, &socket, &socket_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
 
-       /* load defaults */
-       if (!socket.buflen) {
-               socket.buf = NULL;
-       }
-
-       /* convert strings */
-       MYSQLI_CONVERT_PARAM_STRING(hostname, MYSQLI_CONV_ASCII);
-       MYSQLI_CONVERT_PARAM_STRING(username, MYSQLI_CONV_UTF8);
-       MYSQLI_CONVERT_PARAM_STRING(passwd, MYSQLI_CONV_UTF8);
-       MYSQLI_CONVERT_PARAM_STRING(dbname, MYSQLI_CONV_UTF8);
-       MYSQLI_CONVERT_PARAM_STRING(socket, MYSQLI_CONV_ASCII);
-
        mysql = (MY_MYSQL *) ecalloc(1, sizeof(MY_MYSQL));
 
        if (!(mysql->mysql = mysql_init(NULL))) {
                efree(mysql);
-               RETVAL_FALSE;
-               goto end;
+               RETURN_FALSE;
        }
 
 #ifdef HAVE_EMBEDDED_MYSQLI
-       if (hostname.cbuffer_len) {
+       if (hostname_len) {
                unsigned int external=1;
                mysql_options(mysql->mysql, MYSQL_OPT_USE_REMOTE_CONNECTION, (char *)&external);
        } else {
@@ -84,8 +68,7 @@ PHP_FUNCTION(mysqli_connect)
        }
 #endif
 
-       if (mysql_real_connect(mysql->mysql, (char *)hostname.buf, (char *)username.buf, (char *)passwd.buf, (char *)dbname.buf, port,
-                                                       (char *)socket.buf, CLIENT_MULTI_RESULTS) == NULL) {
+       if (mysql_real_connect(mysql->mysql, hostname, username, passwd, dbname, port, socket, CLIENT_MULTI_RESULTS) == NULL) {
                /* Save error messages */
 
                php_mysqli_throw_sql_exception( mysql->mysql->net.sqlstate, mysql->mysql->net.last_errno TSRMLS_CC,
@@ -96,17 +79,15 @@ PHP_FUNCTION(mysqli_connect)
                /* free mysql structure */
                mysql_close(mysql->mysql);
                efree(mysql);
-               RETVAL_FALSE;
-               goto end;
+               RETURN_FALSE;
        }
 
        /* when PHP runs in unicode, set default character set to utf8 */
        if (UG(unicode)) {
                mysql_set_character_set(mysql->mysql, "utf8");
-               mysql->conv = MYSQLI_CONV_UTF8;
+               mysql->conv = UG(utf8_conv);
        }
 
-
        /* clear error */
        php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql) TSRMLS_CC);
 
@@ -124,12 +105,6 @@ PHP_FUNCTION(mysqli_connect)
        } else {
                ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr = mysqli_resource;
        }
-end:
-       MYSQLI_FREE_STRING(hostname);   
-       MYSQLI_FREE_STRING(username);   
-       MYSQLI_FREE_STRING(passwd);     
-       MYSQLI_FREE_STRING(dbname);     
-       MYSQLI_FREE_STRING(socket);     
 }
 /* }}} */
 
@@ -146,16 +121,7 @@ PHP_FUNCTION(mysqli_connect_errno)
 PHP_FUNCTION(mysqli_connect_error) 
 {
        if (MyG(error_msg)) {
-               if (UG(unicode)) {
-                       UErrorCode status = U_ZERO_ERROR;
-                       UChar *ustr;
-                       int ulen;
-
-                       zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, MyG(error_msg), strlen(MyG(error_msg)));
-                       RETURN_UNICODEL(ustr, ulen, 0);
-               } else {
-                       RETURN_STRING(MyG(error_msg),1);
-               }
+               ZVAL_UTF8_STRING(return_value, (char *)MyG(error_msg), ZSTR_DUPLICATE);
        } else {
                RETURN_NULL();
        }
@@ -192,16 +158,17 @@ PHP_FUNCTION(mysqli_multi_query)
 {
        MY_MYSQL                *mysql;
        zval                    *mysql_link;
-       MYSQLI_STRING   query;
+       char                    *query;
+       int                             query_len;
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, MYSQLI_GET_STRING(query)) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &mysql_link, mysqli_link_class_entry, 
+                                                                        &query, &query_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
-       MYSQLI_CONVERT_PARAM_STRING(query, MYSQLI_CONV_UTF8);
 
        MYSQLI_ENABLE_MQ;       
-       if (mysql_real_query(mysql->mysql, (char *)query.buf, query.buflen)) {
+       if (mysql_real_query(mysql->mysql, query, query_len)) {
                char s_error[MYSQL_ERRMSG_SIZE], s_sqlstate[SQLSTATE_LENGTH+1];
                unsigned int s_errno;
                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
@@ -219,11 +186,9 @@ PHP_FUNCTION(mysqli_multi_query)
                strcpy(mysql->mysql->net.sqlstate, s_sqlstate);
                mysql->mysql->net.last_errno = s_errno; 
 
-               RETVAL_FALSE;
-       } else {        
-               RETVAL_TRUE;
-       }
-       MYSQLI_FREE_STRING(query);
+               RETURN_FALSE;
+       } 
+       RETURN_TRUE;
 }
 /* }}} */
 
@@ -234,11 +199,12 @@ PHP_FUNCTION(mysqli_query)
        zval                            *mysql_link;
        MYSQLI_RESOURCE         *mysqli_resource;
        MYSQL_RES                       *result;
-       MYSQLI_STRING           query;
+       char                            *query;
+       int                                     query_len;
        unsigned long           resultmode = MYSQLI_STORE_RESULT;
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OT|l", &mysql_link, mysqli_link_class_entry, MYSQLI_GET_STRING(query)
-                                                                       &resultmode) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&|l", &mysql_link, mysqli_link_class_entry
+                                                                        &query, &query_len, UG(utf8_conv), &resultmode) == FAILURE) {
                return;
        }
 
@@ -249,28 +215,23 @@ PHP_FUNCTION(mysqli_query)
 
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
-       MYSQLI_CONVERT_PARAM_STRING(query, MYSQLI_CONV_UTF8);
-
-       if (!query.buflen) {
+       if (!query_len) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty query");
-               RETVAL_FALSE;
-               goto end;
+               RETURN_FALSE;
        }
        MYSQLI_DISABLE_MQ;
 
-       if (mysql_real_query(mysql->mysql, (char *)query.buf, query.buflen)) {
+       if (mysql_real_query(mysql->mysql, query, query_len)) {
                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
-               RETVAL_FALSE;
-               goto end;
+               RETURN_FALSE;
        }
 
        if (!mysql_field_count(mysql->mysql)) {
                /* no result set - not a SELECT */
                if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
-                       php_mysqli_report_index(query.buf, mysql->mysql->server_status TSRMLS_CC);
+                       php_mysqli_report_index(query, mysql->mysql->server_status TSRMLS_CC);
                }
-               RETVAL_TRUE;
-               goto end;
+               RETURN_TRUE;
        }
 
        result = (resultmode == MYSQLI_USE_RESULT) ? mysql_use_result(mysql->mysql) : mysql_store_result(mysql->mysql);
@@ -278,20 +239,17 @@ PHP_FUNCTION(mysqli_query)
        if (!result) {
                php_mysqli_throw_sql_exception(mysql->mysql->net.sqlstate, mysql->mysql->net.last_errno TSRMLS_CC,
                                                                                "%s", mysql->mysql->net.last_error); 
-               RETVAL_FALSE;
-               goto end;
+               RETURN_FALSE;
        }
 
        if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
-               php_mysqli_report_index((char *)query.buf, mysql->mysql->server_status TSRMLS_CC);
+               php_mysqli_report_index((char *)query, mysql->mysql->server_status TSRMLS_CC);
        }
 
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
        mysqli_resource->ptr = (void *)result;
        mysqli_resource->status = MYSQLI_STATUS_VALID;
        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
-end:
-       MYSQLI_FREE_STRING(query); 
 }
 /* }}} */
 
@@ -352,28 +310,26 @@ PHP_FUNCTION(mysqli_set_charset)
 {
        MY_MYSQL                        *mysql;
        zval                            *mysql_link;
-       MYSQLI_STRING           csname;
+       char                            *csname;
+       int                                     csname_len;
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, MYSQLI_GET_STRING(csname)) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os&", &mysql_link, mysqli_link_class_entry, 
+                                                                        &csname, &csname_len, UG(utf8_conv)) == FAILURE) {
                return;
        }
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
-       MYSQLI_CONVERT_PARAM_STRING(csname, MYSQLI_CONV_UTF8);
-       RETVAL_FALSE;
 
        /* check unicode modus */
        /* todo: we need also to support UCS2. This will not work when using SET NAMES */
-       if (UG(unicode) && (csname.buflen != 4  || strncasecmp((char *)csname.buf, "utf8", 4))) {
+       if (UG(unicode) && (csname_len != 4  || strncasecmp(csname, "utf8", 4))) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Character set %s is not supported when running PHP with unicode.semantics=On.", csname);
-               RETVAL_FALSE;
-               goto end;
+               RETURN_FALSE;
        }
 
-       if (!mysql_set_character_set(mysql->mysql, (char *)csname.buf)) {
-               RETVAL_TRUE;
+       if (mysql_set_character_set(mysql->mysql, csname)) {
+               RETURN_FALSE;
        }
-end:
-       MYSQLI_FREE_STRING(csname);
+       RETURN_TRUE;
 }
 /* }}} */
 #endif
@@ -401,17 +357,17 @@ PHP_FUNCTION(mysqli_get_charset)
                UChar *ustr;
                int ulen;
 
-               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, (cs.csname) ? cs.csname : "", 
-                                                               (cs.csname) ? strlen(cs.csname) : 0);
+               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, (cs.csname) ? cs.csname : "", 
+                                                               (cs.csname) ? strlen(cs.csname) : 0 TSRMLS_CC);
                add_property_unicodel(return_value, "charset", ustr, ulen, 1);
-               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, (cs.name) ? cs.name : "", 
-                                                               (cs.name) ? strlen(cs.name) : 0);
+               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, (cs.name) ? cs.name : "", 
+                                                               (cs.name) ? strlen(cs.name) : 0 TSRMLS_CC);
                add_property_unicodel(return_value, "collation", ustr, ulen, 1);
-               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, (cs.comment) ? cs.comment : "", 
-                                                               (cs.comment) ? strlen(cs.comment) : 0);
+               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, (cs.comment) ? cs.comment : "", 
+                                                               (cs.comment) ? strlen(cs.comment) : 0 TSRMLS_CC);
                add_property_unicodel(return_value, "comment", ustr, ulen, 1);
-               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ustr, &ulen, (cs.dir) ? cs.dir : "", 
-                                                               (cs.dir) ? strlen(cs.dir) : 0);
+               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, (cs.dir) ? cs.dir : "", 
+                                                               (cs.dir) ? strlen(cs.dir) : 0 TSRMLS_CC);
                add_property_unicodel(return_value, "dir", ustr, ulen, 1);
        } else {
                add_property_string(return_value, "charset", (cs.name) ? (char *)cs.csname : "", 1);
index 00170e3d545da175ce89a1910c20da5199faf3f4..693820c6970015674447d0166c1aaccb39d60823 100644 (file)
@@ -105,14 +105,7 @@ static int __func(mysqli_object *obj, zval **retval TSRMLS_DC)\
                if (!c) {\
                        ZVAL_NULL(*retval);\
                } else {\
-                       if (UG(unicode)) {\
-                               UChar *ubuf = NULL;\
-                               uint ulen;\
-                               zend_string_to_unicode(MYSQLI_CONV_UTF8, &ubuf, &ulen, c, strlen(c));\
-                               ZVAL_UNICODEL(*retval, ubuf, ulen, 0);\
-                       } else {\
-                               ZVAL_STRING(*retval, c, 1);\
-                       }\
+                       ZVAL_UTF8_STRING(*retval, c, ZSTR_DUPLICATE);\
                }\
        }\
        return SUCCESS;\
index d682f0a4c7008055344f87a5251b740261cdbbcf..00be2d11e3e4563dc2d5ddb7ac29f6444ad58d7b 100644 (file)
@@ -229,13 +229,12 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry * TSRML
        MYSQLI_RESOURCE *my_res; \
        mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*(__id) TSRMLS_CC);\
        if (!(my_res = (MYSQLI_RESOURCE *)intern->ptr)) {\
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %R", UG(unicode)?IS_UNICODE:IS_STRING, intern->zo.ce->name);\
-               printf("--------\n");\
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %v", intern->zo.ce->name);\
                RETURN_NULL();\
        }\
        __ptr = (__type)my_res->ptr; \
        if (__check && my_res->status < __check) { \
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid object or resource %R\n", UG(unicode)?IS_UNICODE:IS_STRING, intern->zo.ce->name); \
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid object or resource %v\n", intern->zo.ce->name); \
                RETURN_NULL();\
        }\
 }
@@ -273,43 +272,6 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry * TSRML
        }\
 }
 
-#define MYSQLI_GET_STRING(a) &a.buf, &a.buflen, &a.buftype
-
-#define MYSQLI_FREE_STRING(a) \
-if (a.buftype == IS_UNICODE) {\
-       efree(a.buf);\
-}
-
-#define MYSQLI_CONVERT_PARAM_STRING(a,c)\
-if (a.buftype == IS_UNICODE) {\
-       a.status=U_ZERO_ERROR;\
-       zend_unicode_to_string_ex(c, (char **)&a.buf, &a.buflen, a.buf, a.buflen, &a.status);\
-} 
-
-#define MYSQLI_RETURN_CONV_STRING(conv, value) \
-if (UG(unicode)) { \
-       UChar *ustr;\
-       int ulen;\
-       zend_string_to_unicode(conv, &ustr, &ulen, (value) ? value : "", (value) ? strlen(value) : 0);\
-       RETURN_UNICODEL(ustr, ulen, 0);\
-} else {\
-       RETURN_STRING((value) ? value : "", 1);\
-}\
-
-#define MYSQLI_RETURN_CONV_STRINGL(conv, value, len, copy) \
-if (UG(unicode)) { \
-       UChar *ustr;\
-       int ulen;\
-       zend_string_to_unicode(conv, &ustr, &ulen, (value) ? value : "", len);\
-       RETURN_UNICODEL(ustr, ulen, 0);\
-} else {\
-       RETURN_STRINGL((value) ? value : "", len, copy);\
-}\
-
-#define MYSQLI_CONV_UTF8  unicode_globals.utf8_conv
-#define MYSQLI_CONV_UCS2  unicode_globals.ucs2_conv
-#define MYSQLI_CONV_ASCII unicode_globals.ascii_conv
-
 #if WIN32|WINNT
 #define SCLOSE(a) closesocket(a)
 #else