try:
    import kinterbasdb    
    if kinterbasdb.FB_API_VER == 20: kinterbasdb.init(type_conv=200)  ## Firebird 2.0.x
except: pass
try: import MySQLdb
except: pass
import os.path
import os

__version__ = (0, 4, 2)
__build__ = (0, 3)
__date__ = (2006,10, 14)
__author__ = ('Guillaume','Duriaud')

class TPyConnection:
    """ Created: 2005 - Updated: 2006.10.14 """
    def __init__(self, name='Firebird', 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.name = name
        self.pathbase=pathbase
        self.host=host
        self.user=user
        self.password=password
    def Initialize(self, name='Firebird', 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.name = name        
        self.pathbase=pathbase
        self.host=host
        self.user=user
        self.password=password        
    def Connect(self):
        """ Created: 2005 - Updated: 2005.09.13  """
        if self.name=='Firebird': self.con = kinterbasdb.connect(host=self.host, database=self.database, user=self.user, password=self.password)
        elif self.name=='MySQL': self.con = MySQLdb.connect(host=self.host, user=self.user, passwd=self.password, db=self.database)
        else: raise Exception, 'Type de la BDD inconnu'
    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 TPyCursor(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)

        


    
    
