diff --git a/packages/cubejs-databricks-jdbc-driver/src/DatabricksDriver.ts b/packages/cubejs-databricks-jdbc-driver/src/DatabricksDriver.ts index b64aed783af68..d071a41be4ed3 100644 --- a/packages/cubejs-databricks-jdbc-driver/src/DatabricksDriver.ts +++ b/packages/cubejs-databricks-jdbc-driver/src/DatabricksDriver.ts @@ -8,8 +8,6 @@ import { getEnv, assertDataSource, } from '@cubejs-backend/shared'; -import fs from 'fs'; -import path from 'path'; import { S3, GetObjectCommand } from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; import { @@ -25,7 +23,7 @@ import { JDBCDriverConfiguration, } from '@cubejs-backend/jdbc-driver'; import { DatabricksQuery } from './DatabricksQuery'; -import { downloadJDBCDriver } from './installer'; +import { resolveJDBCDriver, extractUidFromJdbcUrl } from './helpers'; export type DatabricksDriverConfiguration = JDBCDriverConfiguration & { @@ -91,16 +89,6 @@ export type DatabricksDriverConfiguration = JDBCDriverConfiguration & token?: string, }; -async function fileExistsOr( - fsPath: string, - fn: () => Promise, -): Promise { - if (fs.existsSync(fsPath)) { - return fsPath; - } - return fn(); -} - type ShowTableRow = { database: string, tableName: string, @@ -115,25 +103,6 @@ const DatabricksToGenericType: Record = { 'decimal(10,0)': 'bigint', }; -async function resolveJDBCDriver(): Promise { - return fileExistsOr( - path.join(process.cwd(), 'DatabricksJDBC42.jar'), - async () => fileExistsOr( - path.join(__dirname, '..', 'download', 'DatabricksJDBC42.jar'), - async () => { - const pathOrNull = await downloadJDBCDriver(); - if (pathOrNull) { - return pathOrNull; - } - throw new Error( - 'Please download and place DatabricksJDBC42.jar inside your ' + - 'project directory' - ); - } - ) - ); -} - /** * Databricks driver class. */ @@ -202,6 +171,7 @@ export class DatabricksDriver extends JDBCDriver { drivername: 'com.databricks.client.jdbc.Driver', customClassPath: undefined, properties: { + UID: extractUidFromJdbcUrl(url), // PWD-parameter passed to the connection string has higher priority, // so we can set this one to an empty string to avoid a Java error. PWD: diff --git a/packages/cubejs-databricks-jdbc-driver/src/helpers.ts b/packages/cubejs-databricks-jdbc-driver/src/helpers.ts new file mode 100644 index 0000000000000..b864d07b4c007 --- /dev/null +++ b/packages/cubejs-databricks-jdbc-driver/src/helpers.ts @@ -0,0 +1,40 @@ +import fs from 'fs'; +import path from 'path'; + +import { downloadJDBCDriver } from './installer'; + +async function fileExistsOr( + fsPath: string, + fn: () => Promise, +): Promise { + if (fs.existsSync(fsPath)) { + return fsPath; + } + return fn(); +} + +export async function resolveJDBCDriver(): Promise { + return fileExistsOr( + path.join(process.cwd(), 'DatabricksJDBC42.jar'), + async () => fileExistsOr( + path.join(__dirname, '..', 'download', 'DatabricksJDBC42.jar'), + async () => { + const pathOrNull = await downloadJDBCDriver(); + if (pathOrNull) { + return pathOrNull; + } + throw new Error( + 'Please download and place DatabricksJDBC42.jar inside your ' + + 'project directory' + ); + } + ) + ); +} + +export function extractUidFromJdbcUrl(jdbcUrl: string): string { + const { pathname } = new URL(jdbcUrl); + const [_, ...params] = pathname.split(';'); + const searchParams = new URLSearchParams(params.join('&')); + return searchParams.get('UID') || 'token'; +}