# Editeur SQL permettant d'interroger la base de donnée Librairie.sq3
# au travers d'une interface graphique utilisateur

# Importation de modules:
import sqlite3
from tkinter import *


########## Classe de l'application ###########

class Application(Tk):
    "Classe de l'application principale"

    def __init__(self, db):
        "Constructeur de l'objet Application"
        Tk.__init__(self)
        self.title("Editeur graphique SQL")

        # Zone de saisie de requetes:
        self.zoneReq = Text(self, height=10, width=50, background='white', font='Arial')
        self.zoneReq.insert(INSERT,  "Entrez votre requete")
        self.zoneReq.pack(fill=X)

        # Boutons d'exécution:
        Button(self, text="Exécuter", command = self.executer).pack(fill=X)


        # Boutons de gestion:
        Button(self, text="Effacer", command = self.effacer).pack(side=RIGHT)
        Button(self, text="Quitter", command = self.fermer).pack(side=RIGHT)

        # Ouverture de connexion et définition du curseur
        self.conn = sqlite3.connect(db)             # Connexion à la BD
        self.conn.row_factory = sqlite3.Row         # Retourner les enregistrements sous forme de tableau associatif
        self.cur = self.conn.cursor()               # Initialisation du curseur


    def executer(self):
        "Exécute la requete entrée"

        # Récupération de la requete:
        requete = self.zoneReq.get(1.0, END)

        # Exécution de la requete:
        try:
            self.cur.execute(requete)           # exécution de la requete SQL
            
        except:                                 # récupération de l'erreur
            print("*** Requete SQL incorrecte ***")
            print(requete)
            
        else:                                   # traitement du résultat

            enregistrements = self.cur.fetchall()
            champs = enregistrements[0].keys()

            for e in enregistrements:
                for c in champs:
                    print(c + ":" + str(e[c]))
                print("*********\n")


    def effacer(self, totalite=1):
        """
        Efface la précédente requete
        """
        
        # effacement du contenu de la zone de saisie de requete:
        self.zoneReq.delete(1.0, END)
        self.zoneReq.insert(INSERT, "Entrez votre requete")


    def fermer(self):
        "Ferme curseur, connexion et détruit la fenetre"
        self.conn.commit()                      # Transmission des requetes à la base de données
        self.cur.close()                        # Fermeture du curseur
        self.conn.close()                       # Fermeture de la connexion
        self.destroy()                          # Destruction de la fenetre
        


########## Programme principal ###########

Application('annexes/Librairie.sq3').mainloop()
