Skip to content

Instantly share code, notes, and snippets.

@epappas
Created June 26, 2014 13:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save epappas/b8179f755310c8af1042 to your computer and use it in GitHub Desktop.
Save epappas/b8179f755310c8af1042 to your computer and use it in GitHub Desktop.
'use strict';
var fs = require('fs');
var path = require('path');
var safeObj = require('./safeObj');
module.exports = function JsonStore(name, filestoreDir) {
var self = this;
var sourceData = { };
var loopPtr;
var fileSource = path.join(filestoreDir, name);
fs.readFile(fileSource, function(err, json) {
if (err) throw new Error(err);
sourceData = JSON.parse(json);
});
return {
get: get.bind(this),
set: set.bind(this),
spin: spin.bind(this, loopPtr)
};
// Atomic Spinner - Updates dataSource Atommicly
function spin(loopPtr) {
if (loopPtr) return;
loopPtr = setTimeout(function() {
if (loopPtr) {
clearTimeout(loopPtr);
loopPtr = null;
}
var files = fs.readdirSync(filestoreDir)
var latest = files.map(function(file) {
if (file.match(/.json$/)) {
var token = parseInt(path.basename(file, '.json'));
if (token !== NaN) return token;
}
return 0;
}).sort().pop() + '.json';
fs.renameSync(fileSource, fileSource + '.old');
fs.renameSync(path.join(filestoreDir, latest), fileSource);
fs.readFile(filestoreDir, function(err, json) {
if (err) throw new Error(err);
sourceData = JSON.parse(json);
files.push(name + '.old');
files.forEach(function(file) {
try {
fs.unlink(path.join(filestoreDir, file));
} catch (e) {}
});
});
}.bind(this), 100);
}
function set(args, value) {
return (function __set(obj, args, value) {
var key = args.shift();
if(args.length === 0) {
obj[key] = value;
return obj;
}
obj[key] = obj[key] || { };
return __set.call(this, obj[key], args, value);
}).call(dataSource, dataSource, args, value);
}
function get() {
var args = Array.prototype.slice.call(arguments);
var result = safeObj(sourceData)(args);
if (result === undefined ||
(typeof result === 'object' && Object.keys(result).length === 0)) {
return null;
}
return result;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment