Files
term_portal/express/models/db.js
T
2022-12-07 04:43:36 +01:00

66 lines
1.5 KiB
JavaScript

const { Pool, Client } = require('pg')
const debug = require('debug')('termPortal:models/db')
const pool = new Pool()
pool.on('error', (err, client) => {
debug('Error on DB pool idle client:')
debug({ err, client })
})
exports.query = (text, params) => pool.query(text, params)
exports.getClient = () => pool.connect()
// Returns a new client from outside the pool.
exports.getExtraClient = () => {
const client = new Client()
client.connect()
return client
}
exports.transaction = async queriesFn => {
const client = await pool.connect()
try {
await client.query('BEGIN')
await queriesFn(client)
await client.query('COMMIT')
} catch (error) {
await client.query('ROLLBACK')
throw error
} finally {
client.release()
}
}
exports.genParamStr = paramArr => {
const paramPlaceholderString = paramArr.reduce((str, param, index) => {
if (index) str += ', '
str += `$${index + 1}`
return str
}, '')
return paramPlaceholderString
}
exports.waitForConnection = () => {
return new Promise(resolve => {
async function testConnection() {
try {
// eslint-disable-next-line no-console
console.log('Verifying connection to DB server')
await pool.query('SELECT 1')
// eslint-disable-next-line no-console
console.log('Connection to DB server verified')
resolve()
} catch {
// eslint-disable-next-line no-console
console.error('Could not connect to DB server')
setTimeout(testConnection, 1000)
}
}
testConnection()
})
}