[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