From 65fb32364f7fe0d62d21e38f3d946625558c9301 Mon Sep 17 00:00:00 2001 From: chulanovskyi-bs <56116665+chulanovskyi-bs@users.noreply.github.com> Date: Fri, 5 Apr 2024 12:58:31 +0300 Subject: [PATCH] fix: added missing api method `parseConnectionString` (#61) --- reverse_engineering/api.js | 42 +++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 45068a4..9b15d83 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -1,5 +1,6 @@ 'use strict'; +const connectionStringParser = require('mssql/lib/connectionstring'); const { getClient, setClient, clearClient, getConnectionInfo } = require('./connectionState'); const { getObjectsFromDatabase } = require('./databaseService/databaseService'); const { @@ -118,5 +119,44 @@ module.exports = { logger.log('error', { message: error.message, stack: error.stack, error }, 'Reverse-engineering process failed'); callback({ message: error.message, stack: error.stack }) } - } + }, + + parseConnectionString({ connectionString = '' }, logger, callback) { + try { + const parsedConnectionStringData = connectionStringParser.resolve(connectionString); + + // for better UX. In Synapse UI the connection string may start from the "jdbc:sqlserver://...", + // which is not handled by the mssql lib parser + if (!parsedConnectionStringData.server) { + const hostRegExp = /\/\/(.*?):\d+/; + const match = connectionString.match(hostRegExp); + if (match) { + parsedConnectionStringData.server = match[1]; + } + } + + // for better UX. Mssql lib is trying to pick the user from other parsed props: + // parsed.uid || parsed.uid || parsed['user id'] + if (!parsedConnectionStringData.user) { + const userRegExp = /user=(.*?);/; + const match = connectionString.match(userRegExp); + if (match) { + parsedConnectionStringData.user = match[1]; + } + } + + const parsedData = { + databaseName: parsedConnectionStringData.database, + host: parsedConnectionStringData.server, + port: parsedConnectionStringData.port, + authMethod: 'Username / Password', + userName: parsedConnectionStringData.user, + userPassword: parsedConnectionStringData.password + }; + callback(null, { parsedData }); + } catch(err) { + logger.log('error', { message: err.message, stack: err.stack, err }, 'Parsing connection string failed'); + callback({ message: err.message, stack: err.stack }); + } + }, };