Sybase module 0.33pre3 released
Dave Cole
djc@object-craft.com.au
14 Feb 2002 23:34:41 +1100
What is it:
The Sybase module provides a Python interface to the Sybase relational
database system. It supports all of the Python Database API, version
2.0 with extensions.
Note:
Since the 0.32 release I have come to the realisation that the Sybase
dynamic SQL functionality is not nearly general enough to use for
correct DB-API functionality. I have thrown up my hands and gone back
to the drawing board with the high level Sybase.py module.
Status of 0.33pre2:
The 0.33pre2 release seems to be quite solid. I have not received any
complaints from any of the 10 (count them) people who downloaded the
module. Ben Gertzfield managed to implement a multi-threaded whois
server on top of the 0.32pre2 release.
Changes for 0.33pre3:
1) Release 0.32pre2 changed the paramstyle to 'format'. Shai Berger
sent me some valuable advice on how to continue to send binary
parameters to the server without using ct_dynamic() so the
paramstyle is now 'named'. This means that you can now do this:
c.execute("select * from titles where title like @arg",
{ '@arg': 'The %' })
2) You can send arguments to Cursor.callproc() the old way:
c.callproc('sp_help', ['titles'])
or the new way:
c.callproc('sp_help', { '@objname': 'titles' })
3) Some internal cursor state constants were privatised (via leading
'_'). Sadly no money was raised in the process and the conditions
of the privatisation contract are commercial-in-confidence.
4) You can now compile the extension module without bulkcopy support
by doing this:
python setup.py build_ext -U WANT_BULKCOPY
python setup.py install
5) The default build does not do threading any more so if you want
threading enabled you will have to do this:
python setup.py build_ext -D WANT_THREADS
python setup.py install
6) There is some extra debugging detail for CS_DATAFMT which means you
now get messages like this:
>>> import Sybase
>>> db = Sybase.connect('SYBASE', 'sa', '', 'pubs2')
>>> db._conn.debug = 1
>>> c = db.cursor()
ct_cmd_alloc(conn0, &cmd) -> CS_SUCCEED, cmd1
>>> c.callproc('sp_help', {'@objname': 'titles'})
ct_command(cmd1, CS_RPC_CMD, "sp_help", CS_NULLTERM, CS_UNUSED) -> CS_SUCCEED
ct_param(cmd1, &databuf0->fmt=[name:"@objname" type:CS_CHAR_TYPE status:CS_INPUTVALUE format:CS_FMT_NULLTERM count:1 maxlength:7], databuf0->buff, 6, 0) -> CS_SUCCEED
ct_send(cmd1) -> CS_SUCCEED
ct_results(cmd1, &result) -> CS_SUCCEED, CS_ROW_RESULT
ct_res_info(cmd1, CS_NUMDATA, &value, CS_UNUSED, NULL) -> CS_SUCCEED, 3
ct_describe(cmd1, 1, &fmt) -> CS_SUCCEED, datafmt0=[name:"Name" type:CS_CHAR_TYPE status:CS_UPDATABLE format:CS_FMT_UNUSED count:0 maxlength:30]
ct_bind(cmd1, 1, &datafmt0->fmt=[name:"Name" type:CS_CHAR_TYPE status:CS_UPDATABLE format:CS_FMT_UNUSED count:1 maxlength:30], databuf1->buff, databuf1->copied, databuf1->indicator) -> CS_SUCCEED, databuf1
ct_describe(cmd1, 2, &fmt) -> CS_SUCCEED, datafmt1=[name:"Owner" type:CS_CHAR_TYPE status:48 format:CS_FMT_UNUSED count:0 maxlength:30]
ct_bind(cmd1, 2, &datafmt1->fmt=[name:"Owner" type:CS_CHAR_TYPE status:48 format:CS_FMT_UNUSED count:1 maxlength:30], databuf2->buff, databuf2->copied, databuf2->indicator) -> CS_SUCCEED, databuf2
ct_describe(cmd1, 3, &fmt) -> CS_SUCCEED, datafmt2=[name:"Type" type:CS_CHAR_TYPE status:48 format:CS_FMT_UNUSED count:0 maxlength:22]
ct_bind(cmd1, 3, &datafmt2->fmt=[name:"Type" type:CS_CHAR_TYPE status:48 format:CS_FMT_UNUSED count:1 maxlength:22], databuf3->buff, databuf3->copied, databuf3->indicator) -> CS_SUCCEED, databuf3
7) There is some initial work to support FreeTDS. One of the problems
with FreeTDS is that it does not support inline error handling.
The callback error handling works well if you do not compile for
threads support, but causes problems when compiled for threading.
The problem occurs when the extension module releases the global
interpreter lock when calling the Sybase CT library. A Python
callback causes the interpreter to be reentered by the callback
which leads to bad things when the following warning from the
Python include file ceval.h is violated:
WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND
Py_END_ALLOW_THREADS!!!
At the moment the module will compile for FreeTDS (at least it does
on my machine) and some things do work. All you have to do is
compile like this:
python setup.py build_ext -D HAVE_FREETDS
python setup.py install
There is no error handling and reporting for FreeTDS yet.
8) The was a minor change to setup.py for:
a) Solaris. It no longer staticly links the libcomn.a Sybase
library.
b) Linux. No longer looks for both libsybtcl and libtcl. Now
looks for libinsck.
Extra Pleading:
Please download the pre-release version, try it out, and then send me
some mail telling me what you found. You would be surprised at how
little mail I get regarding the Sybase module, I really do need your
help. If more than 10 people tried the module we would all benefit...
The module is available here:
http://www.object-craft.com.au/projects/sybase/sybase-0.33pre3.tar.gz
The module home page is here:
http://www.object-craft.com.au/projects/sybase/
- Dave
--
http://www.object-craft.com.au