[egenix] Re: [egenix-users] Null termination differences in
drivers - comment in mxODBC.c
Martin J. Evans
martin.evans at easysoft.com
Fri Oct 22 16:48:47 CEST 2004
On 22-Oct-2004 M.-A. Lemburg wrote:
> M.-A. Lemburg wrote:
>> Martin J. Evans wrote:
>>
>>> Could anyone explain the origin of the following comment in mxODBC.c
>>> (specifically the reference to the Easysoft Oracle driver)?
>>
>>
>> We had to add that work-around to make mxODBC work with the
>> EasySoft Oracle driver 1.0.0.6. Things may be different with
>> more recent versions. The work-around adapts accordingly.
>>
>>> How do you reproduce this?
>>
>>
>> Simple: query a BLOB of say 1MB data from the database.
>
> Sorry: make that CLOB (the problem only triggers for character
> data such as XML data).
I believe with Easysoft ODBC-Oracle V1.3 and later this works fine without your
workaround and I think it should work in versions from 1.1 onwards but have not
tested all of those.
Thanks again for the pointer.
>>> Thanks.
>>>
>>> if (null_terminated) {
>>> /* Remove null termination; various ODBC drivers have
>>> bugs
>>> in the way the handle null-termination:
>>>
>>> * EasySoft ODBC for Oracle does not null-terminate
>>> character
>>> columns, even though it should
>>>
>>> * MS SQL Server ODBC always null-terminates Unicode
>>> columns
>>> with two nulls, even when fetching the data as
>>> SQL_C_CHAR
>>> where it should only append one null-termination
>>> character
>>>
>>> The ODBC standard is unclear about what to do, but
>>> using sizeof(SQLWCHAR) seems to work in most
>>> cases. We have to careful here, since some database
>>> drivers allow passing binary data back through
>>> character columns, so embedded nulls are well
>>> possible.
>>>
>>> Thanks to Tommi Auvinen for helping to track down
>>> the MS SQL Server problem.
>>>
>>> */
>>> char *data = (char *)newdata;
>>> int endofdata = offset + received - 1;
>>> if (data[endofdata] == '\0') {
>>> received--;
>>> #ifdef SQL_WCHAR
>>> if (data[endofdata - 1] == '\0') {
>>> if (var->ctype == SQL_C_WCHAR ||
>>> var->sqltype == SQL_WCHAR ||
>>> var->sqltype == SQL_WVARCHAR ||
>>> var->sqltype == SQL_WLONGVARCHAR)
>>> received -= sizeof(SQLWCHAR) - 1;
>>> }
>>> #endif
>>> }
>>> }
>>>
>>>
>>> --
>>> Martin J. Evans
>>> Easysoft Ltd, UK
>>> Development
>>>
>>>
>>> _______________________________________________________________________
>>> eGenix.com User Mailing List http://www.egenix.com/
>>> http://lists.egenix.com/mailman/listinfo/egenix-users
>>
>>
>
> --
> Marc-Andre Lemburg
> eGenix.com
>
> Professional Python Services directly from the Source (#1, Oct 22 2004)
> >>> Python/Zope Consulting and Support ... http://www.egenix.com/
> >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/
> >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/
> ________________________________________________________________________
>
>::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! ::::
Martin
--
Martin J. Evans
Easysoft Ltd, UK
Development
More information about the egenix-users
mailing list