jdb
Version:
A database that hacks.
166 lines (163 loc) • 4.19 kB
JavaScript
// Generated by CoffeeScript 1.7.1
JDB.Jdb = (function() {
function Jdb(options) {
var Q, ego, fs, k, self, v;
fs = require('fs');
Q = require('q');
self = {
exec: function(opts) {
var deferred, err, is_rolled_back, is_sent, jdb;
if (ego.opts.promise) {
deferred = Q.defer();
}
if (!opts.command) {
return;
}
is_sent = false;
is_rolled_back = false;
jdb = {
send: function(data) {
if (is_sent) {
return;
} else {
is_sent = true;
}
if (typeof opts.callback === "function") {
opts.callback(null, data);
}
if (ego.opts.promise) {
return deferred.resolve(data);
}
},
save: function(data) {
if (is_rolled_back) {
return;
}
return ego.db_file.write("(" + opts.command + ")(jdb, " + (JSON.stringify(opts.data)) + ");\n", function() {
return jdb.send(data);
});
},
rollback: function() {
ego.load_data();
return is_rolled_back = true;
}
};
Object.defineProperty(jdb, 'doc', {
get: function() {
return ego.doc;
},
set: function() {
return console.error(">> Error: 'jdb.doc' is readonly.");
}
});
try {
opts.command(jdb, opts.data);
} catch (_error) {
err = _error;
jdb.rollback();
if (opts.callback) {
opts.callback(err);
} else {
if (ego.opts.promise) {
deferred.reject(err);
}
}
}
if (ego.opts.promise) {
return deferred.promise;
}
},
compact_db_file: function(callback) {
var err, error;
try {
fs.writeFileSync(ego.opts.db_path, "var jdb = {\n doc: " + (JSON.stringify(ego.doc)) + ",\n send: function () {},\n save: function () {},\n rollback: function () {}\n};\n");
} catch (_error) {
err = _error;
error = err;
}
if (callback) {
return callback(error);
} else if (error) {
throw error;
}
}
};
ego = {
opts: {
db_path: 'jdb.db',
compact_db_file: true,
promise: false,
error: null
},
doc: {},
db_file: null,
init: function() {
ego.init_options();
ego.init_db_file();
return ego.db_file = fs.createWriteStream(ego.opts.db_path, {
flags: 'a',
encoding: 'utf8'
});
},
init_options: function() {
var k, v, _ref, _results;
if (!options) {
return;
}
_ref = ego.opts;
_results = [];
for (k in _ref) {
v = _ref[k];
if (options[k] !== void 0) {
_results.push(ego.opts[k] = options[k]);
} else {
_results.push(void 0);
}
}
return _results;
},
init_db_file: function() {
if (fs.existsSync(ego.opts.db_path)) {
ego.load_data();
if (ego.opts.compact_db_file) {
return self.compact_db_file();
}
} else {
return self.compact_db_file();
}
},
load_data: function() {
var err, error, str;
str = fs.readFileSync(ego.opts.db_path, 'utf8');
try {
eval(str);
if (typeof jdb.doc === 'object') {
ego.doc = jdb.doc;
}
} catch (_error) {
err = _error;
error = err;
}
if (ego.opts.error) {
return ego.opts.error(error);
} else if (error) {
throw error;
}
}
};
for (k in self) {
v = self[k];
this[k] = v;
}
self = this;
for (k in ego) {
v = ego[k];
if (typeof v === 'function') {
v.bind(self);
}
}
ego.init();
return self;
}
return Jdb;
})();