@memberjunction/external-data-source-databricks 0.0.0 → 6.1.0-edge.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -0
- package/dist/DatabricksExternalDataSourceDriver.d.ts +34 -0
- package/dist/DatabricksExternalDataSourceDriver.d.ts.map +1 -0
- package/dist/DatabricksExternalDataSourceDriver.js +310 -0
- package/dist/DatabricksExternalDataSourceDriver.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -8
- package/README.md +0 -45
package/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 MemberJunction
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { UserInfo, ExternalSchemaDescriptor } from '@memberjunction/core';
|
|
2
|
+
import { MJExternalDataSourceEntity } from '@memberjunction/core-entities';
|
|
3
|
+
import { BaseSqlExternalDataSourceDriver, ExternalConnectionTestResult, ExternalViewParams, ExternalViewResult, ExternalQueryParameter, ExternalQueryResult, ExternalRow } from '@memberjunction/external-data-sources';
|
|
4
|
+
import type { DBSQLClient } from '@databricks/sql';
|
|
5
|
+
type DatabricksClient = DBSQLClient;
|
|
6
|
+
export declare class DatabricksExternalDataSourceDriver extends BaseSqlExternalDataSourceDriver<DatabricksClient> {
|
|
7
|
+
private clients;
|
|
8
|
+
protected getConnection(dataSource: MJExternalDataSourceEntity, contextUser?: UserInfo): Promise<DatabricksClient>;
|
|
9
|
+
private createClient;
|
|
10
|
+
private buildConnectOptions;
|
|
11
|
+
protected peekConnection(dataSourceId: string): unknown;
|
|
12
|
+
protected invalidateConnection(dataSourceId: string, expectedIdentity?: unknown): Promise<void>;
|
|
13
|
+
protected isAuthError(e: unknown): boolean;
|
|
14
|
+
private execute;
|
|
15
|
+
TestConnection(dataSource: MJExternalDataSourceEntity, contextUser?: UserInfo): Promise<ExternalConnectionTestResult>;
|
|
16
|
+
RunView<TRow extends ExternalRow = ExternalRow>(dataSource: MJExternalDataSourceEntity, params: ExternalViewParams, contextUser?: UserInfo): Promise<ExternalViewResult<TRow>>;
|
|
17
|
+
LoadSingle<TRow extends ExternalRow = ExternalRow>(dataSource: MJExternalDataSourceEntity, objectName: string, primaryKeys: readonly ExternalQueryParameter[], contextUser?: UserInfo): Promise<TRow | null>;
|
|
18
|
+
RunNativeQuery<TRow extends ExternalRow = ExternalRow>(dataSource: MJExternalDataSourceEntity, queryText: string, params: ExternalQueryParameter[] | undefined, contextUser?: UserInfo): Promise<ExternalQueryResult<TRow>>;
|
|
19
|
+
IntrospectSchema(dataSource: MJExternalDataSourceEntity, schemaName: string | undefined, contextUser?: UserInfo): Promise<ExternalSchemaDescriptor>;
|
|
20
|
+
private loadPrimaryKeys;
|
|
21
|
+
private loadForeignKeys;
|
|
22
|
+
Close(): Promise<void>;
|
|
23
|
+
protected quoteIdent(name: string): string;
|
|
24
|
+
protected orderAndPageClause(params: ExternalViewParams): string;
|
|
25
|
+
protected normalizeForReadOnlyParse(sql: string): string;
|
|
26
|
+
private buildPrimaryKeyNamed;
|
|
27
|
+
private maybeCount;
|
|
28
|
+
private resolveCatalog;
|
|
29
|
+
private sessionInitFor;
|
|
30
|
+
private informationSchemaRef;
|
|
31
|
+
private assembleSchema;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=DatabricksExternalDataSourceDriver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatabricksExternalDataSourceDriver.d.ts","sourceRoot":"","sources":["../src/DatabricksExternalDataSourceDriver.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EAER,wBAAwB,EAGzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAEL,+BAA+B,EAC/B,4BAA4B,EAC5B,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EAEZ,MAAM,uCAAuC,CAAC;AAM/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAMnD,KAAK,gBAAgB,GAAG,WAAW,CAAC;AAoDpC,qBACa,kCAAmC,SAAQ,+BAA+B,CAAC,gBAAgB,CAAC;IAYvG,OAAO,CAAC,OAAO,CAAgD;cAE/C,aAAa,CAAC,UAAU,EAAE,0BAA0B,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAiB1G,YAAY;IAoB1B,OAAO,CAAC,mBAAmB;IAkB3B,SAAS,CAAC,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;cAIvC,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBrG,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO;YAsB5B,OAAO;IAoBR,cAAc,CAAC,UAAU,EAAE,0BAA0B,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAWrH,OAAO,CAAC,IAAI,SAAS,WAAW,GAAG,WAAW,EACzD,UAAU,EAAE,0BAA0B,EACtC,MAAM,EAAE,kBAAkB,EAC1B,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAgBvB,UAAU,CAAC,IAAI,SAAS,WAAW,GAAG,WAAW,EAC5D,UAAU,EAAE,0BAA0B,EACtC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,SAAS,sBAAsB,EAAE,EAC9C,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAWV,cAAc,CAAC,IAAI,SAAS,WAAW,GAAG,WAAW,EAChE,UAAU,EAAE,0BAA0B,EACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,sBAAsB,EAAE,GAAG,SAAS,EAC5C,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAoBxB,gBAAgB,CAC3B,UAAU,EAAE,0BAA0B,EACtC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,wBAAwB,CAAC;YA8BtB,eAAe;YA4Bf,eAAe;IAwChB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAanC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAK1C,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM;IA8BhE,SAAS,CAAC,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOxD,OAAO,CAAC,oBAAoB;YAOd,UAAU;IAYxB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,cAAc;CA0BvB"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
8
|
+
import { BaseExternalDataSourceDriver, BaseSqlExternalDataSourceDriver, } from '@memberjunction/external-data-sources';
|
|
9
|
+
let databricksSdkPromise;
|
|
10
|
+
function loadDatabricksSdk() {
|
|
11
|
+
if (!databricksSdkPromise) {
|
|
12
|
+
databricksSdkPromise = import('@databricks/sql');
|
|
13
|
+
}
|
|
14
|
+
return databricksSdkPromise;
|
|
15
|
+
}
|
|
16
|
+
let DatabricksExternalDataSourceDriver = class DatabricksExternalDataSourceDriver extends BaseSqlExternalDataSourceDriver {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
19
|
+
this.clients = new Map();
|
|
20
|
+
}
|
|
21
|
+
async getConnection(dataSource, contextUser) {
|
|
22
|
+
const existing = this.clients.get(dataSource.ID);
|
|
23
|
+
if (existing) {
|
|
24
|
+
return existing;
|
|
25
|
+
}
|
|
26
|
+
const connecting = this.createClient(dataSource, contextUser);
|
|
27
|
+
this.clients.set(dataSource.ID, connecting);
|
|
28
|
+
connecting.catch(() => {
|
|
29
|
+
if (this.clients.get(dataSource.ID) === connecting) {
|
|
30
|
+
this.clients.delete(dataSource.ID);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return connecting;
|
|
34
|
+
}
|
|
35
|
+
async createClient(dataSource, contextUser) {
|
|
36
|
+
const config = this.parseConnectionConfig(dataSource);
|
|
37
|
+
if (!config.serverHostname || !config.httpPath) {
|
|
38
|
+
throw new Error(`ExternalDataSource '${dataSource.Name}' ConnectionConfig must include 'serverHostname' and 'httpPath'.`);
|
|
39
|
+
}
|
|
40
|
+
const cred = await this.resolveCredential(dataSource, contextUser);
|
|
41
|
+
const connectOptions = this.buildConnectOptions(dataSource, config, cred?.values);
|
|
42
|
+
const sdkModule = await loadDatabricksSdk();
|
|
43
|
+
const sdk = sdkModule.default ?? sdkModule;
|
|
44
|
+
const client = new sdk.DBSQLClient();
|
|
45
|
+
await client.connect(connectOptions);
|
|
46
|
+
return client;
|
|
47
|
+
}
|
|
48
|
+
buildConnectOptions(dataSource, config, values) {
|
|
49
|
+
const base = { host: config.serverHostname, path: config.httpPath, preserveBigNumericPrecision: true };
|
|
50
|
+
if (values?.clientId && values?.clientSecret) {
|
|
51
|
+
return { ...base, authType: 'databricks-oauth', oauthClientId: values.clientId, oauthClientSecret: values.clientSecret };
|
|
52
|
+
}
|
|
53
|
+
const token = values?.token;
|
|
54
|
+
if (!token) {
|
|
55
|
+
throw new Error(`ExternalDataSource '${dataSource.Name}' requires a Databricks credential (a PAT 'token', or OAuth 'clientId'+'clientSecret').`);
|
|
56
|
+
}
|
|
57
|
+
return { ...base, authType: 'access-token', token };
|
|
58
|
+
}
|
|
59
|
+
peekConnection(dataSourceId) {
|
|
60
|
+
return this.clients.get(dataSourceId);
|
|
61
|
+
}
|
|
62
|
+
async invalidateConnection(dataSourceId, expectedIdentity) {
|
|
63
|
+
const existing = this.clients.get(dataSourceId);
|
|
64
|
+
if (expectedIdentity !== undefined && existing !== expectedIdentity) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (existing) {
|
|
68
|
+
this.clients.delete(dataSourceId);
|
|
69
|
+
try {
|
|
70
|
+
const client = await existing;
|
|
71
|
+
await client.close();
|
|
72
|
+
}
|
|
73
|
+
catch { }
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
isAuthError(e) {
|
|
77
|
+
if (super.isAuthError(e)) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
const err = e;
|
|
81
|
+
const status = String(err?.statusCode ?? err?.status ?? '');
|
|
82
|
+
const msg = (e instanceof Error ? e.message : String(e)).toLowerCase();
|
|
83
|
+
return (status === '401' ||
|
|
84
|
+
msg.includes('invalid access token') ||
|
|
85
|
+
msg.includes('token is expired') ||
|
|
86
|
+
msg.includes('token expired') ||
|
|
87
|
+
msg.includes('invalid_client'));
|
|
88
|
+
}
|
|
89
|
+
async execute(client, statement, namedParameters, sessionInit) {
|
|
90
|
+
const session = await client.openSession(sessionInit);
|
|
91
|
+
try {
|
|
92
|
+
const operation = await session.executeStatement(statement, { runAsync: true, ...(namedParameters ? { namedParameters } : {}) });
|
|
93
|
+
try {
|
|
94
|
+
const rows = await operation.fetchAll();
|
|
95
|
+
return (rows ?? []);
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
await operation.close().catch(() => { });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
await session.close().catch(() => { });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async TestConnection(dataSource, contextUser) {
|
|
106
|
+
const start = Date.now();
|
|
107
|
+
try {
|
|
108
|
+
const client = await this.getConnection(dataSource, contextUser);
|
|
109
|
+
await this.execute(client, 'SELECT 1 AS ok');
|
|
110
|
+
return { success: true, message: 'Connection successful.', testedAt: new Date(), latencyMs: Date.now() - start };
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
return { success: false, message: this.errorText(e), testedAt: new Date(), latencyMs: Date.now() - start };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async RunView(dataSource, params, contextUser) {
|
|
117
|
+
const start = Date.now();
|
|
118
|
+
try {
|
|
119
|
+
return await this.withConnectionRetry(dataSource, async () => {
|
|
120
|
+
const client = await this.getConnection(dataSource, contextUser);
|
|
121
|
+
const target = this.qualifyObject(dataSource, params.objectName);
|
|
122
|
+
const sessionInit = this.sessionInitFor(dataSource);
|
|
123
|
+
const rows = await this.execute(client, this.buildSelectSql(target, params), undefined, sessionInit);
|
|
124
|
+
const totalRowCount = await this.maybeCount(client, target, params, sessionInit);
|
|
125
|
+
return { success: true, rows: this.normalizeRows(rows), totalRowCount, executionTimeMs: Date.now() - start };
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
return { success: false, rows: [], errorMessage: this.errorText(e), executionTimeMs: Date.now() - start };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async LoadSingle(dataSource, objectName, primaryKeys, contextUser) {
|
|
133
|
+
return await this.withConnectionRetry(dataSource, async () => {
|
|
134
|
+
const client = await this.getConnection(dataSource, contextUser);
|
|
135
|
+
const target = this.qualifyObject(dataSource, objectName);
|
|
136
|
+
const { clause, named } = this.buildPrimaryKeyNamed(primaryKeys);
|
|
137
|
+
const rows = await this.execute(client, `SELECT * FROM ${target} WHERE ${clause} LIMIT 1`, named, this.sessionInitFor(dataSource));
|
|
138
|
+
return this.normalizeRows(rows)[0] ?? null;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
async RunNativeQuery(dataSource, queryText, params, contextUser) {
|
|
142
|
+
const start = Date.now();
|
|
143
|
+
try {
|
|
144
|
+
this.screenReadOnlyNativeQuery(queryText);
|
|
145
|
+
return await this.withConnectionRetry(dataSource, async () => {
|
|
146
|
+
const client = await this.getConnection(dataSource, contextUser);
|
|
147
|
+
const named = params?.length
|
|
148
|
+
? Object.fromEntries(params.map((p) => [p.name, p.value]))
|
|
149
|
+
: undefined;
|
|
150
|
+
const rows = await this.execute(client, queryText, named, this.sessionInitFor(dataSource));
|
|
151
|
+
return { success: true, rows: this.normalizeRows(rows), rowCount: rows.length, executionTimeMs: Date.now() - start };
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
return { success: false, rows: [], rowCount: 0, errorMessage: this.errorText(e), executionTimeMs: Date.now() - start };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async IntrospectSchema(dataSource, schemaName, contextUser) {
|
|
159
|
+
const client = await this.getConnection(dataSource, contextUser);
|
|
160
|
+
const catalog = this.resolveCatalog(dataSource);
|
|
161
|
+
const schema = schemaName ?? dataSource.DefaultSchema ?? 'default';
|
|
162
|
+
const infoSchema = this.informationSchemaRef(catalog);
|
|
163
|
+
const tables = await this.execute(client, `SELECT table_name, table_type FROM ${infoSchema}.tables WHERE table_schema = :schema ORDER BY table_name`, { schema });
|
|
164
|
+
const columns = await this.execute(client, `SELECT table_name, column_name, full_data_type, is_nullable FROM ${infoSchema}.columns
|
|
165
|
+
WHERE table_schema = :schema ORDER BY table_name, ordinal_position`, { schema });
|
|
166
|
+
const primaryKeys = await this.loadPrimaryKeys(client, infoSchema, schema);
|
|
167
|
+
const relationships = await this.loadForeignKeys(client, infoSchema, schema);
|
|
168
|
+
return {
|
|
169
|
+
Database: catalog ?? undefined,
|
|
170
|
+
Objects: this.assembleSchema(schema, tables, columns, primaryKeys, relationships),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
async loadPrimaryKeys(client, infoSchema, schema) {
|
|
174
|
+
try {
|
|
175
|
+
const rows = await this.execute(client, `SELECT kcu.table_name AS table_name, kcu.column_name AS column_name
|
|
176
|
+
FROM ${infoSchema}.table_constraints tc
|
|
177
|
+
JOIN ${infoSchema}.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name
|
|
178
|
+
WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_schema = :schema`, { schema });
|
|
179
|
+
const set = new Set();
|
|
180
|
+
for (const r of rows) {
|
|
181
|
+
if (r.table_name && r.column_name) {
|
|
182
|
+
set.add(`${r.table_name}.${r.column_name}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return set;
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return new Set();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async loadForeignKeys(client, infoSchema, schema) {
|
|
192
|
+
try {
|
|
193
|
+
const rows = await this.execute(client, `SELECT tc.constraint_name AS constraint_name,
|
|
194
|
+
kcu.table_name AS table_name,
|
|
195
|
+
kcu.column_name AS column_name,
|
|
196
|
+
ccu.table_schema AS referenced_schema,
|
|
197
|
+
ccu.table_name AS referenced_table,
|
|
198
|
+
ccu.column_name AS referenced_column
|
|
199
|
+
FROM ${infoSchema}.table_constraints tc
|
|
200
|
+
JOIN ${infoSchema}.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name
|
|
201
|
+
JOIN ${infoSchema}.referential_constraints rc ON tc.constraint_name = rc.constraint_name
|
|
202
|
+
JOIN ${infoSchema}.constraint_column_usage ccu ON rc.unique_constraint_name = ccu.constraint_name
|
|
203
|
+
WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = :schema
|
|
204
|
+
ORDER BY tc.constraint_name`, { schema });
|
|
205
|
+
const fkRows = rows.map((r) => ({
|
|
206
|
+
constraint_name: r.constraint_name,
|
|
207
|
+
table_name: r.table_name,
|
|
208
|
+
column_name: r.column_name,
|
|
209
|
+
referenced_schema: r.referenced_schema,
|
|
210
|
+
referenced_table: r.referenced_table,
|
|
211
|
+
referenced_column: r.referenced_column,
|
|
212
|
+
}));
|
|
213
|
+
return this.groupForeignKeys(fkRows);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return new Map();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async Close() {
|
|
220
|
+
const inFlight = Array.from(this.clients.values());
|
|
221
|
+
this.clients.clear();
|
|
222
|
+
await Promise.all(inFlight.map(async (c) => {
|
|
223
|
+
try {
|
|
224
|
+
const client = await c;
|
|
225
|
+
await client.close();
|
|
226
|
+
}
|
|
227
|
+
catch { }
|
|
228
|
+
}));
|
|
229
|
+
}
|
|
230
|
+
quoteIdent(name) {
|
|
231
|
+
return `\`${name.replace(/`/g, '``')}\``;
|
|
232
|
+
}
|
|
233
|
+
orderAndPageClause(params) {
|
|
234
|
+
let sql = '';
|
|
235
|
+
if (params.orderBy) {
|
|
236
|
+
sql += ` ORDER BY ${params.orderBy}`;
|
|
237
|
+
}
|
|
238
|
+
if (params.maxRows != null) {
|
|
239
|
+
sql += ` LIMIT ${Number(params.maxRows)}`;
|
|
240
|
+
}
|
|
241
|
+
if (params.offset != null) {
|
|
242
|
+
if (params.maxRows == null) {
|
|
243
|
+
sql += ` LIMIT ALL`;
|
|
244
|
+
}
|
|
245
|
+
sql += ` OFFSET ${Number(params.offset)}`;
|
|
246
|
+
}
|
|
247
|
+
return sql;
|
|
248
|
+
}
|
|
249
|
+
normalizeForReadOnlyParse(sql) {
|
|
250
|
+
return sql.replace(/(?<!:):[A-Za-z_][A-Za-z0-9_]*/g, '1');
|
|
251
|
+
}
|
|
252
|
+
buildPrimaryKeyNamed(primaryKeys) {
|
|
253
|
+
const { clause, values } = this.buildPrimaryKeyWhere(primaryKeys, (i) => `:pk${i}`);
|
|
254
|
+
const named = {};
|
|
255
|
+
values.forEach((v, i) => { named[`pk${i}`] = v; });
|
|
256
|
+
return { clause, named };
|
|
257
|
+
}
|
|
258
|
+
async maybeCount(client, target, params, sessionInit) {
|
|
259
|
+
if (params.maxRows == null) {
|
|
260
|
+
return undefined;
|
|
261
|
+
}
|
|
262
|
+
const rows = await this.execute(client, this.buildCountSql(target, params), undefined, sessionInit);
|
|
263
|
+
const first = rows[0] ?? {};
|
|
264
|
+
const val = first.cnt ?? first.CNT ?? Object.values(first)[0];
|
|
265
|
+
return Number(val ?? 0);
|
|
266
|
+
}
|
|
267
|
+
resolveCatalog(dataSource) {
|
|
268
|
+
const config = this.parseConnectionConfig(dataSource);
|
|
269
|
+
return config.catalog ?? dataSource.DefaultDatabase ?? undefined;
|
|
270
|
+
}
|
|
271
|
+
sessionInitFor(dataSource) {
|
|
272
|
+
const init = {};
|
|
273
|
+
const catalog = this.resolveCatalog(dataSource);
|
|
274
|
+
if (catalog) {
|
|
275
|
+
init.initialCatalog = catalog;
|
|
276
|
+
}
|
|
277
|
+
if (dataSource.DefaultSchema) {
|
|
278
|
+
init.initialSchema = dataSource.DefaultSchema;
|
|
279
|
+
}
|
|
280
|
+
return init;
|
|
281
|
+
}
|
|
282
|
+
informationSchemaRef(catalog) {
|
|
283
|
+
return catalog ? `${this.quoteIdent(catalog)}.information_schema` : `information_schema`;
|
|
284
|
+
}
|
|
285
|
+
assembleSchema(schema, tableRows, columnRows, primaryKeys, relationships) {
|
|
286
|
+
const columnsByTable = new Map();
|
|
287
|
+
for (const c of columnRows) {
|
|
288
|
+
const list = columnsByTable.get(c.table_name) ?? [];
|
|
289
|
+
list.push({
|
|
290
|
+
Name: c.column_name,
|
|
291
|
+
NativeType: c.full_data_type,
|
|
292
|
+
Nullable: (c.is_nullable ?? '').toUpperCase() === 'YES',
|
|
293
|
+
IsPrimaryKey: primaryKeys.has(`${c.table_name}.${c.column_name}`),
|
|
294
|
+
});
|
|
295
|
+
columnsByTable.set(c.table_name, list);
|
|
296
|
+
}
|
|
297
|
+
return tableRows.map((t) => ({
|
|
298
|
+
Name: t.table_name,
|
|
299
|
+
ObjectType: this.mapObjectType(t.table_type),
|
|
300
|
+
Schema: schema,
|
|
301
|
+
Columns: columnsByTable.get(t.table_name) ?? [],
|
|
302
|
+
Relationships: relationships.get(t.table_name),
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
DatabricksExternalDataSourceDriver = __decorate([
|
|
307
|
+
RegisterClass(BaseExternalDataSourceDriver, 'DatabricksExternalDriver')
|
|
308
|
+
], DatabricksExternalDataSourceDriver);
|
|
309
|
+
export { DatabricksExternalDataSourceDriver };
|
|
310
|
+
//# sourceMappingURL=DatabricksExternalDataSourceDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatabricksExternalDataSourceDriver.js","sourceRoot":"","sources":["../src/DatabricksExternalDataSourceDriver.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,sCAAsC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,sCAAsC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/external-data-source-databricks",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
"version": "6.1.0-edge.2",
|
|
4
|
+
"description": "Databricks SQL Warehouse driver for the MemberJunction External Data Sources primitive. Registers a BaseExternalDataSourceDriver implementation via @RegisterClass(BaseExternalDataSourceDriver, 'DatabricksExternalDriver') using the official @databricks/sql SDK for live, read-only proxied access to a Databricks SQL warehouse over Unity Catalog.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"/dist"
|
|
10
|
+
],
|
|
11
|
+
"author": "MemberJunction.com",
|
|
12
|
+
"license": "ISC",
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@memberjunction/core": "6.1.0-edge.2",
|
|
15
|
+
"@memberjunction/global": "6.1.0-edge.2",
|
|
16
|
+
"@memberjunction/core-entities": "6.1.0-edge.2",
|
|
17
|
+
"@memberjunction/external-data-sources": "6.1.0-edge.2"
|
|
18
|
+
},
|
|
19
|
+
"peerDependencies": {
|
|
20
|
+
"@databricks/sql": "^1.8.0"
|
|
21
|
+
},
|
|
22
|
+
"peerDependenciesMeta": {
|
|
23
|
+
"@databricks/sql": {
|
|
24
|
+
"optional": true
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@databricks/sql": "^1.8.0",
|
|
29
|
+
"@types/node": "24.10.11",
|
|
30
|
+
"tsc-alias": "^1.8.16",
|
|
31
|
+
"ts-node-dev": "^2.0.0",
|
|
32
|
+
"vitest": "^3.1.1",
|
|
33
|
+
"typescript": "^5.9.3"
|
|
34
|
+
},
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://github.com/MemberJunction/MJ"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc && tsc-alias -f",
|
|
41
|
+
"test": "vitest run"
|
|
42
|
+
}
|
|
43
|
+
}
|
package/README.md
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# @memberjunction/external-data-source-databricks
|
|
2
|
-
|
|
3
|
-
## ⚠️ IMPORTANT NOTICE ⚠️
|
|
4
|
-
|
|
5
|
-
**This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
|
|
6
|
-
|
|
7
|
-
This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
|
|
8
|
-
|
|
9
|
-
## Purpose
|
|
10
|
-
|
|
11
|
-
This package exists to:
|
|
12
|
-
1. Configure OIDC trusted publishing for the package name `@memberjunction/external-data-source-databricks`
|
|
13
|
-
2. Enable secure, token-less publishing from CI/CD workflows
|
|
14
|
-
3. Establish provenance for packages published under this name
|
|
15
|
-
|
|
16
|
-
## What is OIDC Trusted Publishing?
|
|
17
|
-
|
|
18
|
-
OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
|
|
19
|
-
|
|
20
|
-
## Setup Instructions
|
|
21
|
-
|
|
22
|
-
To properly configure OIDC trusted publishing for this package:
|
|
23
|
-
|
|
24
|
-
1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
|
|
25
|
-
2. Configure the trusted publisher (e.g., GitHub Actions)
|
|
26
|
-
3. Specify the repository and workflow that should be allowed to publish
|
|
27
|
-
4. Use the configured workflow to publish your actual package
|
|
28
|
-
|
|
29
|
-
## DO NOT USE THIS PACKAGE
|
|
30
|
-
|
|
31
|
-
This package is a placeholder for OIDC configuration only. It:
|
|
32
|
-
- Contains no executable code
|
|
33
|
-
- Provides no functionality
|
|
34
|
-
- Should not be installed as a dependency
|
|
35
|
-
- Exists only for administrative purposes
|
|
36
|
-
|
|
37
|
-
## More Information
|
|
38
|
-
|
|
39
|
-
For more details about npm's trusted publishing feature, see:
|
|
40
|
-
- [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
|
|
41
|
-
- [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
**Maintained for OIDC setup purposes only**
|