You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.3 KiB
77 lines
2.3 KiB
'use strict';
|
|
|
|
const Joi = require('joi');
|
|
const Knex = require('knex');
|
|
const Rfr = require('rfr');
|
|
|
|
const ComSrv = Rfr('/server/comsrv');
|
|
|
|
let db = null;
|
|
|
|
const connectToDB = async () => {
|
|
ComSrv.debug(`Connecting to ${process.env.DB_HOST}:${process.env.DB_PORT} as ` +
|
|
`${process.env.DB_USER} (type: ${process.env.DB_TYPE}, ` +
|
|
`DB: ${process.env.DB_DATABASE})`);
|
|
|
|
let db = Knex({
|
|
client: process.env.DB_TYPE,
|
|
connection: {
|
|
host: process.env.DB_HOST,
|
|
port: process.env.DB_PORT,
|
|
user: process.env.DB_USER,
|
|
password: process.env.DB_PASS,
|
|
database: process.env.DB_DATABASE
|
|
},
|
|
log: {
|
|
warn(message) { console.warn(message) },
|
|
error(message) { console.error(message) },
|
|
debug(message) { ComSrv.debug(message) }
|
|
}
|
|
});
|
|
|
|
await db.raw('select 1 as connected');
|
|
console.log('Connected to DB');
|
|
|
|
return db;
|
|
}
|
|
|
|
module.exports = {
|
|
config: Joi.object({
|
|
DB_TYPE: Joi.string().valid('pg', 'mysql'),
|
|
DB_HOST: Joi.alternatives().try(Joi.string().hostname(), Joi.string().ip()),
|
|
DB_USER: Joi.string().min(1),
|
|
DB_PASS: Joi.string().min(1),
|
|
DB_DATABASE: Joi.string().min(1),
|
|
DB_TABLE: Joi.string().min(1),
|
|
|
|
DB_PORT: Joi.number().port().optional().when('DB_TYPE', {
|
|
is: Joi.string().valid('pg'),
|
|
then: Joi.number().default(5432),
|
|
otherwise: Joi.number().default(3306)
|
|
}),
|
|
|
|
DB_RETRIES: Joi.number().integer().min(0).optional().default(3)
|
|
}),
|
|
|
|
initDB: async () => {
|
|
let retries = process.env.DB_RETRIES;
|
|
|
|
do {
|
|
try {
|
|
db = await connectToDB();
|
|
return;
|
|
} catch (e) {
|
|
console.error(`Failed to connect to DB: ${e}`)
|
|
if (retries >= 2 || process.env.DB_RETRIES == 0) {
|
|
console.log(`Attempting another connection after 3s`);
|
|
await new Promise(res => setTimeout(res, 3000));
|
|
}
|
|
}
|
|
} while (process.env.DB_RETRIES == 0 || --retries > 0);
|
|
|
|
throw new Error("Failed to connect to DB");
|
|
},
|
|
|
|
query: (table = process.env.DB_TABLE) => db(table),
|
|
db: () => db
|
|
};
|
|
|