Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# 1.8.18

Released: 2022-05-05

### Notable enhancements and fixes

* Upgraded ueberDB to fix a regression with CouchDB.

# 1.8.17

Released: 2022-02-23
Expand Down
64 changes: 19 additions & 45 deletions src/node/db/DB.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,8 @@ const ueberDB = require('ueberdb2');
const settings = require('../utils/Settings');
const log4js = require('log4js');
const stats = require('../stats');
const util = require('util');

// set database settings
const db =
new ueberDB.Database(settings.dbType, settings.dbSettings, null, log4js.getLogger('ueberDB'));
const logger = log4js.getLogger('ueberDB');

/**
* The UeberDB Object that provides the database functions
Expand All @@ -38,49 +35,26 @@ exports.db = null;

/**
* Initializes the database with the settings provided by the settings module
* @param {Function} callback
*/
exports.init = async () => await new Promise((resolve, reject) => {
db.init((err) => {
if (err) {
// there was an error while initializing the database, output it and stop
console.error('ERROR: Problem while initalizing the database');
console.error(err.stack ? err.stack : err);
process.exit(1);
exports.init = async () => {
exports.db = new ueberDB.Database(settings.dbType, settings.dbSettings, null, logger);
await exports.db.init();
if (exports.db.metrics != null) {
for (const [metric, value] of Object.entries(exports.db.metrics)) {
if (typeof value !== 'number') continue;
stats.gauge(`ueberdb_${metric}`, () => exports.db.metrics[metric]);
}

if (db.metrics != null) {
for (const [metric, value] of Object.entries(db.metrics)) {
if (typeof value !== 'number') continue;
stats.gauge(`ueberdb_${metric}`, () => db.metrics[metric]);
}
}

// everything ok, set up Promise-based methods
['get', 'set', 'findKeys', 'getSub', 'setSub', 'remove'].forEach((fn) => {
exports[fn] = util.promisify(db[fn].bind(db));
});

// set up wrappers for get and getSub that can't return "undefined"
const get = exports.get;
exports.get = async (key) => {
const result = await get(key);
return (result === undefined) ? null : result;
};

const getSub = exports.getSub;
exports.getSub = async (key, sub) => {
const result = await getSub(key, sub);
return (result === undefined) ? null : result;
};

// exposed for those callers that need the underlying raw API
exports.db = db;
resolve();
});
});
}
for (const fn of ['get', 'set', 'findKeys', 'getSub', 'setSub', 'remove']) {
const f = exports.db[fn];
exports[fn] = async (...args) => await f.call(exports.db, ...args);
Object.setPrototypeOf(exports[fn], Object.getPrototypeOf(f));
Object.defineProperties(exports[fn], Object.getOwnPropertyDescriptors(f));
}
};

exports.shutdown = async (hookName, context) => {
await util.promisify(db.close.bind(db))();
console.log('Database closed');
if (exports.db != null) await exports.db.close();
exports.db = null;
logger.log('Database closed');
};
Loading