function localStorageInterface(){} localStorageInterface.prototype = { dataset: [], // Contiendra les différents 'dataset' dataset_keys: [], // Contiendra les clés de chaque 'dataset' storage: localStorage, // Peut contenir 'localStorage' ou 'sessionStorage' setStorage: function(storage){ // Si valeur incohérente if( storage != localStorage && storage != sessionStorage ) return false; // Sinon on enregistre le type de storage this.storage = storage; }, /* AJOUTE UN ELEMENT AU DATASET DONNE * * @dataset_name Nom du dataset en question * @key Clé à donner à l'élément * @value Valeur de l'élément * * @return error Retourne FALSE si erreur, sinon TRUE * */ set: function(dataset_name, key, value){ // On met la clé en key = key && key.toString() || null; if( !key ) return false; /* (1) Si le 'dataset' n'existe pas */ var index = this.dataset.indexOf(dataset_name); if( index == -1 ) return false; // erreur /* (2) On enregistre la nouvelle clé, si elle est nouvelle */ if( this.dataset_keys[index].indexOf(key) == -1 ){ this.dataset_keys[index].push(key); this.storage.setItem(dataset_name, JSON.stringify(this.dataset_keys[index])); } /* (3) On propage au 'localStorage' */ this.storage.setItem(dataset_name+'_'+key, JSON.stringify(value) ); return true; }, /* RETOURNE UN ELEMENT AU DATASET DONNE * * @dataset_name Nom du dataset en question * @key Clé de l'élément * * @return value Retourne la valeur de l'élément, sinon FALSE si erreur * */ get: function(dataset_name, key){ // On met la clé en key = key && key.toString() || null; if( !key ) return false; /* (1) Si le 'dataset' n'existe pas */ if( this.dataset.indexOf(dataset_name) == -1 ) return false; // erreur /* (2) On propage au 'localStorage' */ return JSON.parse( this.storage.getItem(dataset_name+'_'+key) ); }, /* SUPPRIME UN ELEMENT D'UN DATASET DONNE * * @dataset Nom du dataset en question * @key Clé de l'élément * * @return status Retourne FALSE si erreur * */ del: function(dataset, key){ // On met la clé en key = key && key.toString() || null; if( !key ) return false; /* (1) Si le 'dataset' n'existe pas */ var index = this.dataset.indexOf(dataset); if( index == -1 ) return false; // erreur /* (2) On récupère la clé dans la liste des clés */ var keyIndex = this.dataset_keys[index].indexOf(key); if( keyIndex == -1 ) return false; // erreur si la clé n'est pas référencée /* (3) On supprime dans le 'localStorage' */ this.storage.removeItem(dataset+'_'+key); /* (4) On supprime la clé dans la liste des clés */ this.dataset_keys[index].splice(keyIndex, 1); /* (5) On met à jour dans le 'localStorage' */ this.storage.setItem(dataset, JSON.stringify(this.dataset_keys[index])); return true; }, /* CREATION D'UN DATASET OU RECUPERATION DES DONNEES S'IL EXISTE DEJA * * @name Nom du dataset à créer ou récupérer * * @return error Retourne true si tout s'est bien passé, sinon false * */ createDataset: function(name){ /* (1) On vérifie que le @name est correct */ if( typeof name != 'string' ) return false; // erreur /* (2) Si le dataset est déjà enregistré, on ne fais rien */ var datasetIndex = this.dataset.indexOf(name); if( datasetIndex > -1 ) return true; /* (3) On charge le dataset s'il existe */ var storedDataset = this.storage.getItem(name); if( storedDataset != null ){ // Si le dataset existe, on charge les données this.dataset.push(name); this.dataset_keys.push( JSON.parse(storedDataset) ); /* (4) Sinon, on crée le 'dataset' */ }else{ this.dataset.push(name); this.dataset_keys.push([]); this.storage.setItem(name, JSON.stringify([])); } return true; }, /* RENVOIE UN TABLEAU CONTENANT LES CLÉS DU DATASET * * @dataset Le nom du dataset en question * * @return keys Retourne la liste des clés du dataset * */ keys: function(dataset){ /* (1) Si le 'dataset' n'existe pas */ var index = this.dataset.indexOf(dataset); if( index == -1 ) return false; // erreur /* (2) On retourne la liste des clés pour ce dataset */ return this.dataset_keys[index]; }, /* RENVOIE UN OBJET CORRESPONDANT AUX DONNÉES D'UN DATASET * * @dataset Nom du dataset en question * * @return object Object correspondant aux valeurs du dataset ({key1: value1, key2: value2}) * */ export: function(dataset){ /* (1) Si le 'dataset' n'existe pas */ var index = this.dataset.indexOf(dataset); if( index == -1 ) return false; // erreur /* (2) On remplit l'objet avec toutes les données du dataset */ var obj = {}; for( var i = 0 ; i < this.dataset_keys[index].length ; i++ ) obj[this.dataset_keys[index][i]] = this.get(dataset, this.dataset_keys[index][i]); /* (3) On retourne le résultat */ return obj; }, /* REMPLIT UN DATASET AVEC LES DONNÉES D'UN OBJET SUR LE PRINCIPE {CLÉ: VALEUR} * * @dataset Nom du dataset en question * @data Objet contenant les données à mettre dan sle dataset, sur le modèle ({key1: value1, key2: value2}) * * @return status Retourne TRUE si tout s'est bien passé, sinon FALSE * */ import: function(dataset, data){ /* (1) On récupère l'indice du dataset s'il existe déjà */ var index = this.dataset.indexOf(dataset); /* (2) Cas 1 : Le dataset n'existe pas -> on le crée */ /* (3) Cas 2 : Le dataset existe -> on le vide */ ~index && this.createDataset(dataset) || this.clear(dataset); /* (2) On remplit le dataset avec toutes les données de l'objet */ for( var key in data ) this.set(dataset, key, data[key]); /* (3) On retourne le résultat */ return true; }, /* EFFACE TOUTES LES DONNÉES D'UN DATASET * * @dataset Nom du dataset en question * * @return status Retourne TRUE si tout s'est bien passé, sinon FALSE * */ clear: function(dataset){ /* (1) On récupère l'indice du dataset s'il existe déjà */ var index = this.dataset.indexOf(dataset); // Si le dataset n'existe pas, on retourne une erreur if( index == -1 ) return false; /* (2) On supprime toutes les valeurs du dataset */ var content = this.export(dataset); // On supprime toutes les valeurs for( var key in content ) this.del(dataset, key); /* (3) Par précaution, on supprime les clés du dataset */ this.dataset_keys[index] = []; this.storage.setItem(dataset, JSON.stringify(this.dataset_keys[index])); /* (4) On retourne que tout s'est bien passé */ return true; } }; var lsi = new localStorageInterface();