blob: 62e622b3b53c9f7c8070bb98fc2b121b537bbc09 [file] [log] [blame]
/*globals cordova */
"use strict";
var Adapter = require('./adapter');
var utils = require('./utils');
var TaskQueue = require('./taskqueue');
var Promise = utils.Promise;
function defaultCallback(err) {
if (err && global.debug) {
console.error(err);
}
}
utils.inherits(PouchDB, Adapter);
function PouchDB(name, opts, callback) {
if (!(this instanceof PouchDB)) {
return new PouchDB(name, opts, callback);
}
var self = this;
if (typeof opts === 'function' || typeof opts === 'undefined') {
callback = opts;
opts = {};
}
if (name && typeof name === 'object') {
opts = name;
name = undefined;
}
if (typeof callback === 'undefined') {
callback = defaultCallback;
}
opts = opts || {};
var oldCB = callback;
self.auto_compaction = opts.auto_compaction;
self.prefix = PouchDB.prefix;
Adapter.call(self);
self.taskqueue = new TaskQueue();
var promise = new Promise(function (fulfill, reject) {
callback = function (err, resp) {
if (err) {
return reject(err);
}
delete resp.then;
fulfill(resp);
};
opts = utils.clone(opts);
var originalName = opts.name || name;
var backend, error;
(function () {
try {
if (typeof originalName !== 'string') {
error = new Error('Missing/invalid DB name');
error.code = 400;
throw error;
}
backend = PouchDB.parseAdapter(originalName, opts);
opts.originalName = originalName;
opts.name = backend.name;
if (opts.prefix) {
opts.name = opts.prefix + opts.name;
}
opts.adapter = opts.adapter || backend.adapter;
self._adapter = opts.adapter;
self._db_name = originalName;
if (!PouchDB.adapters[opts.adapter]) {
error = new Error('Adapter is missing');
error.code = 404;
throw error;
}
if (!PouchDB.adapters[opts.adapter].valid()) {
error = new Error('Invalid Adapter');
error.code = 404;
throw error;
}
} catch (err) {
self.taskqueue.fail(err);
self.changes = utils.toPromise(function (opts) {
if (opts.complete) {
opts.complete(err);
}
});
}
}());
if (error) {
return reject(error); // constructor error, see above
}
self.adapter = opts.adapter;
// needs access to PouchDB;
self.replicate = {};
self.replicate.from = function (url, opts, callback) {
return PouchDB.replicate(url, self, opts, callback);
};
self.replicate.to = function (url, opts, callback) {
return PouchDB.replicate(self, url, opts, callback);
};
self.sync = function (dbName, opts, callback) {
return PouchDB.sync(self, dbName, opts, callback);
};
self.replicate.sync = self.sync;
self.destroy = utils.adapterFun('destroy', function (callback) {
var self = this;
self.info(function (err, info) {
if (err) {
return callback(err);
}
PouchDB.destroy(info.db_name, callback);
});
});
PouchDB.adapters[opts.adapter].call(self, opts, function (err, db) {
if (err) {
if (callback) {
self.taskqueue.fail(err);
callback(err);
}
return;
}
function destructionListener(event) {
if (event === 'destroyed') {
self.emit('destroyed');
PouchDB.removeListener(originalName, destructionListener);
}
}
PouchDB.on(originalName, destructionListener);
self.emit('created', self);
PouchDB.emit('created', opts.originalName);
self.taskqueue.ready(self);
callback(null, self);
});
if (opts.skipSetup) {
self.taskqueue.ready(self);
}
if (utils.isCordova()) {
//to inform websql adapter that we can use api
cordova.fireWindowEvent(opts.name + "_pouch", {});
}
});
promise.then(function (resp) {
oldCB(null, resp);
}, oldCB);
self.then = promise.then.bind(promise);
self.catch = promise.catch.bind(promise);
}
module.exports = PouchDB;