import sql from "mssql"; import { quoteIdentifier, resolveDatabaseName } from "./sql.js"; export class SqlServerClient { config; pools = new Map(); constructor(config) { this.config = config; } get allowedDatabases() { return this.config.allowedDatabases; } get defaultDatabase() { return this.config.defaultDatabase; } get readOnly() { return this.config.readOnly; } get enableDdl() { return this.config.enableDdl; } get maxRows() { return this.config.maxRows; } get maxWriteRows() { return this.config.maxWriteRows; } async query(databaseName, statement, params = []) { const pool = await this.getPool(databaseName); const request = pool.request(); bindParams(request, params); return request.query(statement); } async batch(databaseName, statement) { const pool = await this.getPool(databaseName); return pool.request().batch(statement); } async close() { const pools = await Promise.all([...this.pools.values()]); await Promise.all(pools.map((pool) => pool.close())); this.pools.clear(); } async getPool(requestedDatabase) { const database = resolveDatabaseName(requestedDatabase, this.config.defaultDatabase, this.config.allowedDatabases); const key = database.toLowerCase(); const existing = this.pools.get(key); if (existing) { return existing; } const poolPromise = new sql.ConnectionPool(buildSqlConfig(this.config, database)).connect(); this.pools.set(key, poolPromise); return poolPromise; } } export function useDatabaseStatement(databaseName) { return `USE ${quoteIdentifier(databaseName)};`; } function buildSqlConfig(config, database) { return { server: config.serverName, database, user: config.user, password: config.password, connectionTimeout: config.connectionTimeoutMs, requestTimeout: config.requestTimeoutMs, options: { encrypt: config.encrypt, trustServerCertificate: config.trustServerCertificate }, pool: { max: 5, min: 0, idleTimeoutMillis: 30000 } }; } function bindParams(request, params) { for (const param of params) { request.input(param.name, param.value); } } //# sourceMappingURL=db.js.map