Files
2026-06-24 09:13:18 +08:00

81 lines
2.4 KiB
JavaScript

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