UNPKG

mssql

Version:

Microsoft SQL Server client for Node.js.

106 lines (91 loc) 3.51 kB
'use strict' const msnodesql = require('msnodesqlv8') const debug = require('debug')('mssql:msv8') const BaseConnectionPool = require('../base/connection-pool') const { IDS, INCREMENT } = require('../utils') const shared = require('../shared') const ConnectionError = require('../error/connection-error') const { platform } = require('node:os') const { build } = require('@tediousjs/connection-string') const { CHANNELS, publish } = require('../diagnostics') const DEFAULT_CONNECTION_DRIVER = ['darwin', 'linux'].includes(platform()) ? 'ODBC Driver 17 for SQL Server' : 'SQL Server Native Client 11.0' class ConnectionPool extends BaseConnectionPool { _poolCreate () { return new shared.Promise((resolve, reject) => { this.config.requestTimeout = this.config.requestTimeout ?? this.config.timeout ?? 15000 const cfg = { conn_str: this.config.connectionString, conn_timeout: (this.config.connectionTimeout ?? this.config.timeout ?? 15000) / 1000 } if (!this.config.connectionString) { cfg.conn_str = build({ Driver: this.config.driver && this.config.driver !== 'msnodesqlv8' ? this.config.driver : DEFAULT_CONNECTION_DRIVER, Server: this.config.options.instanceName ? `${this.config.server}\\${this.config.options.instanceName}` : `${this.config.server},${this.config.port}`, Database: this.config.database, Uid: this.config.user, Pwd: this.config.password, Trusted_Connection: !!this.config.options.trustedConnection, Encrypt: !!this.config.options.encrypt }) } const connedtionId = INCREMENT.Connection++ debug('pool(%d): connection #%d created', IDS.get(this), connedtionId) debug('connection(%d): establishing', connedtionId) if (typeof this.config.beforeConnect === 'function') { this.config.beforeConnect(cfg) } msnodesql.open(cfg, (err, tds) => { if (err) { let customErr = err?.details if (customErr instanceof Array && (customErr = customErr.at(-1))) { err.message = customErr.message err.code = customErr.code } err = new ConnectionError(err.message, err.code) return reject(err) } tds.setUseNumericString(true) IDS.add(tds, 'Connection', connedtionId) tds.setUseUTC(this.config.options.useUTC) debug('connection(%d): established', IDS.get(tds)) publish(CHANNELS.CONNECTION_CREATE, () => ({ connectionId: IDS.get(tds), poolId: IDS.get(this), server: this.config.server, database: this.config.database })) resolve(tds) }) }) } _poolValidate (tds) { if (tds && !tds.hasError) { return !this.config.validateConnection || new shared.Promise((resolve) => { tds.query('SELECT 1;', (err) => { resolve(!err) }) }) } return false } _poolDestroy (tds) { return new shared.Promise((resolve, reject) => { if (!tds) { resolve() return } const connectionId = IDS.get(tds) const poolId = IDS.get(this) debug('connection(%d): destroying', connectionId) tds.close(() => { debug('connection(%d): destroyed', connectionId) publish(CHANNELS.CONNECTION_DESTROY, () => ({ connectionId, poolId })) resolve() }) }) } } module.exports = ConnectionPool