[python-sybase] Simultaneous request

Shai.Berger@integration.sungard.com Shai.Berger at integration.sungard.com
Mon, 3 Feb 2003 19:49:15 +0200


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:sebastien.michel@db.com]=20
Sent: Monday, February 03, 2003 19:23
To: python-sybase@object-craft.com.au
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
Python-sybase@object-craft.com.au
https://object-craft.com.au/cgi-bin/mailman/listinfo/python-sybase