iagate-querykit
Version:
QueryKit: lightweight TypeScript query toolkit with models, views, triggers, events, scheduler and adapters (better-sqlite3).
53 lines (52 loc) • 1.74 kB
JavaScript
import { createRequire } from 'node:module';
let mssql;
function ensureMssql() {
if (mssql)
return;
const mocked = globalThis.__vitest_mocks__?.mssql;
if (mocked) {
mssql = mocked;
return;
}
try {
const req = createRequire(import.meta.url);
mssql = req('mssql');
}
catch {
throw new Error('mssql is required: npm install mssql');
}
}
function toMssql(sql) {
const names = [];
let i = 0;
const out = sql.replace(/\?/g, () => { const name = `p${++i}`; names.push(name); return `@${name}`; });
return { sql: out, paramNames: names };
}
export class SqlServerExecutor {
config;
dialect = 'mssql';
pool;
constructor(config = {}) {
this.config = config;
ensureMssql();
this.pool = new mssql.ConnectionPool({
user: config.user,
password: config.password,
server: config.server || 'localhost',
port: config.port,
database: config.database,
options: { trustServerCertificate: true, ...(config.options || {}) },
pool: { max: config.pool?.max || 10, min: config.pool?.min || 0 },
}).connect();
}
async executeQuery(sql, bindings = []) {
const pool = await this.pool;
const { sql: text, paramNames } = toMssql(sql);
const request = pool.request();
paramNames.forEach((name, idx) => { request.input(name, bindings[idx]); });
const res = await request.query(text);
const rows = res.recordset || [];
const affectedRows = Array.isArray(res.rowsAffected) ? res.rowsAffected.reduce((a, b) => a + b, 0) : undefined;
return { data: rows, affectedRows };
}
}