Created
June 26, 2014 13:02
-
-
Save epappas/b8179f755310c8af1042 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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