On Mon, Jan 09, 2006 at 03:19:13PM +0000, Tim Bunce wrote:
> > Any idea what should I try next to make CS_IS_UTF8 (and fbh->csid)
> > behave like it is supposed to?
> 
> Try the appended patch. Should work for NCHAR as well.
> 
> Thanks Honza.
> 
> Tim.
> 
> Index: oci8.c
> ===================================================================
> --- oci8.c    (revision 2342)
> +++ oci8.c    (working copy)
> @@ -1223,7 +1223,7 @@
>               /* FALLTHRU */
>       case  96:                               /* CHAR         */
>               fbh->disize = fbh->dbsize;
> -             if (CS_IS_UTF8(fbh->csid)) 
> +             if (CSFORM_IMPLIES_UTF8(fbh->csform))
>                   fbh->disize = fbh->dbsize * 4;
>               fbh->prec   = fbh->disize;
>               break;
> @@ -1249,7 +1249,7 @@
>               break;
>  
>       case   8:                               /* LONG         */
> -                if (CS_IS_UTF8(fbh->csid)) 
> +             if (CSFORM_IMPLIES_UTF8(fbh->csform))
>                      fbh->disize = long_readlen * 4;
>                  else
>                      fbh->disize = long_readlen;

Works both for ISO-8859-2 database with UTF-8 client, and UTF-8 database
with UTF-8 client. As a matter of fact, you do _not_ need to multiply
by four when both database and client character sets are UTF-8 variants,
so how about:

--- oci8.c.orig 2006-01-16 14:13:33.000000000 +0100
+++ oci8.c      2006-01-16 14:22:20.000000000 +0100
@@ -1224,9 +1224,10 @@
                avg_width = fbh->dbsize / 2;
                /* FALLTHRU */
        case  96:                               /* CHAR         */
-               fbh->disize = fbh->dbsize;
-               if (CSFORM_IMPLIES_UTF8(fbh->csform))
+               if (CSFORM_IMPLIES_UTF8(fbh->csform) && 
(!CS_IS_UTF8(fbh->csid)))
                    fbh->disize = fbh->dbsize * 4;
+               else
+                   fbh->disize = fbh->dbsize;
                fbh->prec   = fbh->disize;
                break;
        case  23:                               /* RAW          */
@@ -1251,7 +1252,7 @@
                break;

        case   8:                               /* LONG         */
-               if (CSFORM_IMPLIES_UTF8(fbh->csform))
+               if (CSFORM_IMPLIES_UTF8(fbh->csform) && 
(!CS_IS_UTF8(fbh->csid)))
                     fbh->disize = long_readlen * 4;
                 else
                     fbh->disize = long_readlen;


-- 
------------------------------------------------------------------------
 Honza Pazdziora | [EMAIL PROTECTED] | http://www.fi.muni.cz/~adelton/
 .project: Perl, mod_perl, DBI, Oracle, large Web systems, XML/XSL, ...
                Only self-confident people can be simple.

Reply via email to