With thanks to Sara we looked at OnUpdateUTF8String to access a
php.ini value in OCI8 in PHP 6.

One of our engineers sent me a proposed patch for zend_ini.c in PHP6
to allow OnUpdateUTF8String to work as he thought it should.  Any
comments?

Chris

------------

> The problems I faced when unicode.semantics=On were:
>
> 1) Any OnUpdateUTF8String php.ini variable is seen as NULL in
> oci_globals.
>
> 2) If the above is resolved, the memory of the variable is wiped out,
> by the time we come to execution of the script, after module inits.
>
> 3) We still convert to UTF-16 when unicode.semantics=Off.

PS. Patch is attached - if it gets through.

--
Christopher Jones, Oracle
Email: [EMAIL PROTECTED]    Tel:  +1 650 506 8630
Blog:  http://blogs.oracle.com/opal/   Free PHP Book: http://tinyurl.com/f8jad
--- zend_ini.c  2007-10-02 11:07:32.000000000 -0700
+++ zend_ini.c.new      2007-10-16 13:20:03.000000000 -0700
@@ -640,7 +640,8 @@
 
 ZEND_API ZEND_INI_MH(OnUpdateUTF8String) /* {{{ */
 {
-       UChar **p;
+       UChar **up;
+       char **p;
        UChar *ustr = NULL;
        int32_t ustr_len, capacity;
        UErrorCode status = U_ZERO_ERROR;
@@ -651,30 +652,37 @@
 
        base = (char *) ts_resource(*((int *) mh_arg2));
 #endif
+       /* Convert only if unicode semantics is on. Otherwise, same as 
OnUpdateString */
+       if (UG(unicode)){
+               /* estimate capacity */
+               capacity = (new_value_length > 2) ? ((new_value_length >> 1) + 
(new_value_length >> 3) + 2) : new_value_length;
+
+               while (1) {
+                       ustr = peurealloc(ustr, capacity+1, 1);
+                       u_strFromUTF8(ustr, capacity+1, &ustr_len, new_value, 
new_value_length, &status);
+                       if (status == U_BUFFER_OVERFLOW_ERROR || status == 
U_STRING_NOT_TERMINATED_WARNING) {
+                               capacity = ustr_len;
+                               status = U_ZERO_ERROR;
+                       } else {
+                               break;
+                       }
+               }
 
-       /* estimate capacity */
-       capacity = (new_value_length > 2) ? ((new_value_length >> 1) + 
(new_value_length >> 3) + 2) : new_value_length;
-
-       while (1) {
-               ustr = eurealloc(ustr, capacity+1);
-               u_strFromUTF8(ustr, capacity, &ustr_len, new_value, 
new_value_length, &status);
-               if (status == U_BUFFER_OVERFLOW_ERROR) {
-                       capacity = ustr_len;
-                       status = U_ZERO_ERROR;
-               } else {
-                       break;
+               if (U_FAILURE(status)) {
+                       zend_error(E_WARNING, "Could not convert UTF-8 INI 
value to Unicode");
+                       efree(ustr);
+                       return FAILURE;
                }
-       }
 
-       if (U_FAILURE(status)) {
-               zend_error(E_WARNING, "Could not convert UTF-8 INI value to 
Unicode");
-               efree(ustr);
-               return FAILURE;
-       }
+               up = (UChar **) (base+(size_t) mh_arg1);
 
-       p = (UChar **) (base+(size_t) mh_arg1);
+               *up = ustr;
+       }
+       else {          /* Same as OnUpdateString */
+               p = (char **) (base+(size_t) mh_arg1);
 
-       *p = ustr;
+               *p = new_value;
+       }
        return SUCCESS;
 }
 /* }}} */

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to