# db.py

Aller à la documentation de ce fichier.

    00001 # -*- coding: utf-8 -*-
    00002 #       $Id: db.py 47 2011-06-13 10:20:14Z georgesk $
    00003
    00004 licence={}
    00005 licence['en']="""
    00006     file db.py
    00007     this file is part of the project scolasync
    00008
    00009     Copyright (C) 2010 Georges Khaznadar <georgesk@ofset.org>
    00010
    00011     This program is free software: you can redistribute it and/or modify
    00012     it under the terms of the GNU General Public License as published by
    00013     the Free Software Foundation, either version3 of the License, or
    00014     (at your option) any later version.
    00015
    00016     This program is distributed in the hope that it will be useful,
    00017     but WITHOUT ANY WARRANTY; without even the implied warranty of
    00018     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    00019     GNU General Public License for more details.
    00020
    00021     You should have received a copy of the GNU General Public License
    00022     along with this program.  If not, see <http://www.gnu.org/licenses/>.
    00023 """
    00024
    00025 import os.path, sqlite3, subprocess
    00026 import version
    00027 from globaldef import userShareDir
    00028
    00029 database= None # base de données sqlite 3 commune à tous les modules
    00030 cursor=None
    00031
    00032 ##
    00033 #
    00034 #     Ouverture de la base de données de l'application, et création si nécessaire.
    00035 #     @return une instance de base de données sqlite3
    00036 #
    00037 def openDb():
    00038     global database, cursor
    00039     dir=os.path.expanduser(userShareDir)
    00040     if not os.path.isdir(dir):
    00041         subprocess.call("mkdir %s" %dir, shell=True)
    00042     database = sqlite3.connect(os.path.join(dir,"db"))
    00043     cursor=database.cursor()
    00044     cursor.execute('''create table if not exists owners (stickid text, uuid text, tatoo text, student text)''')
    00045     cursor.execute('''create table if not exists version (major text, minor text)''')
    00046     cursor.execute('''create table if not exists preferences (checkable int, workdir text)''')
    00047     database.commit()
    00048     checkVersion(version.major(), version.minor())
    00049
    00050 ##
    00051 #
    00052 #     Vérifie si la base de données reste compatible.
    00053 #     Un changement de version majeur implique une mise à jour en cas de
    00054 #     base de donnée ancienne. Un changmeent de version mineur n'implique
    00055 #     pas de changement de structure de la base de données.
    00056 #
    00057 def checkVersion(major, minor):
    00058     cursor.execute('''select * from version''')
    00059     values=cursor.fetchone()
    00060     if values == None:
    00061         # pas de version existante, on la crée
    00062         cursor.execute('''insert into version values (?,?)''', (version.major(), version.minor()))
    00063     else:
    00064         major, minor = values
    00065         if major < version.major():
    00066             raise KeyError, "The database version is too old!"
    00067         elif minor < version.minor():
    00068             cursor.execute("""update version
    00069                           set minor=?
    00070                           where major=?""", (version.minor(), version.major()))
    00071     database.commit()
    00072
    00073 ##
    00074 #
    00075 #     dit si une clé USB est déjà connue
    00076 #     @param stickid un identifiant de baladeur
    00077 #     @param uuid un identifiant de partition
    00078 #     @param tattoo un tatouage de partition
    00079 #     @return un booléen vrai si la clé USB est connue, faux sinon
    00080 #
    00081 def knowsId(stickid, uuid,tattoo):
    00082     global cursor
    00083     cursor.execute("select * from owners where stickid=? and uuid=? and tatoo=?", (stickid, uuid,tattoo))
    00084     return cursor.fetchone() != None
    00085
    00086 ##
    00087 #
    00088 #     Renvoie la liste des tatouages connus de la base de données
    00089 #
    00090 def tattooList():
    00091     global cursor
    00092     cursor.execute("select tatoo from owners")
    00093     return cursor.fetchmany()
    00094
    00095 ##
    00096 #
    00097 #     renvoie l'étudiant qui possède une clé USB
    00098 #     @return un nom d'étudiant ou None si la clé est inconnue
    00099 #
    00100 def readStudent(stickid, uuid,tattoo):
    00101     global cursor
    00102     cursor.execute("select student from owners where stickid=? and uuid=? and tatoo=?", (stickid, uuid,tattoo))
    00103     s = cursor.fetchone()
    00104     if s != None:
    00105         return s[0]
    00106     else:
    00107         return None
    00108
    00109 ##
    00110 #
    00111 #     renvoie les préférences de ScolaSync
    00112 #     @return un dictionnaire de préférences
    00113 #
    00114 def readPrefs():
    00115     global cursor
    00116     cursor.execute("select checkable, workdir from preferences")
    00117     s = cursor.fetchone()
    00118     if s != None:
    00119         checkable = s[0]==1
    00120         workdir = s[1]
    00121         return {"checkable": checkable, "workdir": workdir}
    00122     else:
    00123         # valeur par défaut si la base est vide de préférences
    00124         return {"checkable": True, "workdir": "Travail"}
    00125
    00126 ##
    00127 #
    00128 #     définit le nouveau nom du répertoire de travail préféré.
    00129 #
    00130 def setWd(newDir):
    00131     cursor.execute("""update preferences set workdir=?""",
    00132                    (newDir,))
    00133     database.commit()
    00134
    00135 ##
    00136 #
    00137 #     inscrit un étudiant comme propriétaire d'une clé USB
    00138 #     @param student un nom d'étudiant
    00139 #
    00140 def writeStudent(stickid, uuid, tattoo, student):
    00141     global database, cursor
    00142     if knowsId(stickid, uuid, tattoo):
    00143         cursor.execute("""update owners
    00144                           set student=?
    00145                           where stickid=? and uuid=? and tatoo=?""", (student, stickid, uuid, tattoo))
    00146     else:
    00147         cursor.execute("""insert into owners
    00148                           values (?,?,?,?)""", (stickid, uuid, tattoo, student))
    00149     database.commit()
    00150
    00151 ##
    00152 #
    00153 #     inscrit les préférences
    00154 #     @param prefs un dictionnaire {"checkable": booléen vrai si on doit afficher des cases à cocher, "workdir" : le répertoire préféré pour les fichiers de travail}
    00155 #
    00156 def writePrefs(prefs):
    00157     global database, cursor
    00158     if prefs["checkable"]:
    00159         checkable=1
    00160     else:
    00161         checkable=0
    00162     cursor.execute("select checkable, workdir from preferences")
    00163     s = cursor.fetchone()
    00164     if s != None:
    00165         cursor.execute("""update preferences
    00166                           set checkable=?, workdir=?""",
    00167                        (checkable, prefs["workdir"]))
    00168     else:
    00169         cursor.execute("""insert into preferences
    00170                           values (?,?)""", (checkable, prefs["workdir"]))
    00171     database.commit()
    00172
    00173
    00174 if database == None:
    00175     openDb()
    00176