[DB-SIG] Help w/ bugs in dbiDate win32

Marcos Sánchez Provencio msanchez at grupoburke.com
Fri Jan 30 06:07:29 EST 2004


This module is really obsolete. I suggest that you use mx.ODBC 
http://www.egenix.com/files/python/eGenix-mx-Extensions.html#mxODBC
or adodbapi http://adodbapi.sourceforge.net/

kinquiry at kennedytech.com escribió:
> 
> Not sure if I'm posting to the right group.
> 
> Below describes situations with dbiDate and odbc modules under win32 
> that will crash python.
> 
>  From all that I have been able to gather, the win32all odbc.py module 
> uses the dbi.dbiDate object whenever a result column in SQL references 
> an ODBC timestamp type field.
> 
> I've played with this object on various win32 machines, with various 
> versions of python 2.X , and have experienced the following (which I 
> think is due to unimplemented or incorrectly implemented python base 
> object functions in the underlying C++ code in odbc.cpp and dbi.cpp):
> 
> When instantiating the dbiDate with a float in the constructor (which I 
> think is how it's supposed to be used), everything works OK.....
> 
> $ python
> ActivePython 2.2.2 Build 224 (ActiveState Corp.) based on
> Python 2.2.2 (#37, Nov 26 2002, 10:24:37) [MSC 32 bit (Intel)] on win32
> Type "help", "copyright", "credits" or "license" for more information.
>  >>> import dbi
>  >>> import time
>  >>> x = dbi.dbiDate(time.time())
>  >>> x
> <DbiDate object at 0x007A8100>
>  >>> float(x)
> 1075446574.7260001
>  >>> str(x)
> 'Fri Jan 30 02:09:34 2004'
>  >>> long(x)
> 1075446574L
>  >>> int(x)
> 1075446574
>  >>> x <> 0
> 1
>  >>> x == 0
> 0
>  >>> x == None
> 0
>  >>>
> 
> However, the dbiDate object will let you instantiate it with something 
> other than a float in the constructor (like None).  I wouldn't do this 
> in my code, but I think there might be some cases when odbc.pyd does 
> this, or something similar.  For example:
> 
> $ python
> ActivePython 2.2.2 Build 224 (ActiveState Corp.) based on
> Python 2.2.2 (#37, Nov 26 2002, 10:24:37) [MSC 32 bit (Intel)] on win32
> Type "help", "copyright", "credits" or "license" for more information.
>  >>> import dbi
>  >>> x = dbi.dbiDate(None)
>  >>> float(x)
> 
> WILL CRASH PYTHON.
> 
> I might be barking up the wrong tree, but I suspect that the above 
> condition is similar to what happens in the following REAL WORLD code 
> snippet:
> 
> $ python
> ActivePython 2.2.2 Build 224 (ActiveState Corp.) based on
> Python 2.2.2 (#37, Nov 26 2002, 10:24:37) [MSC 32 bit (Intel)] on win32
> Type "help", "copyright", "credits" or "license" for more information.
>  >>> import odbc
>  >>> cur = odbc.odbc('beaulieu').cursor() # MySQL database on win32
>  >>> cur.execute('use newbeaulieu')
> 0
>  >>> cur.execute("""
> ...   select date_format(PRDOB8,'%M %D %Y') , PRDOB8
> ...   from cvt_1_prpmss where import_sequence = 342056
> ...   """
> ... )
> 0
>  >>> res = cur.fetchall()
>  >>> res
> [('November 23rd 1985', <DbiDate object at 0x007A6F40>)]
>  >>> testDate = res[0][1]
>  >>>
>  >>> cur.execute("""
> ...   create table test_table ( dt datetime )
> ...   """
> ... )
> 0
>  >>> cur.execute('insert into test_table ( dt ) values ( ? )', ( 
> testDate , ) )
> 1
>  >>> cur.execute("""
> ...   select date_format(PRDOB8,'%M %D %Y') , PRDOB8
> ...   from cvt_1_prpmss where import_sequence = 1
> ...   """
> ... )
> 0
>  >>> res = cur.fetchall()
>  >>> res
> [('April 19th 1954', <DbiDate object at 0x007A5648>)]
>  >>> testDate = res[0][1]
>  >>>
>  >>> cur.execute('insert into test_table ( dt ) values ( ? )', 
> (testDate, ) )
> 
> The last line crashed python with an invalid memory access error.  I 
> think it's because the date was before the epoch, which probably isn't 
> supported by the C libraries that dbiDate uses.  This seems a logical 
> conclusion, since the code for the 2nd 'insert' was exactly the same as 
> the first, but it used an older date as a parameter.  From what I can 
> gather, once an old date is put into a dbiDate instance, many of the 
> methods on the dbiDate overwrite memory and will eventually crash python.  
> 
> I'm at a standstill with this now, because I'm not a good C programmer, 
> and I don't have visual studio.  There doesn't seem to be too much code 
> involved in the two .cpp modules that underly the dbi and odbc python 
> modules in win32all.  
> 
> Ideally, the odbc module should be given a function or a flag to check 
> that would cause it to pass the date value back as a float ( or whatever 
> the underlying odbc API returns ) so that application programmers can 
> deal with it.  Or, even better, dbiDate could be replaced with an object 
> that works for dates older than 1970.
> 
> Does anyone have any ideas?  Any help would be greatly appreciated.
> 
> Best Regards,
> John Kennedy
> 





More information about the DB-SIG mailing list