/** * The datastore itself * TODO * Improve serialization (for types such as Dates, handle new lines in strings) */ var fs = require('fs') , path = require('path') , customUtils = require('./customUtils') ; /** * Create a new collection */ function Datastore (filename) { this.filename = filename; this.data = []; } /** * Load the database * For now this means pulling data out of the data file or creating it * if it doesn't exist * @param {Function} cb Optional callback, signature: err */ Datastore.prototype.loadDatabase = function (cb) { var callback = cb || function () {} , self = this ; customUtils.ensureDirectoryExists(path.dirname(self.filename), function (err) { fs.exists(self.filename, function (exists) { if (!exists) { self.data = []; fs.writeFile(self.filename, '', 'utf8', function (err) { return callback(err); }); } else { fs.readFile(self.filename, 'utf8', function (err, rawData) { if (err) { return callback(err); } self.data = Datastore.treatRawData(rawData); return callback(); }); } }); }); }; /** * From a database's raw data, return the corresponding * machine understandable collection */ Datastore.treatRawData = function (rawData) { var data = rawData.split('\n') , res = []; data.forEach(function (d) { var doc; try { doc = JSON.parse(d); res.push(doc); } catch (e) { } }); return res; }; /** * Insert a new document * @param {Function} cb Optional callback, signature: err, insertedDoc */ Datastore.prototype.insert = function (newDoc, cb) { var callback = cb || function () {} , self = this , persistableNewDoc ; try { newDoc._id = customUtils.uid(16); persistableNewDoc = JSON.stringify(newDoc); } catch (e) { return callback(e); } fs.appendFile(self.filename, persistableNewDoc + '\n', 'utf8', function (err) { if (err) { return callback(err); } var insertedDoc = JSON.parse(persistableNewDoc); self.data.push(insertedDoc); // Make sure the doc is the same on the disk and in memory // Some docs can't be stringified correctly return callback(null, insertedDoc); }); }; var d = new Datastore('workspace/test.db'); d.loadDatabase(function (err) { d.insert({ onetest: "oh yeah" }, function (err, insertedDoc) { console.log(err); console.log("==============="); console.log(insertedDoc); }); });