← back to Norma

agents/shared/db.js

45 lines

/**
 * Norma Shared Database Connection
 *
 * PostgreSQL pool for all Norma agents.
 * Uses the Norma database on localhost.
 */

const { Pool } = require('pg');

const pool = new Pool({
  connectionString: process.env.DATABASE_URL || 'postgresql://dw_admin@127.0.0.1:5432/sdcc',
  max: 10,
  idleTimeoutMillis: 30000,
  connectionTimeoutMillis: 5000,
});

// Log pool errors (don't crash the process)
pool.on('error', (err) => {
  console.error(`[${new Date().toISOString()}] [db] Unexpected pool error:`, err.message);
});

/**
 * Execute a parameterized query against the pool.
 * @param {string} text - SQL query with $1, $2, etc. placeholders
 * @param {Array} params - Parameter values
 * @returns {Promise<import('pg').QueryResult>}
 */
async function query(text, params) {
  const start = Date.now();
  try {
    const result = await pool.query(text, params);
    const duration = Date.now() - start;
    if (duration > 1000) {
      console.warn(`[${new Date().toISOString()}] [db] Slow query (${duration}ms): ${text.substring(0, 80)}...`);
    }
    return result;
  } catch (err) {
    console.error(`[${new Date().toISOString()}] [db] Query error: ${err.message}`);
    console.error(`[${new Date().toISOString()}] [db] Query: ${text.substring(0, 120)}`);
    throw err;
  }
}

module.exports = { pool, query };