From: Dmitry Stogov Date: Tue, 16 Aug 2005 16:29:16 +0000 (+0000) Subject: Unicode support X-Git-Tag: PRE_NEW_OCI8_EXTENSION~218 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=27f39c68261850969e44a4381e841f5e3fbe16ff;p=php Unicode support --- diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index dde78e4a9f..740bcaa6c2 100755 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -428,10 +428,24 @@ static void pdo_stmt_construct(pdo_stmt_t *stmt, zval *object, zend_class_entry zval z_key; MAKE_STD_ZVAL(query_string); - ZVAL_STRINGL(query_string, stmt->query_string, stmt->query_stringlen, 1); - ZVAL_STRINGL(&z_key, "queryString", sizeof("queryString")-1, 0); + if (UG(unicode)) { + UErrorCode status = U_ZERO_ERROR; + UChar *u_str; + int32_t u_len; + + zend_convert_to_unicode(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &u_str, &u_len, stmt->query_string, stmt->query_stringlen, &status); + ZVAL_UNICODEL(query_string, u_str, u_len, 0); + u_str = zend_ascii_to_unicode("queryString", sizeof("queryString") ZEND_FILE_LINE_CC); + ZVAL_UNICODEL(&z_key, u_str, sizeof("queryString")-1, 0); + } else { + ZVAL_STRINGL(query_string, stmt->query_string, stmt->query_stringlen, 1); + ZVAL_STRINGL(&z_key, "queryString", sizeof("queryString")-1, 0); + } std_object_handlers.write_property(object, &z_key, query_string TSRMLS_CC); zval_ptr_dtor(&query_string); + if (UG(unicode)) { + zval_dtor(&z_key); + } if (dbstmt_ce->constructor) { zend_fcall_info fci; diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index b3222a6c7f..e2d525c3ca 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -492,7 +492,19 @@ static inline void fetch_value(pdo_stmt_t *stmt, zval *dest, int colno TSRMLS_DC case PDO_PARAM_STR: if (value && !(value_len == 0 && stmt->dbh->oracle_nulls == PDO_NULL_EMPTY_STRING)) { - ZVAL_STRINGL(dest, value, value_len, !caller_frees); + if (UG(unicode)) { + UErrorCode status = U_ZERO_ERROR; + UChar *u_str; + int32_t u_len; + + zend_convert_to_unicode(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &u_str, &u_len, value, value_len, &status); + ZVAL_UNICODEL(dest, u_str, u_len, 0); + if (caller_frees) { + efree(value); + } + } else { + ZVAL_STRINGL(dest, value, value_len, !caller_frees); + } if (caller_frees) { caller_frees = 0; } @@ -787,8 +799,8 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value, INIT_PZVAL(&val); fetch_value(stmt, &val, i++ TSRMLS_CC); if (Z_TYPE(val) != IS_NULL) { - convert_to_string(&val); - if (zend_lookup_class(Z_STRVAL(val), Z_STRLEN(val), &cep TSRMLS_CC) == FAILURE) { + convert_to_text(&val); + if (zend_u_lookup_class(Z_TYPE(val), Z_STRVAL(val), Z_STRLEN(val), &cep TSRMLS_CC) == FAILURE) { stmt->fetch.cls.ce = ZEND_STANDARD_CLASS_DEF_PTR; } else { stmt->fetch.cls.ce = *cep; @@ -1837,9 +1849,9 @@ static void dbstmt_prop_write(zval *object, zval *member, zval *value TSRMLS_DC) { pdo_stmt_t * stmt = (pdo_stmt_t *) zend_object_store_get_object(object TSRMLS_CC); - convert_to_string(member); + convert_to_text(member); - if(strcmp(Z_STRVAL_P(member), "queryString") == 0) { + if ((Z_UNILEN_P(member) == sizeof("queryString")-1) && (ZEND_U_EQUAL(Z_TYPE_P(member), Z_UNIVAL_P(member), Z_UNILEN_P(member), "queryString", sizeof("queryString")-1))) { pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "property queryString is read only" TSRMLS_CC); } else { std_object_handlers.write_property(object, member, value TSRMLS_CC); @@ -1850,9 +1862,9 @@ static void dbstmt_prop_delete(zval *object, zval *member TSRMLS_DC) { pdo_stmt_t * stmt = (pdo_stmt_t *) zend_object_store_get_object(object TSRMLS_CC); - convert_to_string(member); + convert_to_text(member); - if(strcmp(Z_STRVAL_P(member), "queryString") == 0) { + if ((Z_UNILEN_P(member) == sizeof("queryString")-1) && (ZEND_U_EQUAL(Z_TYPE_P(member), Z_UNIVAL_P(member), Z_UNILEN_P(member), "queryString", sizeof("queryString")-1))) { pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "property queryString is read only" TSRMLS_CC); } else { std_object_handlers.unset_property(object, member TSRMLS_CC); diff --git a/ext/pdo/tests/pdo_016.phpt b/ext/pdo/tests/pdo_016.phpt index 21e7a80b78..9b7d168420 100644 --- a/ext/pdo/tests/pdo_016.phpt +++ b/ext/pdo/tests/pdo_016.phpt @@ -196,7 +196,7 @@ string(1) "2" string(7) "String0" string(7) "String1" string(7) "String2" ---UXPECT-- +--UEXPECT-- unicode(1) "3" array(3) { [0]=>