58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
const { Pool } = require('pg');
|
|||
|
|
require('dotenv').config();
|
||
|
|
|
||
|
|
const pools = {};
|
||
|
|
|
||
|
|
function getPool(dbName) {
|
||
|
|
const database = dbName || process.env.PG_DATABASE || 'an_omon_full_04052026';
|
||
|
|
if (!pools[database]) {
|
||
|
|
pools[database] = new Pool({
|
||
|
|
host: process.env.PG_HOST || '192.168.50.79',
|
||
|
|
port: parseInt(process.env.PG_PORT || '5437', 10),
|
||
|
|
user: process.env.PG_USER || 'postgres',
|
||
|
|
password: process.env.PG_PASSWORD || '123',
|
||
|
|
database: database,
|
||
|
|
max: 10,
|
||
|
|
idleTimeoutMillis: 30000,
|
||
|
|
connectionTimeoutMillis: 5000,
|
||
|
|
statement_timeout: 15000, // 15s timeout to prevent hanging queries
|
||
|
|
});
|
||
|
|
|
||
|
|
pools[database].on('error', (err) => {
|
||
|
|
console.error(`Unexpected error on idle client for db ${database}`, err);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
return pools[database];
|
||
|
|
}
|
||
|
|
|
||
|
|
async function query(sql, params = [], dbName = null) {
|
||
|
|
const pool = getPool(dbName);
|
||
|
|
const start = Date.now();
|
||
|
|
const res = await pool.query(sql, params);
|
||
|
|
const duration = Date.now() - start;
|
||
|
|
// console.log(`[SQL ${duration}ms] executed on ${dbName || 'default'}`);
|
||
|
|
return res;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Clean RTF string helper
|
||
|
|
function cleanRtf(text) {
|
||
|
|
if (!text) return '';
|
||
|
|
if (!text.includes('{\\rtf')) return text.trim();
|
||
|
|
// Strip RTF control codes
|
||
|
|
let clean = text
|
||
|
|
.replace(/\\par[d]?/g, '\n')
|
||
|
|
.replace(/\\u([0-9]{3,5})\?/g, (match, dec) => String.fromCharCode(dec))
|
||
|
|
.replace(/\\'([0-9a-fA-F]{2})/g, (match, hex) => String.fromCharCode(parseInt(hex, 16)))
|
||
|
|
.replace(/\{[^{}]*\}/g, '')
|
||
|
|
.replace(/\\[a-zA-Z0-9\-]+/g, '')
|
||
|
|
.replace(/[\{\}]/g, '')
|
||
|
|
.trim();
|
||
|
|
return clean;
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = {
|
||
|
|
getPool,
|
||
|
|
query,
|
||
|
|
cleanRtf,
|
||
|
|
};
|