diskjsondb
Version:
A Lightweight Disk based JSON Database with a MongoDB like API
116 lines (104 loc) • 3.74 kB
JavaScript
/*
* diskDB
* http://arvindr21.github.io/diskDB
*
* Copyright (c) 2014 Arvind Ravulavaru
* Licensed under the MIT license.
*/
var util = require('./util'),
path = require('path'),
uuid = require('node-uuid');
module.exports = function(db, collectionName) {
var coltn = {};
coltn.collectionName = collectionName;
coltn._f = path.join(db._db.path, (collectionName + '.json'));
coltn.find = function(query) {
var collection = JSON.parse(util.readFromFile(this._f));
if (!query || Object.keys(query).length === 0) {
return collection;
} else {
var searcher = new util.ObjectSearcher();
return searcher.findAllInObject(collection, query, true);
}
};
coltn.findOne = function(query) {
var collection = JSON.parse(util.readFromFile(this._f));
if (!query) {
return collection[0];
} else {
var searcher = new util.ObjectSearcher();
return searcher.findAllInObject(collection, query, false)[0];
}
};
coltn.save = function(data, autoIncreasement = false) {
var collection = JSON.parse(util.readFromFile(this._f));
if (typeof data === 'object' && data.length) {
if (data.length === 1) {
if (data[0].length > 0) {
data = data[0];
}
}
var retCollection = [];
for (var i = data.length - 1; i >= 0; i--) {
var d = data[i];
d._id = autoIncreasement ? ++coltn._id : uuid.v4().replace(/-/g, '');
collection.push(d);
retCollection.push(d);
}
util.writeToFile(this._f, collection);
return retCollection;
} {
data._id = autoIncreasement ? ++coltn._id : uuid.v4().replace(/-/g, '');
collection.push(data);
util.writeToFile(this._f, collection);
return data;
}
};
coltn.update = function(query, data, options) {
var ret = {},
collection = JSON.parse(util.readFromFile(this._f)); // update
var records = util.finder(collection, query, true);
if (records.length) {
if (options && options.multi) {
collection = util.updateFiltered(collection, query, data, true);
ret.updated = records.length;
ret.inserted = 0;
} else {
collection = util.updateFiltered(collection, query, data, false);
ret.updated = 1;
ret.inserted = 0;
}
} else {
if (options && options.upsert) {
data._id = options.autoIncreasement ? ++coltn._id : uuid.v4().replace(/-/g, '');
collection.push(data);
ret.updated = 0;
ret.inserted = 1;
} else {
ret.updated = 0;
ret.inserted = 0;
}
}
util.writeToFile(this._f, collection);
return ret;
};
coltn.remove = function(query, multi) {
if (query) {
var collection = JSON.parse(util.readFromFile(this._f));
if (typeof multi === 'undefined') {
multi = true;
}
collection = util.removeFiltered(collection, query, multi);
util.writeToFile(this._f, collection);
} else {
util.removeFile(this._f);
delete db[collectionName];
}
return true;
};
coltn.count = function() {
return (JSON.parse(util.readFromFile(this._f))).length;
};
coltn._id = coltn.count() || 0;
return coltn;
};