On Sun, Aug 31, 2008 at 11:47:38PM +0100, Martin J. Evans wrote:
> Tim Bunce wrote:
>> On Fri, Aug 29, 2008 at 12:37:48PM +0100, Martin Evans wrote:
>>   
>>> Martin Evans wrote:
>>>     
>>>> dbd_st_prepare and dbd_db_login6 both take char* and not the original SV 
>>>> so how can I tell if the strings are utf8 encoded or not?
>>>>
>>>> What I'd like to be able to do (in ODBC terms is):
>>>>
>>>> In dbd_db_login6
>>>>   test if connection string has utf8 set on it
>>>>   if (utf8on)
>>>>     convert utf8 to utf16 (that is what ODBC wide functions use)
>>>>     call SQLDriverConnectW
>>>>   else
>>>>     call SQLDriverConnect (this is the ANSI version)
>>>>
>>>> Similarly in prepare where a number of people have unicode column or 
>>>> table names and hence want to do "select unicode_column_name from 
>>>> table".
>>>>
>>>> Is this what dbd_st_prepare_sv (as opposed to dbd_st_prepare) is for? 
>>>> and should there be a dbd_db_login6_sv?
>>
>> Yes, and yes.
>>   
> Thanks Tim. So how do I get a login6_sv? (I've got an awful feeling you are 
> going to say send a patch).

Your feeling is spot on. Should be trivial though. There are several
similar cases in Driver.xst already.

Thanks for working on this Martin!

Tim.

>>> Also, to use dbd_st_prepare_sv am I supposed to add something like the 
>>> following to ODBC.xs:
>>>
>>> #include "ODBC.h"
>>> # the following line added:
>>> #define dbd_st_prepare_sv dbd_st_prepare_sv
>>
>> Each driver should have a .h file that contains a bunch of line like
>>
>>     #define dbd_db_do               ora_db_do
>>     #define dbd_db_commit           ora_db_commit
>>     #define dbd_db_rollback         ora_db_rollback
>>     ...etc...
>>
>> They indicate which methods have implementations in C, which
>> implementation should be used, i.e. dbd_db_login vs dbd_db_login6,
>> and they ensure that the C function names are unique so multiple drivers
>> can be statically linked into the same executable. (Though few people
>> care about static linking these days.)
>>
>> The "Implementation header dbdimp.h" in the DBI::DBD docs talks about this.
>>
>> So, to answer your question, alongside your existing set of #defines
>> you'd add #define dbd_st_prepare_sv odbc_st_prepare_sv.
>>
>> (It's probably a personal preference if you name the actual C function
>> odbc_st_prepare_sv, or name it dbd_st_prepare_sv and let the macro
>> rename it for you.)
>>
>> Tim.
>
> Sorted, thank you.
>
> I've got a load of unicode changes for DBD::ODBC but I'm still not 100% 
> about some of them. I keep getting emails from people tapping in stuff like 
> japanese (JIS) strings into their SQL and expecting it to just work across 
> different platforms. To add to the confusion ODBC (as far as Microsoft is 
> concerned) already defines SQLxxxW functions which are (wide - ha, i.e., 
> UCS-2 versions for the normal ANSI functions). The current changes would 
> allow connection to a unicode data source name (if I've got login6_sv), 
> preparing of unicode SQL and support for unicode column and table names - 
> all decode_utf8'ed to perl.
>
> As an aside, if anyone reading this has wanted any kind of unicode support 
> in DBD::ODBC (which is not already there) please get in contact with me.
>
> Martin

Reply via email to