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


"""
    Programme pour tester les acces a une base de donnees avec DBM.
"""


###############################################################################
# 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
###############################################################################
# Importation du module anydbm
import anydbm


###############################################################################
# Definitions specifiques
###############################################################################
# Fichier contenant la base de donnees Villes
DBM_CITY_FILE_PATH = '../output/villes.dbm'

# Fichier contenant la base de donnees horaires
DBM_HOURS_FILE_PATH = '../output/horaires.dbm'



###############################################################################
# Declaration des classes / fonctions
###############################################################################
# Fonction d'affichage des arrivees
def DispArrivals(head, vols, vDBM, hDBM):
    print head
    for vol in vols:
        print "Le vol %s en provenance de %s arrive a %s" % (
            vol, vDBM[vol], hDBM[vol])


#
#
# Fonction appelee lors de la demande
# d'execution de la classe/module
if __name__ == "__main__":

    # Message de bienvenue
    print ">>> Module anydbm <<<"

    # Les donnees a ecrire
    villes   = ['Dallas', 'Los Angeles', 'New York']
    vols     = ['1144', '1045', '1520']
    horaires = ['14H30', '15H20', '16H20']

    ###########################################################################
    # Ajout d'entrees dans une base DBM

    # Creation du fichier DBM villes en creation
    villeDBM = anydbm.open(DBM_CITY_FILE_PATH, 'n')

    # Creation du fichier DBM horaires en creation
    horaireDBM = anydbm.open(DBM_HOURS_FILE_PATH, 'n')

    # Ajout des entrees dans les fichiers
    idx = 0
    for vol in vols:
        villeDBM[vol]   = villes[idx]
        horaireDBM[vol] = horaires[idx]
        idx += 1

    # Affichage des entrees de la base
    # Affiche : [('1045', 'Los Angeles'), ('1144', 'Dallas'), ('1520', 'New York')]
    print villeDBM.items()
    # Affiche : [('1045', '15H20'), ('1144', '14H30'), ('1520', '16H20')]
    print horaireDBM.items()

    # Fermeture des fichiers
    villeDBM.close()
    horaireDBM.close()

    ###########################################################################
    # Extraire des entrees depuis une base DBM

    # Ouverture du fichier DBM villes en lecture
    villeDBM = anydbm.open(DBM_CITY_FILE_PATH, 'r')

    # Ouverture du fichier DBM horaires en lecture
    horaireDBM = anydbm.open(DBM_HOURS_FILE_PATH, 'r')

    # Recherche des cles
    vols = villeDBM.keys()

    # Parcours des cles
    # Affiche :
    #   == INFORMATIONS VOLS ==========
    #   Le vol 1045 en provenance de Los Angeles arrive a 15H20
    #   Le vol 1144 en provenance de Dallas arrive a 14H30
    #   Le vol 1520 en provenance de New York arrive a 16H20
    DispArrivals("== INFORMATIONS VOLS ==========",
                 vols, villeDBM, horaireDBM)

    # Fermeture des fichiers
    villeDBM.close()
    horaireDBM.close()

    ###########################################################################
    # Mise a jour des entrees dans une base DBM

    # Les vols et horaires annules / supprimes
    cancelled = ['1520', '1544']
    deleted   = ['1144']

    # Ouverture du fichier DBM villes en ecriture
    villeDBM = anydbm.open(DBM_CITY_FILE_PATH, 'w')

    # Ouverture du fichier DBM horaires en ecriture
    horaireDBM = anydbm.open(DBM_HOURS_FILE_PATH, 'w')

     # Recherche des cles
    vols  = villeDBM.keys()
    vols2 = villeDBM.keys()

    # Affiche :
    #   == INFORMATIONS VOLS ==========
    #   Le vol 1045 en provenance de Los Angeles arrive a 15H20
    #   Le vol 1144 en provenance de Dallas arrive a 14H30
    #   Le vol 1520 en provenance de New York arrive a 16H20
    DispArrivals("== INFORMATIONS VOLS ==========",
                 vols, villeDBM, horaireDBM)

    # Mise a jour des DBM
    for vol in vols:
        # Pour les annules
        for can in cancelled:
            if can == vol:
                # Modifie l'entree
                horaireDBM[vol] = "ANNULE"
                break
        # Pour les supprimes
        for dele in deleted:
            if dele == vol:
                # Supprime les entrees
                del villeDBM[vol]
                del horaireDBM[vol]
                vols2.remove(vol)
                break

    # Affiche :
    #   == INFORMATIONS VOLS (UPDATED) ==========
    #   Le vol 1045 en provenance de Los Angeles arrive a 15H20
    #   Le vol 1520 en provenance de New York arrive a ANNULE
    DispArrivals("== INFORMATIONS VOLS (UPDATED) ==========",
                 vols2, villeDBM, horaireDBM)

    # Fermeture des fichiers
    villeDBM.close()
    horaireDBM.close()
