From: <Sha...@in...> - 2003-02-04 12:49:11
|
Hi, Are you aware of the Zope Sybase DA = (http://www.zope.org/Products/DA/SybaseDA)? Is there a reason why you aren't using it? Zope has a rich machinery for dealing with SQL databases. It is not = perfect, but usually solves more problems than it raises. By using an external = function, you give up all that machinery. I don't know -- it may, or may not, be a good idea to rewrite the Sybase = adapter with the Sybase module; however, for practical reasons, it's available. (and, perhaps, it is a good idea for sybasect to compare notes with the = extension module underlying this DA, sy_occ). Disclaimer: I am not related to the SybaseDA, and I haven't even tried = it. I just found out about it when I ran a search in Zope.org. Have fun, Shai. -----Original Message----- From: Sebastien MICHEL [mailto:seb...@db...]=20 Sent: Monday, February 03, 2003 19:23 To: pyt...@ob... Subject: [python-sybase] Simultaneous request 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 = crahsed. 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_SUCCEED: =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_SUCCEED: =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 = failed') =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 = variables =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 = cmd.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_SUCCEED, 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 continue =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 = failed') =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(cmd) =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(cmd) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fetch(cmd, bufs, = outputs) =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(cmd) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fetch(cmd, bufs, = retcode) =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 = failed') =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 = server =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ctx.ct_exit(exit_type) !=3D = CS_SUCCEED: =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_statement): =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = self.__allow_access_to_unprotected_subobjects__ =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 = client-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, = password) =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(cmd.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(cmd.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.retcode, 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,'handle_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 = =A0CTError(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 = =A0CTError(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 = cleanup =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", = "smhuat01","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 = error) please notify the sender immediately and destroy this e-mail. Any = unauthorized copying, disclosure or distribution of the material in this = e-mail is strictly forbidden. _______________________________________________ Python-sybase mailing list Pyt...@ob... https://object-craft.com.au/cgi-bin/mailman/listinfo/python-sybase |