# imports
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
import sqlite3
from glade import UI
class ST:
"""
namespace de la classe Systeme pour stocker des variables
"""
class Systeme:
"""
classe pour gérer la base de donnees
"""
def __init__(self, db_file):
# ==========================
"""
Initialise une nouvelle instance de la classe Systeme
"""
# on fixe les requêtes de base
ST.requete_base_systemes = ""
ST.requete_add_sections_jeux = ""
ST.requete_add_etats_jeux = ""
ST.requete_add_recherches = ""
# on fixe le dictionnaire des requêtes
ST.dict_requetes = {}
ST.cle_requete_jeux_en_cours = ""
ST.dict_count_from_machine = {}
# connexion à la base de données
db_connect = sqlite3.connect(db_file)
db_cursor = db_connect.cursor()
# on récupère dans une liste le nom des machines
# en supprimant les doublons
db_cursor.execute("SELECT machine,televerseur FROM systemes")
db_connect.commit()
self.machines = []
for item in db_cursor:
if item[0] not in self.machines:
self.machines.append(item[0])
# on boucle sur le nom des machines
i0 = -1
for machine in self.machines:
# on insère dans le tree_view_systeme le nom de la machine.
i0 += 1 ; i1 = -1
iter_level_1 = UI.tree_store_tree_view_systemes.insert_before(None, None)
UI.tree_store_tree_view_systemes.set_value(iter_level_1, 0, machine)
db_cursor.execute(f"SELECT televerseur FROM systemes WHERE machine='{machine}'")
db_connect.commit()
ST.dict_requetes[f"[{i0}]"] = self.requete_machine(machine)
ST.dict_count_from_machine[f"[{i0}]"] = [machine]
# on boucle sur les nom des téléverseurs à partir du nom
# de la machine. liste établis depuis une requête.
for televerseur in db_cursor:
# on insère dans le tree_view_systeme le nom du téléverseur
i1 += 1
iter_level_2 = UI.tree_store_tree_view_systemes.insert_before(iter_level_1, None)
UI.tree_store_tree_view_systemes.set_value(iter_level_2, 0, televerseur[0])
ST.dict_requetes[f"[{i0}, {i1}]"] = self.requete_machine_televerseur(machine, televerseur)
ST.dict_count_from_machine[f"[{i0}, {i1}]"] = televerseur
# on ferme la connexion à la base de données
db_connect.close()
# on appel la fonction 'get_counts_from_machines()'
# pour compter le nombre de jeux dans chaque machine
self.get_counts_from_machines(db_file)
def get_counts_from_machines(self, db_file):
# ==========================================
"""
Retourne le nombre de jeux contenus dans chaque machine de la base de données.
"""
# on fixe la variable 'total_games' à 0
total_games = 0
# on crée la requête pour compter le nombre de jeux
requete_base = "SELECT COUNT(*) "+\
"FROM jeux A, pages B, systemes C "+\
"WHERE A.lien_page = B.lien "+\
"AND B.identifiant_systeme = C.identifiant "
current_machine = ""
# on boucle sur la liste des noms de machines
for cle in ST.dict_count_from_machine:
# si la clé est inférieure à 5, il s'agit d'une machine
if len(cle) < 5:
# on insère dans le dictionnaire le nom de la machine
machine = ST.dict_count_from_machine[cle][0]
requete = requete_base + f"AND C.machine = '{machine}'"
ST.dict_count_from_machine[cle] = self.select_count_from_machine(db_file, requete)
# on additionne le nombre de jeux de la machine
print(f"{machine:<20}", f":{ST.dict_count_from_machine[cle]:>8}")
total_games += ST.dict_count_from_machine[cle]
else:
# on insère dans le dictionnaire le nom du televerseur
televerseur = ST.dict_count_from_machine[cle][0]
requete = requete_base + f"AND C.machine = '{current_machine}'" + f"AND C.televerseur = '{televerseur}'"
ST.dict_count_from_machine[cle] = self.select_count_from_machine(db_file, requete)
# on conserve le nom de la machine
current_machine = machine
# on affiche le nombre total de jeux
label="TOTAL"
print(f"{label:<20}", f":{total_games:>8} games")
def select_count_from_machine(self, db_file, requete):
# ====================================================
"""
Compte le nombre d'enregistrements, de jeux contenus dans un système, machine, en
exécutant une requête avec la commande 'COUNT(*)'
"""
db_connect = sqlite3.connect(db_file)
db_cursor = db_connect.cursor()
db_cursor.execute(requete)
db_connect.commit()
count = db_cursor.fetchone()[0]
db_connect.close()
return count
def requete_machine(self, machine):
# =================================
"""
Crée une requête SQL pour obtenir tous les jeux d'une machine donnée.
"""
return ("SELECT A.id, telechargement, nom, televerseur "+\
"FROM jeux A, pages B, systemes C "+\
"WHERE A.lien_page = B.lien "+\
"AND B.identifiant_systeme = C.identifiant "+\
f"AND C.machine = '{machine}'")
def requete_machine_televerseur(self, machine, televerseur):
# ==========================================================
"""
Crée une requête SQL pour obtenir tous les jeux d'une machine et d'un téléverseur donné.
"""
return ("SELECT A.id, telechargement, nom, televerseur "+\
"FROM jeux A, pages B, systemes C "+\
"WHERE A.lien_page = B.lien "+\
"AND B.identifiant_systeme = C.identifiant "+\
f"AND C.machine = '{machine}' "+\
f"AND C.televerseur = '{televerseur[0]}'")