#! /usr/bin/env python # Copyright (c) 2000 Roman Milner # See the file COPYING for more information import sys from time import localtime, time, mktime import string import exceptions from SQLRelay import CSQLRelay apilevel = '2.0' threadsafety = 1 paramstyle = 'named' class Error(exceptions.StandardError): pass class Warning(exceptions.StandardError): pass class InterfaceError(Error): pass class DatabaseError(Error): pass class InternalError(DatabaseError): pass class OperationalError(DatabaseError): pass class ProgrammingError(DatabaseError): pass class IntegrityError(DatabaseError): pass class DataError(DatabaseError): pass class NotSupportedError(DatabaseError): pass def connect(host, port, socket, user, password, retrytime=0, tries=1): return SQLRConnection(host, port, socket, user, password, retrytime, tries) class SQLRConnection: def __init__(self, host, port, socket, user, password, retrytime, tries): self.connection = CSQLRelay.sqlrcon_alloc(host, port, socket, user, password, retrytime, tries) def close(self): CSQLRelay.sqlrcon_free(self.connection) def commit(self): self.rowcount=0 return CSQLRelay.commit(self.connection) def rollback(self): self.rowcount=0 return CSQLRelay.rollback(self.connection) def cursor(self): return SQLRCursor(self.connection) class SQLRCursor: def __init__(self, con): self.cursor = CSQLRelay.sqlrcur_alloc(con) self.arraysize = 1 def setinputsizes(self): pass def setoutputsize(self): pass def execute(self, operation, parameters=None): self.rowcount=0 self.cur_row = 0 CSQLRelay.prepareQuery(self.cursor,operation) if parameters is not None: for i in parameters.keys(): precision=0 scale=0 if type(parameters.keys())==type(1.1): precision=len(str(parameters.keys()))-1 scale=precision-len(str(int(parameters.keys())))-1 CSQLRelay.inputBind(self.cursor,i,parameters[i],precision,scale) CSQLRelay.executeQuery(self.cursor) the_error = CSQLRelay.errorMessage(self.cursor) if the_error: raise DatabaseError, '<pre>%s</pre>' % the_error self.__set_description() self.rowcount=CSQLRelay.totalRows(self.cursor) if CSQLRelay.affectedRows(self.cursor)>0: self.rowcount=CSQLRelay.affectedRows(self.cursor) def executemany(self, operation, parameters=None): if parameters is None: self.execute(operation) else: self.rowcount=0 self.cur_row = 0 CSQLRelay.prepareQuery(self.cursor,operation) for p in parameters: CSQLRelay.clearBinds(self.cursor) if p is not None: for i in p.keys(): precision=0 scale=0 if type(p.keys())==type(1.1): precision=len(str(p.keys()))-1 scale=precision-len(str(int(p.keys())))-1 CSQLRelay.inputBind(self.cursor,i,p[i],precision,scale) CSQLRelay.executeQuery(self.cursor) the_error = CSQLRelay.errorMessage(self.cursor) if the_error: raise DatabaseError, '<pre>%s</pre>' % the_error self.__set_description() self.rowcount=CSQLRelay.totalRows(self.cursor) if CSQLRelay.affectedRows(self.cursor)>0: self.rowcount=CSQLRelay.affectedRows(self.cursor) def callproc(self, procname, parameters=None): self.execute(procname,parameters) def fetchone(self): row = CSQLRelay.getRow(self.cursor,self.cur_row) self.cur_row = self.cur_row + 1 return row def fetchmany(self, size=None): if not size: size = self.arraysize num_rows = CSQLRelay.rowCount(self.cursor) if size >= num_rows: size = num_rows-1 rc = CSQLRelay.getRowRange(self.cursor, self.cur_row, size) self.cur_row = size return rc def fetchall(self): rc = [] num_rows = CSQLRelay.rowCount(self.cursor) for row in range(self.cur_row, num_rows): row = CSQLRelay.getRow(self.cursor,self.cur_row) self.cur_row = self.cur_row + 1 rc.append(row) return rc def close(self): CSQLRelay.sqlrcur_free(self.cursor) def __set_description(self): desc = [] col_c = CSQLRelay.colCount(self.cursor) if not col_c: self.description = [] return None for field in range(col_c): row = [] row.append(CSQLRelay.getColumnName(self.cursor,field),) row.append(CSQLRelay.getColumnType(self.cursor,field),) row.append(CSQLRelay.getColumnLength(self.cursor,field)) desc.append(tuple(row)) self.description = tuple(desc) return tuple(desc)