diff options
-rw-r--r-- | ext/mysqli/mysqli.c | 40 | ||||
-rw-r--r-- | ext/mysqli/mysqli_api.c | 281 | ||||
-rw-r--r-- | ext/mysqli/mysqli_driver.c | 7 | ||||
-rw-r--r-- | ext/mysqli/mysqli_nonapi.c | 142 | ||||
-rw-r--r-- | ext/mysqli/mysqli_prop.c | 9 | ||||
-rw-r--r-- | ext/mysqli/php_mysqli.h | 42 |
6 files changed, 194 insertions, 327 deletions
diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index d76845faf4..15c78d6501 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -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); diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 2031aca73b..959df2d69f 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -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, ¶m_nr, MYSQLI_GET_STRING(data)) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols&", &mysql_stmt, mysqli_stmt_class_entry, ¶m_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); } /* }}} */ diff --git a/ext/mysqli/mysqli_driver.c b/ext/mysqli/mysqli_driver.c index 50c33dbe10..a8eb97e0f9 100644 --- a/ext/mysqli/mysqli_driver.c +++ b/ext/mysqli/mysqli_driver.c @@ -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[] = { diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index 2e041ca96d..cfed17880e 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -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); diff --git a/ext/mysqli/mysqli_prop.c b/ext/mysqli/mysqli_prop.c index 00170e3d54..693820c697 100644 --- a/ext/mysqli/mysqli_prop.c +++ b/ext/mysqli/mysqli_prop.c @@ -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;\ diff --git a/ext/mysqli/php_mysqli.h b/ext/mysqli/php_mysqli.h index d682f0a4c7..00be2d11e3 100644 --- a/ext/mysqli/php_mysqli.h +++ b/ext/mysqli/php_mysqli.h @@ -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 |