NxTIC/js/lib/local-storage-interface.js

246 lines
7.3 KiB
JavaScript

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<String> Nom du dataset en question
* @key<String> Clé à donner à l'élément
* @value<String> Valeur de l'élément
*
* @return error<Bool> Retourne FALSE si erreur, sinon TRUE
*
*/
set: function(dataset_name, key, value){
// On met la clé en <String>
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<String> Nom du dataset en question
* @key<String> Clé de l'élément
*
* @return value<String> Retourne la valeur de l'élément, sinon FALSE si erreur
*
*/
get: function(dataset_name, key){
// On met la clé en <String>
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<String> Nom du dataset en question
* @key<String> Clé de l'élément
*
* @return status<boolean> Retourne FALSE si erreur
*
*/
del: function(dataset, key){
// On met la clé en <String>
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<String> Nom du dataset à créer ou récupérer
*
* @return error<Bool> 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<String> Le nom du dataset en question
*
* @return keys<Array> 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<String> Nom du dataset en question
*
* @return object<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<String> Nom du dataset en question
* @data<Object> Objet contenant les données à mettre dan sle dataset, sur le modèle ({key1: value1, key2: value2})
*
* @return status<Boolean> 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<String> Nom du dataset en question
*
* @return status<Boolean> 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();