]> granicus.if.org Git - php/commitdiff
Unicode support
authorDmitry Stogov <dmitry@php.net>
Tue, 16 Aug 2005 16:29:16 +0000 (16:29 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 16 Aug 2005 16:29:16 +0000 (16:29 +0000)
ext/pdo/pdo_dbh.c
ext/pdo/pdo_stmt.c
ext/pdo/tests/pdo_016.phpt

index dde78e4a9fe1a6d6ac8a44f5708e31542f9a0725..740bcaa6c207035ad5f602d27966e4e4787d462e 100755 (executable)
@@ -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;
index b3222a6c7ff7df3464b94186d67b03cec44e0427..e2d525c3cab18c5e2c672e371a9a54dba71fc748 100755 (executable)
@@ -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);
index 21e7a80b78777fbff2f8f8b69991686ac837ed74..9b7d1684200703353a6960e7a9c14d7ecb5fc107 100644 (file)
@@ -196,7 +196,7 @@ string(1) "2"
 string(7) "String0"
 string(7) "String1"
 string(7) "String2"
---UXPECT--
+--UEXPECT--
 unicode(1) "3"
 array(3) {
   [0]=>