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


"""
    Programme pour tester les acces a une base de donnees avec pickle/cPickle.
"""


###############################################################################
# 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 cPickle
import cPickle as pkl

# Importations pour traitement des images
import Image, cStringIO


###############################################################################
# Definitions specifiques
###############################################################################
# Chemins des fichiers contenant les donnees
PICKLE_DATA_FILE      = "../output/datas.pkl"
PICKLE_DATA_EXT_FILE  = "../output/datas_ext.pkl"
PICKLE_DATA_IMG_FILE  = "../output/datas_img.pkl"


###############################################################################
# Declaration des classes / fonctions
###############################################################################
class ImageStore():
    """
        Classe permettant de tester la sauvegarde d'images dans un fichier.
        -----------------------------------------------------------------------
        Attributs :
            - m_desc : Description de l'image.
            - m_img  : Image a sauvegarder.
            - m_ext  : Extension de l'image.
    """

    # Attributs avec initialisation par defaut
    m_desc = ""
    m_img  = None
    m_ext  = ""


    def __init__(self, desc, path):
        """
            Constructeur
            -------------------------------------------------------------------
            Arguments :
                - desc : Description de l'image.
                - path : Chemin vers l'image a sauvegarder.
            -------------------------------------------------------------------
            Retour : Aucun.
        """
        # Mise a jour des attributs
        self.m_desc = desc
        img_file = open(path, 'rb')
        self.m_img = img_file.read()
        img_file.close()
        self.m_ext = "." + path.split('.')[-1]


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

    # Message de bienvenue
    print ">>> Module pickle/cPickle <<<"

    # Les donnees a ecrire
    vols     = {'1144':'Dallas',
                '1045':'Los Angeles',
                '1520':'New York'}
    vols_ext = {'1144':('Dallas', '14H30'),
                '1045':('Los Angeles', '15H20'),
                '1520':('New York', '16H20')}
    horaires = ['14H30', '15H20', '16H20']

    ###########################################################################
    # AVEC DES OBJETS SIMPLES
    ###########################################################################

    ###########################################################################
    # Ajout d'entrees dans un fichier

    # Mode de BASE
    # Ouverture du fichier
    pkl_file = open(PICKLE_DATA_FILE, "w")

    # Creation de l'empaqueteur
    packer = pkl.Pickler(pkl_file)

    # Enregistrement des donnees
    packer.dump(vols)
    packer.dump(horaires)

    # Fermeture du fichier
    pkl_file.close()

    # Mode ETENDU
    # Ouverture du fichier
    pkl_file = open(PICKLE_DATA_EXT_FILE, "w")

    # Creation de l'empaqueteur
    packer = pkl.Pickler(pkl_file)

    # Enregistrement des donnees
    packer.dump(vols_ext)

    # Fermeture du fichier
    pkl_file.close()


    ###########################################################################
    # Lecture des entrees depuis un fichier

    # Mode BASE
    # Ouverture du fichier
    pkl_file = open(PICKLE_DATA_FILE, "r")

    # Creation du depaqueteur
    unpacker = pkl.Unpickler(pkl_file)

    # Lecture des donnees
    vols_read     = unpacker.load()
    horaires_read = unpacker.load()

    # Fermeture du fichier
    pkl_file.close()

    # Affichage du resultat
    # Affiche :
    #    * Liste vols :
    #      {'1520': 'New York', '1144': 'Dallas', '1045': 'Los Angeles'}
    #    * Liste horaires :
    #      ['14H30', '15H20', '16H20']
    print " * Liste vols :"
    print "  ", vols_read
    print " * Liste horaires :"
    print "  ", horaires_read

    # Mode ETENDU
    # Ouverture du fichier
    pkl_file = open(PICKLE_DATA_EXT_FILE, "r")

    # Creation du depaqueteur
    unpacker = pkl.Unpickler(pkl_file)

    # Lecture des donnees
    vols_ext_read = unpacker.load()

    # Fermeture du fichier
    pkl_file.close()

    # Affichage du resultat
    # Affiche :
    #    * Liste etendue vols :
    #      {'1520': ('New York', '16H20'), '1144': ('Dallas', '14H30'), '1045': ('Los Angeles', '15H20')}
    print " * Liste etendue vols :"
    print "  ", vols_ext_read


    ###########################################################################
    # AVEC DES IMAGES
    ###########################################################################

    # Creation des objets a sauvegarder
    img_gpib    = ImageStore('CableGPIB', '../input/gpib.jpg')
    img_oscillo = ImageStore('Oscilloscope', '../input/oscillo.jpg')

    # Creation du dictionnaire
    img_dict = {'gpib': img_gpib, 'oscillo': img_oscillo}

    # Ouverture du fichier
    pkl_file = open(PICKLE_DATA_IMG_FILE, "w")

    # Creation de l'empaqueteur
    packer = pkl.Pickler(pkl_file)

    # Enregistrement des donnees
    packer.dump(img_dict)

    # Fermeture du fichier
    pkl_file.close()

    # Ouverture du fichier
    pkl_file = open(PICKLE_DATA_IMG_FILE, "r")

    # Creation du depaqueteur
    unpacker = pkl.Unpickler(pkl_file)

    # Lecture des donnees
    img_dict_read = unpacker.load()
    for item in img_dict_read:
        # Extraction de l'objet
        img_tmp = img_dict_read[item]

        # Contenu de l'image au format chaine de caracteres
        img_txt = cStringIO.StringIO()
        img_txt.write(img_tmp.m_img)
        img_txt.seek(0)

        # Enregistrement dans nouveau fichier
        img = Image.open(img_txt)
        img.save('../output/' + img_tmp.m_desc + img_tmp.m_ext)

    # Fermeture du fichier
    pkl_file.close()
