UNPKG

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
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 }; } }