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',
Lloyd Hilaiel
committed
'userKnown',
Lloyd Hilaiel
committed
'isStaged',
'emailsBelongToSameAccount',
'emailForVerificationSecret',
Lloyd Hilaiel
committed
'haveVerificationSecret',
Lloyd Hilaiel
committed
'verificationSecretForEmail',
Lloyd Hilaiel
committed
'checkAuth',
'listEmails',
Lloyd Hilaiel
committed
'lastStaged',
Lloyd Hilaiel
committed
'emailType',
'userOwnsEmail',
'emailToUID'
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);