dbjs-mongo
Version:
mongodb driver for dbjs
60 lines (52 loc) • 2.14 kB
JavaScript
;
var setPrototypeOf = require('es5-ext/object/set-prototype-of')
, ensureObject = require('es5-ext/object/valid-object')
, ensureString = require('es5-ext/object/validate-stringifiable-value')
, d = require('d')
, deferred = require('deferred')
, Driver = require('dbjs-persistence/driver')
, Mongo = require('mongodb')
, Storage = require('./storage')
, ReducedStorage = require('./reduced-storage')
, isIdent = RegExp.prototype.test.bind(/^[a-z][a-z0-9A-Z]*$/)
, promisify = deferred.promisify
, MongoCursor = Mongo.Cursor, MongoClient = Mongo.MongoClient
, connect = promisify(MongoClient.connect);
Object.defineProperties(MongoCursor.prototype, {
nextPromised: d(promisify(MongoCursor.prototype.next)),
toArrayPromised: d(promisify(MongoCursor.prototype.toArray)),
closePromised: d(promisify(MongoCursor.prototype.close))
});
var buildUrl = function (conf) {
var url = 'mongodb://';
if (conf.user && conf.password) url += conf.user + ':' + conf.password + '@';
url += (conf.host != null) ? conf.host : 'localhost';
url += ':';
url += (conf.port != null) ? conf.port : '27017';
return url + '/' + conf.database;
};
var MongoDriver = module.exports = Object.defineProperties(function (data) {
if (!(this instanceof MongoDriver)) return new MongoDriver(data);
ensureObject(data);
ensureObject(data.mongo);
ensureString(data.mongo.database);
Driver.call(this, data);
this.mongoDb = connect(buildUrl(data.mongo)).aside(null, this.emitError);
}, {
storageClass: d(Storage),
reducedStorageClass: d(ReducedStorage)
});
setPrototypeOf(MongoDriver, Driver);
MongoDriver.prototype = Object.create(Driver.prototype, {
constructor: d(MongoDriver),
__resolveAllStorages: d(function () {
return this.mongoDb.invokeAsync('collections')(function (collections) {
collections.forEach(function (collection) {
var name = collection.collectionName;
if (!isIdent(name)) return;
this.getStorage(name);
}, this);
}.bind(this))(Function.prototype);
}),
__close: d(function () { return this.mongoDb.invokeAsync('close'); })
});