From 71357e2a45927695c3c3ebb7ed4a42d868976c75 Mon Sep 17 00:00:00 2001 From: Dan Hensby Date: Tue, 15 Aug 2023 22:09:30 +0200 Subject: [PATCH] feat: use @tediousjs/connection-string to build msnodesqlv8 connection string --- lib/msnodesqlv8/connection-pool.js | 43 +++++++++--------------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/lib/msnodesqlv8/connection-pool.js b/lib/msnodesqlv8/connection-pool.js index 217781f4..7ffa7012 100644 --- a/lib/msnodesqlv8/connection-pool.js +++ b/lib/msnodesqlv8/connection-pool.js @@ -7,48 +7,31 @@ const { IDS, INCREMENT } = require('../utils') const shared = require('../shared') const ConnectionError = require('../error/connection-error') const { platform } = require('os') +const { buildConnectionString } = require('@tediousjs/connection-string') const CONNECTION_DRIVER = ['darwin', 'linux'].includes(platform()) ? 'ODBC Driver 17 for SQL Server' : 'SQL Server Native Client 11.0' -const CONNECTION_STRING_PORT = `Driver=${CONNECTION_DRIVER};Server=#{server},#{port};Database=#{database};Uid=#{user};Pwd=#{password};Trusted_Connection=#{trusted};Encrypt=#{encrypt};` -const CONNECTION_STRING_NAMED_INSTANCE = `Driver=${CONNECTION_DRIVER};Server=#{server}\\#{instance};Database=#{database};Uid=#{user};Pwd=#{password};Trusted_Connection=#{trusted};Encrypt=#{encrypt};` class ConnectionPool extends BaseConnectionPool { _poolCreate () { return new shared.Promise((resolve, reject) => { - let defaultConnectionString = CONNECTION_STRING_PORT - - if (this.config.options.instanceName != null) { - defaultConnectionString = CONNECTION_STRING_NAMED_INSTANCE - } - this.config.requestTimeout = this.config.requestTimeout ?? this.config.timeout ?? 15000 const cfg = { - conn_str: this.config.connectionString || defaultConnectionString, + conn_str: this.config.connectionString, conn_timeout: (this.config.connectionTimeout ?? this.config.timeout ?? 15000) / 1000 } - cfg.conn_str = cfg.conn_str.replace(/#{([^}]*)}/g, (p) => { - const key = p.substr(2, p.length - 3) - - switch (key) { - case 'instance': - return this.config.options.instanceName - case 'trusted': - return this.config.options.trustedConnection ? 'Yes' : 'No' - case 'encrypt': - return this.config.options.encrypt ? 'Yes' : 'No' - default: { - let val = this.config[key] || '' - // quote strings that contain '{' or '}' but not ones that start and end with them (assume they are already quoted) - if (val && typeof val === 'string' && !(val.startsWith('{') && val.endsWith('}')) && (val.indexOf('{') !== -1 || val.indexOf('}') !== -1)) { - // quote values in `{}` and escape any existing `}` chars - val = `{${val.replace(/}/g, '}}')}}` - } - return val - } - } - }) + if (!this.config.connectionString) { + cfg.conn_str = buildConnectionString({ + Driver: CONNECTION_DRIVER, + Server: this.config.options.instanceName ? `${this.config.server}\\${this.config.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)