From be3b578267423f966c147b0317c535fa7cd3ec2b Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Sun, 15 May 2016 20:11:23 -0700 Subject: [PATCH] ldb refactor. --- lib/bcoin/ldb.js | 112 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 79 insertions(+), 33 deletions(-) diff --git a/lib/bcoin/ldb.js b/lib/bcoin/ldb.js index eccfe318..acdac7ef 100644 --- a/lib/bcoin/ldb.js +++ b/lib/bcoin/ldb.js @@ -22,11 +22,13 @@ var db = {}; * @param {Number} options.mapSize * @param {Boolean} options.writeMap * @param {String} options.db - Database backend (`"leveldb"` by default). + * @param {String} options.name - Database name. + * @param {String} options.location - Database location (overrides `name`). * @returns {LowlevelUp} */ function ldb(options) { - var file = getLocation(options); + var file = ldb.getLocation(options); if (!db[file]) { if (!options) @@ -52,14 +54,66 @@ function ldb(options) { mapSize: options.mapSize || 300 * (1024 << 20), writeMap: options.writeMap || false, - db: getBackend(options.db) + db: ldb.getBackend(options.db) }); } return db[file]; } -function getLocation(options) { +/** + * Get database name and extension based on options. + * @param {String} db + * @returns {Object} + */ + +ldb.getName = function getName(db) { + var ext; + + if (!db) + db = bcoin.db || 'leveldb'; + + if (db === 'leveldb') + name = 'leveldown'; + else if (db === 'rocksdb') + name = 'rocksdown'; + else if (db === 'lmdb') + name = 'lmdb'; + else if (db === 'memory') + name = 'bst'; + else + name = db; + + switch (name) { + case 'leveldown': + ext = 'ldb'; + break; + case 'rocksdown': + ext = 'rdb'; + break; + case 'lmdb': + ext = 'lmdb'; + break; + case 'bst': + ext = 'mem'; + break; + default: + ext = 'db'; + break; + } + + return { name: name, ext: ext }; +}; + +/** + * Get database location based on options. + * @param {Object} options + * @returns {String} Path. + */ + +ldb.getLocation = function getLocation(options) { + var backend = ldb.getName(options.db); + if (options.location) return options.location; @@ -68,23 +122,20 @@ function getLocation(options) { + options.name + '-' + bcoin.network.get(options.network).type - + '.db'; -} + + '.' + + backend.ext; +}; -function getBackend(backend) { - if (!backend) - backend = bcoin.db; +/** + * Require database backend module. + * @param {String} db + * @returns {Object} Module. + */ - if (!backend || backend === 'leveldb') - backend = 'leveldown'; - else if (backend === 'rocksdb') - backend = 'rocksdown'; - else if (backend === 'lmdb') - backend = 'lmdb'; - else if (backend === 'memory') - backend = 'bst'; +ldb.getBackend = function getBackend(db) { + var backend = ldb.getName(db); - if (backend === 'bst') + if (backend.name === 'bst') return require('./bst'); if (bcoin.isBrowser) @@ -92,8 +143,8 @@ function getBackend(backend) { bcoin.ensurePrefix(); - return require(backend); -} + return require(backend.name); +}; /** * Destroy a database. @@ -101,15 +152,15 @@ function getBackend(backend) { * @param {Function} callback */ -function destroy(options, callback) { - var file = getLocation(options); - var backend = getBackend(options.db); +ldb.destroy = function destroy(options, callback) { + var file = ldb.getLocation(options); + var backend = ldb.getBackend(options.db); if (!backend.destroy) return utils.nextTick(callback); backend.destroy(file, callback); -} +}; /** * Repair a database. @@ -117,23 +168,18 @@ function destroy(options, callback) { * @param {Function} callback */ -function repair(options, callback) { - var file = getLocation(options); - var backend = getBackend(options.db); +ldb.repair = function repair(options, callback) { + var file = ldb.getLocation(options); + var backend = ldb.getBackend(options.db); if (!backend.repair) return utils.asyncify(callback)(new Error('Cannot repair.')); backend.repair(file, callback); -} +}; /* * Expose */ -exports = ldb; - -exports.destroy = destroy; -exports.repair = repair; - -module.exports = exports; +module.exports = ldb;