I wonder if this would break any of the assumptions built into the utf8 code.
There might be places that assume the charset is what the NLS env vars specify.
Just a thought.

Tim.

On Thu, Mar 29, 2007 at 03:04:40PM -0400, Stephen J. Smith wrote:
> Below is a patch that allows DBD::Oracle users to specify charset during
> connect as follows:
> 
> $dbh = DBI->connect("dbi:Oracle:$sid", $user, $pass, { ora_csid => 'AL32UTF8' 
> });
> 
> The patch is the simplest thing that I could come up with to demonstrate
> the idea.  I'm happy to make it robust if there is interest.  Basically,
> I call OCIEnvNlsCreate a second time, after using the first envhp to
> convert the charset given as a string to Oracle's numeric identifier.
> 
> Cheers,
> Stephen
> 
> $ diff -uNr DBD-Oracle-1.19.orig DBD-Oracle-1.19 
> diff -uNr DBD-Oracle-1.19.orig/dbdimp.c DBD-Oracle-1.19/dbdimp.c
> --- DBD-Oracle-1.19.orig/dbdimp.c       2006-11-03 10:05:46.000000000 -0400
> +++ DBD-Oracle-1.19/dbdimp.c    2007-03-29 08:34:54.486164400 -0400
> @@ -502,6 +502,14 @@
>                  return 0;
>              }
>  
> +            svp = DBD_ATTRIB_GET_SVP(attr, "ora_csid", 8);
> +            if (svp && SvOK(*svp)) {
> +                charsetid = OCINlsCharSetNameToId(imp_dbh->envhp, 
> SvPV_nolen(*svp));
> +               imp_dbh->envhp = NULL;
> +                OCIEnvNlsCreate_log_stat( &imp_dbh->envhp, init_mode, 0, 
> NULL, NULL, NULL, 0, 0,
> +                       charsetid, ncharsetid, status );
> +            }
> +
>              /* update the hard-coded csid constants for unicode charsets */
>              utf8_csid      = OCINlsCharSetNameToId(imp_dbh->envhp, 
> (void*)"UTF8");
>              al32utf8_csid  = OCINlsCharSetNameToId(imp_dbh->envhp, 
> (void*)"AL32UTF8");
> EOP

Reply via email to