87 lines
2.5 KiB
JavaScript
87 lines
2.5 KiB
JavaScript
/*
|
|
! /database/pools.js
|
|
? The main database pool (connection) manager
|
|
*/
|
|
|
|
// % imports
|
|
import mariadb from 'mariadb';
|
|
|
|
// % database credentials mapping
|
|
const CREDENTIALS_MAP = {
|
|
read: { user: process.env.DB_READ_USER, pass: process.env.DB_READ_PASS },
|
|
write: { user: process.env.DB_WRITE_USER, pass: process.env.DB_WRITE_PASS },
|
|
delete: { user: process.env.DB_DELETE_USER, pass: process.env.DB_DELETE_PASS },
|
|
backup: { user: process.env.DB_BACKUP_USER, pass: process.env.DB_BACKUP_PASS }
|
|
}
|
|
|
|
// $ get database credentials
|
|
function getCredentials(protocol = 'read') {
|
|
const key = String(protocol).toLowerCase();
|
|
return CREDENTIALS_MAP[key] ?? CREDENTIALS_MAP.read;
|
|
}
|
|
|
|
// = pool manager class
|
|
class PoolManager {
|
|
constructor() {
|
|
this.pools = new Map();
|
|
}
|
|
|
|
// $ function to add a connection
|
|
async add(config) {
|
|
// ~ check if this pool is already existing → then return
|
|
if (this.pools.has(config.name)) {
|
|
return { pool: this.pools.get(config.name), connStat: true };
|
|
}
|
|
|
|
// ~ get database credentials by protocol
|
|
const { user, pass } = getCredentials(config.protocol);
|
|
|
|
// ~ create the mariadb pool
|
|
const pool = mariadb.createPool({
|
|
host: config.address,
|
|
port: Number(process.env.DB_CONN_PORT),
|
|
user,
|
|
password: pass,
|
|
database: config.database,
|
|
waitForConnections: true,
|
|
connectionLimit: 5,
|
|
queueLimit: 0,
|
|
enableKeepAlive: true,
|
|
keepAliveInitialDelay: 10000
|
|
});
|
|
|
|
// ~ add the pool to the map
|
|
this.pools.set(config.name, pool);
|
|
|
|
// ~ return the pool
|
|
return { pool, connStat: true };
|
|
}
|
|
|
|
// $ function to remove a connection
|
|
async remove(name) {
|
|
if (this.pools.has(name)) {
|
|
const pool = this.pools.get(name);
|
|
await pool.end();
|
|
this.pools.delete(name);
|
|
}
|
|
return { connStat: false };
|
|
}
|
|
|
|
// $ function to get the status of a connection
|
|
async status(name) {
|
|
if (this.pools.has(name)) {
|
|
try {
|
|
const pool = this.pools.get(name);
|
|
await pool.query('SELECT 1');
|
|
return { pool, connStat: true };
|
|
} catch(err) {
|
|
return { connStat: false, msg: err }
|
|
}
|
|
} else {
|
|
return { connStat: false };
|
|
}
|
|
}
|
|
}
|
|
|
|
// $ export the pool manager
|
|
export default new PoolManager(); |