Newer
Older
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla BrowserID.
*
* The Initial Developer of the Original Code is Mozilla.
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
var logger = require('./logging.js').logger;
Lloyd Hilaiel
committed
const config = require('./configuration.js');
Lloyd Hilaiel
committed
Lloyd Hilaiel
committed
var driver;
Lloyd Hilaiel
committed
var ready = false;
var waiting = [];
function checkReady() {
if (!ready) throw "database not ready. did you call open()?";
}
Lloyd Hilaiel
committed
// async break allow database path to be configured by calling code
Lloyd Hilaiel
committed
// a touch tricky cause client must set dbPath before releasing
Lloyd Hilaiel
committed
// control of the runloop
exports.open = function(cfg, cb) {
Lloyd Hilaiel
committed
if (cfg && cfg.driver) driverName = cfg.driver;
try {
driver = require('./db/' + driverName + '.js');
Lloyd Hilaiel
committed
} catch(e) {
var msg = "FATAL: couldn't find database driver: " + driverName;
console.log(msg);
throw msg + ": " + e.toString();
}
driver.open(cfg, function(error) {
Lloyd Hilaiel
committed
if (error) {
Lloyd Hilaiel
committed
if (cb) cb(error);
else {
Lloyd Hilaiel
committed
logger.error(error);
Lloyd Hilaiel
committed
process.exit(1);
}
} else {
ready = true;
waiting.forEach(function(f) { f() });
waiting = [];
if (cb) cb();
Lloyd Hilaiel
committed
}
});
};
Lloyd Hilaiel
committed
exports.close = function(cb) {
Lloyd Hilaiel
committed
checkReady();
Lloyd Hilaiel
committed
driver.close(function(err) {
ready = false;
Lloyd Hilaiel
committed
if (cb) cb(err);
});
};
Lloyd Hilaiel
committed
exports.closeAndRemove = function(cb) {
checkReady();
driver.closeAndRemove(function(err) {
ready = false;
if (cb) cb(err);
});
};
// accepts a function that will be invoked once the database is ready for transactions.
// this hook is important to pause the rest of application startup until async database
// connection establishment is complete.
Lloyd Hilaiel
committed
exports.onReady = function(f) {
setTimeout(function() {
if (ready) f();
else waiting.push(f);
}, 0);
};
Lloyd Hilaiel
committed
// these are read only database calls
Lloyd Hilaiel
committed
[
'emailKnown',
'isStaged',
'emailsBelongToSameAccount',
'emailForVerificationSecret',
Lloyd Hilaiel
committed
'haveVerificationSecret',
Lloyd Hilaiel
committed
'verificationSecretForEmail',
Lloyd Hilaiel
committed
'checkAuth',
'listEmails',
Lloyd Hilaiel
committed
'lastStaged',
'ping',
'emailType'
Lloyd Hilaiel
committed
].forEach(function(fn) {
exports[fn] = function() {
checkReady();
driver[fn].apply(undefined, arguments);
};
});
// These are database calls that write. Database
// writing must be enabled on the process for them
// to work.
[
'stageUser',
'stageEmail',
'gotVerificationSecret',
Lloyd Hilaiel
committed
'removeEmail',
Lloyd Hilaiel
committed
'cancelAccount',
Lloyd Hilaiel
committed
'updatePassword',
'createUserWithPrimaryEmail',
'addPrimaryEmailToAccount'
Lloyd Hilaiel
committed
].forEach(function(fn) {
exports[fn] = function() {
Lloyd Hilaiel
committed
if (!config.get('database').may_write) {
throw "this process may not write the database"
}
Lloyd Hilaiel
committed
checkReady();
driver[fn].apply(undefined, arguments);
};
Lloyd Hilaiel
committed
});
Lloyd Hilaiel
committed
exports.addTestUser = function() {
// would we like to check the environment here?
checkReady();
driver['addTestUser'].apply(undefined, arguments);