#!/usr/bin/python
# -*- coding: UTF-8 -*-


"""
    Programme permettant de tester les acces a une base de donnees avec STORM.
"""


###############################################################################
# Informations de versions
###############################################################################
__project__   = 'Applications Bases de donnees'
__author__    = 'Simon CHOLLET (s.chollet@llr.in2p3.fr)'
__modifiers__ = ''
__date__      = '19/09/2011'
__version__   = '1.0'


###############################################################################
# Importations
###############################################################################
# Module systeme : pour la gestion des arguments
import sys

# Module STORM
import storm.locals as SL


###############################################################################
# Definitions specifiques
###############################################################################
# Serveur + Base de donnees de type MySQL
#    Connecteur = mysqldb
#    Serveur    = localhost
#    Port       = 3306
#    User       = test
#    Paswword   = tempor
#    Base       = annuaire
MYSQL_DATA_PATH = "mysql://test:tempor@localhost:3306/annuaire"

# Chemin du fichier contenant les donnees de type SQLite
SQLITE_DATA_PATH = "sqlite:////tmp/annuaire.db"


###############################################################################
# Declaration des classes / fonctions
###############################################################################
class Person(object):
    # Attributs de la classe
    __storm_table__ = "persons"
    ID    = SL.Int(primary=True)
    title = SL.Unicode()
    name  = SL.Unicode()
    sname = SL.Unicode()
    birth = SL.Unicode()
    exper = SL.Int()

    def __init__(self, id, title, name, sname, birth, exper):
        """ Constructeur """

        # Mise a jour des attributs
        self.ID    = id
        self.title = title
        self.name  = name
        self.sname = sname
        self.birth = birth
        self.exper = exper


#
#
# Fonction appelee lors de la demande
# d'execution de la classe/module
if __name__ == "__main__":
    # Analyse des arguments
    for arg in sys.argv:
        # Creation du moteur d'execution
        #   echo=True : pour afficher les details des requetes
        if arg == "mysql":
            database = SL.create_database(MYSQL_DATA_PATH)
        else:
            database = SL.create_database(SQLITE_DATA_PATH)

    # Creation de l'outil d'enregistrement
    store = SL.Store(database)

    # Suppression de la table si elle existe
    store.execute("DROP TABLE IF EXISTS persons")

    # Affichage de messages d'informations
    print ">>>> PySTORM <<<<"
    print " * Creation de la table : persons"

    # Creation de la table persons de l'annuaire
    store.execute("CREATE TABLE persons "
                  """(ID INTEGER PRIMARY KEY, title CHAR(5), name CHAR(255),
                   sname CHAR(255), birth DATE, exper INTEGER)""")

    # Remplissage de la table
    person = Person(1, u'Mr', u'DUPONT', u'Pierre', u'1960-06-30', 30)
    store.add(person)
    person = Person(2, u'Melle', u'LA PIERRE', u'Marie', u'1963-07-21', 20)
    store.add(person)
    person = Person(3, u'Mme', u'MOUTE', u'Catherine', u'1970-04-23', 15)
    store.add(person)
    person = Person(4, u'Mr', u'DURAND', u'Jean-Pierre', u'1980-01-12', 5)
    store.add(person)

    # Lecture de toutes les personnes enregistrees
    result = store.execute("SELECT * FROM persons")
    nbPersons = 0
    for row in result:
        nbPersons += 1
    
    # Affichage de messages d'informations
    result = store.execute("SELECT * FROM persons")
    print " * Ajout de %d personnes dans l'annuaire" % (nbPersons)
    print " * Liste des personnes inserees :"
    print "    > ID, Titre, Nom, Prenom, Naissance, Experience"
    for row in result:
        # Affichage de la ligne
        print "    > %d, %s, %s, %s, %s, %d" % (row[0], row[1], row[2], row[3],
            row[4], row[5])

    # Recherche d'une personne dans l'annuaire
    result = store.execute("SELECT * FROM persons WHERE ID >= 2")
    print " "
    print " * Recherche de personnes dans l'annuaire, avec ID >= 2 :"
    print "    > ID, Titre, Nom, Prenom, Naissance, Experience"
    
    # Extraction des donnees
    for row in result:
        # Affichage de la ligne
        print "    > %d, %s, %s, %s, %s, %d" % (row[0], row[1], row[2], row[3],
            row[4], row[5])

    # Modification d'une personne dans l'annuaire
    result = store.execute("UPDATE persons SET name=\"LAPIERRE\" WHERE ID=2")
    print " "
    print " * Modification de la personne ID=2 dans l'annuaire :"
    print "    > ID, Titre, Nom, Prenom, Naissance, Experience"
    result = store.execute("SELECT * FROM persons WHERE ID = 2")
    
    # Extraction des donnees
    for row in result:
        # Affichage de la ligne
        print "    > %d, %s, %s, %s, %s, %d" % (row[0], row[1], row[2], row[3],
            row[4], row[5])
    
    # Suppression d'une personne dans l'annuaire
    result = store.execute("DELETE FROM persons WHERE ID=3")
    print " "
    print " * Suppression de la personne ID=3 dans l'annuaire :"
    print "    > ID, Titre, Nom, Prenom, Naissance, Experience"
    result = store.execute("SELECT * FROM persons")

    # Extraction des donnees
    for row in result:
        # Affichage de la ligne
        print "    > %d, %s, %s, %s, %s, %d" % (row[0], row[1], row[2], row[3],
            row[4], row[5])

    # On execute les requetes precedement demandees
    store.flush()