1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/jappix_ynh.git synced 2024-09-03 19:26:19 +02:00
jappix_ynh/source/js/datastore.js

304 lines
5.9 KiB
JavaScript
Raw Normal View History

2013-11-27 12:56:15 +01:00
/*
Jappix - An open social platform
These are the temporary/persistent data store functions
-------------------------------------------------
License: dual-licensed under AGPL and MPLv2
Authors: Valérian Saliou, Maranda
Last revision: 20/07/13
*/
// Common: storage adapter
function storageAdapter(storage_native, storage_emulated) {
var legacy = !storage_native;
this.key = function(key) {
if(legacy) {
if(key >= this.length)
return null;
var c = 0;
for(name in storage_emulated) {
if(c++ == key) return name;
}
return null;
}
return storage_native.key(key);
};
this.getItem = function(key) {
if(legacy) {
if(storage_emulated[key] !== undefined)
return storage_emulated[key];
return null;
} else {
return storage_native.getItem(key);
}
};
this.setItem = function(key, data) {
if(legacy) {
if(!(key in storage_emulated))
this.length++;
storage_emulated[key] = (data + '');
} else {
storage_native.setItem(key, data);
this.length = storage_native.length;
}
};
this.removeItem = function(key) {
if(legacy) {
if(key in storage_emulated) {
this.length--;
delete storage_emulated[key];
}
} else {
storage_native.removeItem(key);
this.length = storage_native.length;
}
};
this.clear = function() {
if(legacy) {
this.length = 0;
storage_emulated = {};
} else {
storage_native.clear();
this.length = storage_native.length;
}
};
this.length = legacy ? 0 : storage_native.length;
}
// Temporary: sessionStorage emulation
var DATASTORE_DB_EMULATED = {};
// Temporary: sessionStorage class alias for direct access
var storageDB = new storageAdapter(
(window.sessionStorage ? sessionStorage : null),
DATASTORE_DB_EMULATED
);
// Temporary: returns whether it is available or not
function hasDB() {
// Try to write something
try {
storageDB.setItem('hasdb_check', 'ok');
storageDB.removeItem('hasdb_check');
return true;
}
// Not available?
catch(e) {
return false;
}
}
// Temporary: used to read a database entry
function getDB(type, id) {
try {
return storageDB.getItem(type + '_' + id);
}
catch(e) {
logThis('Error while getting a temporary database entry (' + type + ' -> ' + id + '): ' + e, 1);
}
return null;
}
// Temporary: used to update a database entry
function setDB(type, id, value) {
try {
storageDB.setItem(type + '_' + id, value);
return true;
}
catch(e) {
logThis('Error while writing a temporary database entry (' + type + ' -> ' + id + '): ' + e, 1);
}
return false;
}
// Temporary: used to remove a database entry
function removeDB(type, id) {
try {
storageDB.removeItem(type + '_' + id);
return true;
}
catch(e) {
logThis('Error while removing a temporary database entry (' + type + ' -> ' + id + '): ' + e, 1);
}
return false;
}
// Temporary: used to check a database entry exists
function existDB(type, id) {
return getDB(type, id) != null;
}
// Temporary: used to clear all the database
function resetDB() {
try {
storageDB.clear();
logThis('Temporary database cleared.', 3);
return true;
}
catch(e) {
logThis('Error while clearing temporary database: ' + e, 1);
return false;
}
}
// Persistent: localStorage emulation
var DATASTORE_PERSISTENT_EMULATED = {};
// Persistent: localStorage class alias for direct access
var storagePersistent = new storageAdapter(
(window.localStorage ? localStorage : null),
DATASTORE_PERSISTENT_EMULATED
);
// Persistent: returns whether it is available or not
function hasPersistent() {
// Try to write something
try {
storagePersistent.setItem('haspersistent_check', 'ok');
storagePersistent.removeItem('haspersistent_check');
return true;
}
// Not available?
catch(e) {
return false;
}
}
// Persistent: used to read a database entry
function getPersistent(dbID, type, id) {
try {
return storagePersistent.getItem(dbID + '_' + type + '_' + id);
}
catch(e) {
logThis('Error while getting a persistent database entry (' + dbID + ' -> ' + type + ' -> ' + id + '): ' + e, 1);
return null;
}
}
// Persistent: used to update a database entry
function setPersistent(dbID, type, id, value) {
try {
storagePersistent.setItem(dbID + '_' + type + '_' + id, value);
return true;
}
// Database might be full
catch(e) {
logThis('Retrying: could not write a persistent database entry (' + dbID + ' -> ' + type + ' -> ' + id + '): ' + e, 2);
// Flush it!
flushPersistent();
// Set the item again
try {
storagePersistent.setItem(dbID + ' -> ' + type + '_' + id, value);
return true;
}
// New error!
catch(e) {
logThis('Aborted: error while writing a persistent database entry (' + dbID + ' -> ' + type + ' -> ' + id + '): ' + e, 1);
}
}
return false;
}
// Persistent: used to remove a database entry
function removePersistent(dbID, type, id) {
try {
storagePersistent.removeItem(dbID + '_' + type + '_' + id);
return true;
}
catch(e) {
logThis('Error while removing a persistent database entry (' + dbID + ' -> ' + type + ' -> ' + id + '): ' + e, 1);
}
return false;
}
// Persistent: used to check a database entry exists
function existPersistent(dbID, type, id) {
return getPersistent(dbID, type, id) != null;
}
// Persistent: used to clear all the database
function resetPersistent() {
try {
storagePersistent.clear();
logThis('Persistent database cleared.', 3);
return true;
}
catch(e) {
logThis('Error while clearing persistent database: ' + e, 1);
}
return false;
}
// Persistent: used to flush the database
function flushPersistent() {
try {
// Get the stored session entry
var session = getPersistent('global', 'session', 1);
// Reset the persistent database
resetPersistent();
// Restaure the stored session entry
if(session)
setPersistent('global', 'session', 1, session);
logThis('Persistent database flushed.', 3);
return true;
}
catch(e) {
logThis('Error while flushing persistent database: ' + e, 1);
}
return false;
}