UNPKG

iagate-querykit

Version:

QueryKit: lightweight TypeScript query toolkit with models, views, triggers, events, scheduler and adapters (better-sqlite3).

63 lines (62 loc) 1.79 kB
import { createRequire } from 'node:module'; let oracledb; function ensureOracle() { if (oracledb) return; const mocked = globalThis.__vitest_mocks__?.oracledb; if (mocked) { oracledb = mocked; return; } try { const req = createRequire(import.meta.url); oracledb = req('oracledb'); } catch { throw new Error('oracledb is required: npm install oracledb'); } } function toOracle(sql) { let i = 0; const out = sql.replace(/\?/g, () => `:${++i}`); return { sql: out }; } export class OracleExecutor { config; dialect = 'oracle'; pool; constructor(config = {}) { this.config = config; ensureOracle(); } async getPool() { if (!this.pool) { this.pool = await oracledb.createPool({ user: this.config.user, password: this.config.password, connectString: this.config.connectString, poolMin: this.config.poolMin || 0, poolMax: this.config.poolMax || 10, }); } return this.pool; } async executeQuery(sql, bindings = []) { const pool = await this.getPool(); const conn = await pool.getConnection(); try { const { sql: text } = toOracle(sql); const res = await conn.execute(text, bindings, { outFormat: oracledb.OUT_FORMAT_OBJECT, autoCommit: true }); const rows = res.rows || []; const affectedRows = res.rowsAffected; const lastInsertId = res.lastRowid; return { data: rows, affectedRows, lastInsertId }; } finally { try { await conn.close(); } catch { } } } }