import kinterbasdb try: if kinterbasdb.FB_API_VER == 20: kinterbasdb.init(type_conv=200) ## Firebird 2.0.x except: pass import os.path import os __version__ = (0, 4, 2) __build__ = (0, 3) __date__ = (2006,10, 14) __author__ = ('Guillaume','Duriaud') class TFBConnection: """ Created: 2005 - Updated: 2006.10.14 """ def __init__(self, host='localhost', pathbase=r'C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\employee.fdb', \ user='sysdba', password='masterkey'): """ Created: 2005 - Updated: 2005.09.15 """ self.pathbase=pathbase self.host=host self.user=user self.password=password def Initialize(self, host='localhost', pathbase=r'C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\employee.fdb', \ user='sysdba', password='masterkey'): """ Created: 2006.01.20 - Updated: 2006.10.14 """ self.pathbase=pathbase self.host=host self.user=user self.password=password def Connect(self): """ Created: 2005 - Updated: 2005.09.13 """ self.con = kinterbasdb.connect(host=self.host, database=self.pathbase, user=self.user, password=self.password) def Commit(self): """ Created: 2005 - Updated: 2005.07.28 """ self.con.commit() def Cursor(self): """ Created: 2005 - Updated: 2005.07.28 """ return TFBCursor(self) def Rollback(self): """ Created: 2005 - Updated: 2005.07.28 """ self.con.rollback() def Close(self): """ Created: 2005 - Updated: 2005.07.28 """ self.con.close() ## Fonctionnalite propre a Firebird def DropDatabase(self): """ Created: 2005 - Updated: 2005.07.28 """ self.con.drop_database() def CreateDatabase(self): """ Created: 2005 - Updated: 2005.11.30 """ if self.host=='localhost': try: os.makedirs(os.path.dirname(self.pathbase)) except: pass else: try: os.makedirs(os.path.dirname('\\\\'+self.host+self.pathbase)) except: pass self.con = kinterbasdb.create_database( "create database '"+self.pathbase+"' user '"+self.user+"' password '"+ \ self.password+"'") class TFBCursor(kinterbasdb.Cursor): """ Created: 2005 - Updated: 2005.11.08 """ def __init__(self, FBConnection): """ Created: 2005 - Updated: 2005.09.15 """ kinterbasdb.Cursor.__init__(self, FBConnection.con) def ExecuteElem(self, strreq): """ Created: 2005 - Updated: Retourne le resultat d'une requete sous forme d'un unique element """ return (self.ExecuteListe(strreq))[0] def ExecuteElem2(self, strreq): """ Created: 2005 - Updated: Retourne le resultat d'une requete sous forme d'un unique tuple de valeurs """ return (self.ExecuteTuple(strreq))[0] def ExecuteTuple(self, strreq): """ Created: 2005 - Updated: 2005.09.15 Retourne l'ensemble de la requete sous forme d'une liste de tuples""" self.execute(strreq) return self.fetchall() def ExecuteIter(self, strreq): """ Created: 2005.11.07 - Updated: Retourne un iterateur-tuple sur une requete """ self.execute(strreq) return self.iter() def ExecuteListe(self, strreq): """ Created: 2005 - Updated: 2005.07.28 Retourne l'ensemble de la requete sous forme d'une liste de valeurs (seul le premier champ est conserve)""" listresult=[] for laliste in self.ExecuteTuple(strreq): listresult.append(laliste[0]) return listresult ## Fonctions clone de celles de base - permet d'avoir des references explicites dans ce code def Close(self): """ Created: 2005.07.28 - Updated: Identique a self.close() """ self.close() def Execute(self, strreq): """ Created: 2005.07.28 - Updated: Identique a self.execute(strreq) """ self.execute(strreq) def IterMap(self): """ Created: 2005.10.30 - Updated: Identique a self.itermap() """ return self.itermap() def RowCount(self): """ Created: 2005.10.30 - Updated: Identique a self.rowcount() """ return self.rowcount() def FecthAll(self): """ Created: 2005.10.31 - Updated: Identique a self.fetchall() """ return self.fetchall() def FecthOne(self): """ Created: 2005.10.31 - Updated: Identique a self.fetchone() """ return self.fetchone() def Description(self): """ Created: 2005.10.31 - Updated: Identique a self.description """ return self.description() def CallProc(self, procname, params=()): """ Created: 2005.11.08 - Updated: Identique a self.callproc(procname, params) """ return self.callproc(procname, params) ## Fonctionnalites supplementaires propres a Firebird def ExecuteElemMap(self, strreq): """ Created: 2005.11.08 - Updated: Retourne le resultat d'une requete sous forme d'un unique tuple mappe """ return (self.ExecuteMap(strreq))[0] def ExecuteMap(self, strreq): """ Created: 2005.10.30 - Updated: 2005.11.07 Retourne l'ensemble de la requete sous forme d'une liste de map""" self.execute(strreq) return self.fetchallmap() def ExecuteIterMap(self, strreq): """ Created: 2005.10.30 - Updated: Retourne un iterateur-dictionnaire sur une requete """ self.execute(strreq) return self.itermap() def ListeTable(self): """ Created: 2005 - Updated: Retourne la liste des tables de la base """ return self.ExecuteListe("select rdb$relation_name from rdb$relations where "+ \ "rdb$relation_name not like 'RDB$%';") def ListeChamp(self, strtable): """ Created: 2005 - Updated: 2005.11.24 Retourne la liste des champs d'une table """ l = self.ExecuteListe("Select RDB$FIELD_NAME from RDB$RELATION_FIELDS "+ \ "where RDB$RELATION_NAME = '"+strtable.upper()+"';") for i in range(len(l)): l[i] = l[i].strip() ## La requete precedente laisse des espaces a la fin des noms return l def CreateGenerator(self, strgen, strtrig, strtable, strcolumn): """ Created: 2005 - Updated: 2005.07.28 Permet que l'une des colonnes devienne un index """ self.execute("CREATE GENERATOR "+strgen+";") strSQL="CREATE TRIGGER "+strtrig+" FOR "+strtable+ \ " ACTIVE BEFORE INSERT POSITION 0 "+ \ "AS BEGIN "+ \ "IF( NEW."+strcolumn+" IS NULL ) THEN "+ \ "NEW."+strcolumn+" = GEN_ID("+strgen+", 1 );"+ \ "END" self.execute(strSQL)