Initial commit
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
! /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();
|
||||
Reference in New Issue
Block a user