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
JavaScript
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 { }
}
}
}