Skip to content

Commit

Permalink
feat: use @tediousjs/connection-string to build msnodesqlv8 connectio…
Browse files Browse the repository at this point in the history
…n string
  • Loading branch information
dhensby committed Aug 15, 2023
1 parent 71434be commit 71357e2
Showing 1 changed file with 13 additions and 30 deletions.
43 changes: 13 additions & 30 deletions lib/msnodesqlv8/connection-pool.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 71357e2

Please sign in to comment.