From: Sebastien M. <seb...@db...> - 2003-02-04 12:23:31
|
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. = |