From 446be9b3af9496d2f3e4fe7a065fb5e42c81f307 Mon Sep 17 00:00:00 2001 From: mertmit Date: Sun, 21 Aug 2022 17:12:12 +0300 Subject: [PATCH] feat: support custom parameters on jdbc url Signed-off-by: mertmit --- .../nocodb/src/lib/utils/NcConfigFactory.ts | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/packages/nocodb/src/lib/utils/NcConfigFactory.ts b/packages/nocodb/src/lib/utils/NcConfigFactory.ts index cf0b0efebd..2ecd8146f1 100644 --- a/packages/nocodb/src/lib/utils/NcConfigFactory.ts +++ b/packages/nocodb/src/lib/utils/NcConfigFactory.ts @@ -21,6 +21,7 @@ const { const driverClientMapping = { mysql: 'mysql2', postgres: 'pg', + postgresql: 'pg', sqlite: 'sqlite3', mssql: 'mssql', }; @@ -636,16 +637,35 @@ export default class NcConfigFactory implements NcConfig { } public static extractXcUrlFromJdbc(url: string) { + // drop the jdbc prefix + if (url.startsWith('jdbc:')) { + url = url.substring(5); + } + const config = parseDbUrl(url); - const port = config.port || defaultClientPortMapping[config.driver]; - const res = `${driverClientMapping[config.driver] || config.driver}://${ - config.host - }${port ? `:${port}` : ''}?p=${config.password}&u=${config.user}&d=${ - config.database - }`; - if (config.search_path) { - return `${res}&search_path=${config.search_path}`; + + const parsedConfig: { driver?: string, host?: string, port?: string, database?: string, user?:string, password?: string } = {} + for (const [key, value] of Object.entries(config)) { + const fnd = knownQueryParams.find((param) => param.parameter === key || param.aliases.includes(key)) + if (fnd) { + parsedConfig[fnd.parameter] = value; + } else { + parsedConfig[key] = value; + } + } + + if (!parsedConfig?.port) parsedConfig.port = defaultClientPortMapping[parsedConfig.driver]; + + const { driver, host, port, database, user, password, ...extra } = parsedConfig; + + let extraParams = ''; + + for (const [key, value] of Object.entries(extra)) { + extraParams += `&${key}=${value}`; } + + const res = `${driverClientMapping[driver] || driver}://${host}${port ? `:${port}` : ''}?u=${user}&p=${password}&d=${database}${extraParams}`; + return res; }