The JavaScript Database, for Node.js, nw.js, electron and the browser
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
nedb/lib/datastore.js

109 lines
2.5 KiB

/**
* 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);
});
});