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.