var Q = require('q'); var format = require('util').format; var low = require('lowdb'); low.mixin(low.mixin(require('underscore-db'))); /** * OKDB! * Minimal interface over a database of named collections of documents. */ function OKDB(options) { if (!(this instanceof OKDB)) return new OKDB(options); options = options || {}; var type; if (typeof options === 'string') type = options; else type = options.type; if (!type) throw new Error('No DB type provided'); switch (type) { case 'fs': return FSDB(options); default: throw new Error('Invalid DB type'); } } /** * DB implementation backed by a JSON file. * TODO Incomplete */ function FSDB(options) { if (!(this instanceof FSDB)) return new FSDB(options); options = options || {}; var name = options.name || 'db'; var filename = name + '.json'; this._db = low(filename); } FSDB.prototype._resolve = function(data, error) { return Q.Promise(function resolvePromise(resolve, reject) { if (error) { reject(error); } else { resolve(data); } }); }; FSDB.prototype.get = function(collection, query) { var data = this._db(collection).find(query); if (!query) { return this._resolve(null, new Error('No query given')); } else { return this._resolve(data); } }; FSDB.prototype.put = function(collection, query, data) { data = data || {}; if (!query) { return this._resolve(null, new Error('No query given')); } else if (this._db(collection).find(query)) { var updated = this._db(collection) .chain() .find(query) .assign(data) .value(); return this._resolve(updated); } else { return this._resolve(null, new Error('Cannot update nonexistent entry')); } }; FSDB.prototype.create = function(collection, id, data) { throw new Error('Not implemented!'); }; FSDB.prototype.remove = function(collection, id, data) { throw new Error('Not implemented!'); }; FSDB.prototype.find = function(collection, id, data) { throw new Error('Not implemented!'); }; FSDB.prototype.getMeta = function() { var data = this._db('meta').first(); return this._resolve(data || {}); }; FSDB.prototype.getAll = function(collection) { var data = this._db(collection).toArray(); return this._resolve(data || []); }; module.exports = OKDB;