[python-sybase] Simultaneous request

Sebastien MICHEL sebastien.michel at db.com
Mon, 3 Feb 2003 18:23:24 +0100


Hi,

=A0 =A0 =A0 =A0 i've installed python-sybase 0.35 according to INSTALL =
file. Everything is ok, I got sybasect.so compiled.

=A0 =A0 =A0 =A0 When I make some connections to database, everythin is =
right. But i'm using this module which is called as an external Method =
by Zope and if more than 2 connections occured on the same time, it cra=
hsed. Any idea ?


Blow the external method :

import sys
from string import replace, strip
from sybasect import *
from sybase_errors import *

MAX_COLSIZE =3D 255

def init_db():
=A0 =A0 # allocate a context
=A0 =A0 status, ctx =3D cs_ctx_alloc(CS_VERSION_100)
=A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 raise Error('cs_ctx_alloc failed')
=A0 =A0 if ctx.cs_diag(CS_INIT) !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 raise CSError(ctx, 'cs_diag failed')
=A0 =A0 # initialize the library
=A0 =A0 if ctx.ct_init(CS_VERSION_100) !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 raise CSError(ctx, 'ct_init failed')
=A0 =A0 return ctx

def connect_db(ctx, server, user_name, password):
=A0 =A0 # Allocate a connection pointer
=A0 =A0 status, con =3D ctx.ct_con_alloc()
=A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 raise CSError(ctx, 'ct_con_alloc failed')
=A0 =A0 if con.ct_diag(CS_INIT) !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 raise CTError(con, 'ct_diag failed')
=A0 =A0 # Set the username and password properties
=A0 =A0 if con.ct_con_props(CS_SET, CS_USERNAME, user_name) !=3D CS_SUC=
CEED:
=A0 =A0 =A0 =A0 raise CTError(con, 'ct_con_props CS_USERNAME failed')
=A0 =A0 if con.ct_con_props(CS_SET, CS_PASSWORD, password) !=3D CS_SUCC=
EED:
=A0 =A0 =A0 =A0 raise CTError(con, 'ct_con_props CS_PASSWORD failed')
=A0 =A0 # connect to the server
=A0 =A0 if con.ct_connect(server) !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 raise CTError(con, 'ct_connect failed')
=A0 =A0 return con


def bind_columns(cmd):
=A0 =A0 =A0 =A0 status, num_cols =3D cmd.ct_res_info(CS_NUMDATA)
=A0 =A0 =A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 #raise CTError(cmd.con, 'ct_res_info fa=
iled')
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return bufs

=A0 =A0 =A0 =A0 bufs =3D [None] * num_cols
=A0 =A0 =A0 =A0 for i in range(num_cols):
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fmt =3D CS_DATAFMT()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fmt.datatype =3D CS_CHAR_TYPE
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fmt.maxlength =3D MAX_COLSIZE
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fmt.count =3D 1
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fmt.format =3D CS_FMT_NULLTERM
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # Bind returned data to host variables
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 status, buf =3D cmd.ct_bind(i + 1, fmt)=

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return bufs
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bufs[i] =3D buf
=A0 =A0 =A0 =A0 return bufs


def fetch(cmd, bufs, results):
=A0 =A0 =A0 =A0 status, num_cols =3D cmd.ct_res_info(CS_NUMDATA)
=A0 =A0 =A0 =A0 if status =3D=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # Fetch the bound data into host variab=
les
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 while 1:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 status, rows_read =3D c=
md.ct_fetch()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 row =3D []
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if status not in (CS_SU=
CCEED, CS_ROW_FAIL):
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if status =3D=3D CS_ROW=
_FAIL:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 continu=
e
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 for i in range(num_cols=
):
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if bufs=
[i][0] =3D=3D None:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 row.append('')
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 row.append(strip(replace(bufs[i][0],'\000','')))
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 results.append(row)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if status !=3D CS_END_DATA:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 #raise CTError(cmd.conn=
, 'ct_fetch failed')
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pass
=A0 =A0 =A0 =A0 else:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 #raise CTError(cmd.conn, 'ct_res_info f=
ailed')
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pass

def handle_returns(cmd, retcode, outputs, rows):
=A0 =A0 =A0 =A0 # Process all returned result types
=A0 =A0 =A0 =A0 sql_status =3D CS_SUCCEED
=A0 =A0 =A0 =A0 while 1:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 status, result =3D cmd.ct_results()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if result =3D=3D CS_ROW_RESULT:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bufs =3D bind_columns(c=
md)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fetch(cmd, bufs, rows)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 elif result =3D=3D CS_CMD_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pass
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 elif result =3D=3D CS_CMD_DONE:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pass
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 elif result =3D=3D CS_CMD_FAIL:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 #raise CTError(cmd.conn=
, 'ct_results: CS_CMD_FAIL')
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sql_status =3D CS_FAIL
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 elif result =3D=3D CS_PARAM_RESULT:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bufs =3D bind_columns(c=
md)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fetch(cmd, bufs, output=
s)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 elif result =3D=3D CS_STATUS_RESULT:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bufs =3D bind_columns(c=
md)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fetch(cmd, bufs, retcod=
e)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 elif result =3D=3D CS_COMPUTE_RESULT:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pass
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break
=A0 =A0 =A0 =A0 if status !=3D CS_END_RESULTS:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 #raise CTError(cmd.conn, 'ct_results fa=
iled')
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return CS_FAIL
=A0 =A0 =A0 =A0 else:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if sql_status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return CS_FAIL
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return CS_SUCCEED


def cleanup_db(ctx,status):
=A0 =A0 =A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 exit_type =3D CS_FORCE_EXIT
=A0 =A0 =A0 =A0 else:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 exit_type =3D CS_UNUSED
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # close and cleanup connection to the s=
erver
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ctx.ct_exit(exit_type) !=3D CS_SUCCE=
ED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 raise CSError(ctx, 'ct_=
exit failed')
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # drop the context
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ctx.cs_ctx_drop() !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 raise CSError(ctx, 'cs_=
ctx_drop failed')


class SybaseSQL:
=A0 =A0 =A0 =A0 """Execute a stored procedure on a Sybase server"""

=A0 =A0 =A0 =A0 def __init__(self, server, user, password, sql_statemen=
t):
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 self.__allow_access_to_unprotected_subo=
bjects__ =3D 1
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 self.retcode =3D []
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 self.outputs =3D []
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 self.rows =3D []


=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # Allocate a context and initialize cli=
ent-library
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ctx =3D init_db()

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # Allocate a command structure
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 con =3D connect_db(ctx, server, user, p=
assword)

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # Allocate a command structure
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 status, cmd =3D con.ct_cmd_alloc()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 raise CTError(con, 'ct_=
cmd_alloc failed')

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # Send the command to the server
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 status =3D cmd.ct_command(CS_LANG_CMD, =
sql_statement)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sql_error =3D CTError(c=
md.con, 'ct_command failed')
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cmd.ct_cmd_drop()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 con.ct_close()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cleanup_db(ctx, status)=

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 raise sql_error

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # Execute SQL statement on the server
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 status =3D cmd.ct_send()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sql_error =3D CTError(c=
md.con, 'ct_send failed')
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cmd.ct_cmd_drop()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 con.ct_close()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cleanup_db(ctx, status)=

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 raise sql_error

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # Process results from the server
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 status =3D handle_returns(cmd, self.ret=
code, self.outputs, self.rows)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cmd.ct_cmd_drop()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 con.ct_close()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cleanup_db(ctx, status)=

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 raise CTError(con,'hand=
le_returns failed')

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # Drop the command structure
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 status =3D cmd.ct_cmd_drop()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sql_error =3D =A0CTErro=
r(con, 'ct_cmd_drop failed')
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 con.ct_close()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cleanup_db(ctx, status)=

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 raise sql_error

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # Close the connection to the server
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 status =3D con.ct_close()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if status !=3D CS_SUCCEED:
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sql_error =3D =A0CTErro=
r(con, 'ct_close failed')
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cleanup_db(ctx, status)=

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 raise sql_error

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 # Drop the context and do general clean=
up
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cleanup_db(ctx, status)



=A0 =A0 =A0 =A0 def ReturnCode(self):
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 """Return the code of the procedure"""
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return self.retcode

=A0 =A0 =A0 =A0 def Outputs(self):
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 """Return the output parameters"""
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return self.outputs

=A0 =A0 =A0 =A0 def Rows(self):
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 """Return the rows"""
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return self.rows


def execSybaseSQL(server, user, password, sql_statement):
=A0 =A0 =A0 =A0 """Init a Sybase RPC object"""
=A0 =A0 =A0 =A0 return SybaseSQL(server, user, password, sql_statement)=



if __name__ =3D=3D "__main__":

=A0 =A0 =A0 =A0 Request =3D execSybaseSQL("ds_teddy_uat", "michse", "sm=
huat01","select * from TEDDY_USERS")

=A0 =A0 =A0 =A0 print Request.ReturnCode()

=A0 =A0 =A0 =A0 print Request.Outputs()

=A0 =A0 =A0 =A0 print Request.Rows()


Sebastien.

Sebastien Michel
Front Office Technology
+33 1 44 95 62 89
3, avenue de Friedland
75008 Paris


--

This e-mail may contain confidential and/or privileged information. If =
you are not the intended recipient (or have received this e-mail in err=
or) please notify the sender immediately and destroy this e-mail. Any u=
nauthorized copying, disclosure or distribution of the material in this=
 e-mail is strictly forbidden.
=