@duckcodeailabs/dql-connectors 1.6.16 → 1.6.18
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/dist/drivers/athena.d.ts +17 -0
- package/dist/drivers/athena.d.ts.map +1 -0
- package/dist/drivers/athena.js +157 -0
- package/dist/drivers/athena.js.map +1 -0
- package/dist/drivers/bigquery.d.ts +14 -0
- package/dist/drivers/bigquery.d.ts.map +1 -0
- package/dist/drivers/bigquery.js +230 -0
- package/dist/drivers/bigquery.js.map +1 -0
- package/dist/drivers/clickhouse.d.ts +14 -0
- package/dist/drivers/clickhouse.d.ts.map +1 -0
- package/dist/drivers/clickhouse.js +103 -0
- package/dist/drivers/clickhouse.js.map +1 -0
- package/dist/drivers/fabric.d.ts +7 -0
- package/dist/drivers/fabric.d.ts.map +1 -0
- package/dist/drivers/fabric.js +12 -0
- package/dist/drivers/fabric.js.map +1 -0
- package/dist/drivers/mssql.d.ts +14 -0
- package/dist/drivers/mssql.d.ts.map +1 -0
- package/dist/drivers/mssql.js +164 -0
- package/dist/drivers/mssql.js.map +1 -0
- package/dist/drivers/mysql.d.ts +13 -0
- package/dist/drivers/mysql.d.ts.map +1 -0
- package/dist/drivers/mysql.js +136 -0
- package/dist/drivers/mysql.js.map +1 -0
- package/dist/drivers/postgresql.d.ts +13 -0
- package/dist/drivers/postgresql.d.ts.map +1 -0
- package/dist/drivers/postgresql.js +117 -0
- package/dist/drivers/postgresql.js.map +1 -0
- package/dist/drivers/redshift.d.ts +7 -0
- package/dist/drivers/redshift.d.ts.map +1 -0
- package/dist/drivers/redshift.js +12 -0
- package/dist/drivers/redshift.js.map +1 -0
- package/dist/drivers/sqlite.d.ts +13 -0
- package/dist/drivers/sqlite.d.ts.map +1 -0
- package/dist/drivers/sqlite.js +104 -0
- package/dist/drivers/sqlite.js.map +1 -0
- package/dist/drivers/trino.d.ts +14 -0
- package/dist/drivers/trino.d.ts.map +1 -0
- package/dist/drivers/trino.js +133 -0
- package/dist/drivers/trino.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DatabaseConnector, ConnectionConfig, TableInfo, ColumnInfo } from '../connector.js';
|
|
2
|
+
import type { QueryResult } from '../result-types.js';
|
|
3
|
+
export declare class AthenaConnector implements DatabaseConnector {
|
|
4
|
+
readonly driverName = "athena";
|
|
5
|
+
private client;
|
|
6
|
+
private athenaModule;
|
|
7
|
+
private database?;
|
|
8
|
+
private outputLocation?;
|
|
9
|
+
private workgroup?;
|
|
10
|
+
connect(config: ConnectionConfig): Promise<void>;
|
|
11
|
+
execute(sql: string, params?: unknown[]): Promise<QueryResult>;
|
|
12
|
+
disconnect(): Promise<void>;
|
|
13
|
+
ping(): Promise<boolean>;
|
|
14
|
+
listTables(): Promise<TableInfo[]>;
|
|
15
|
+
listColumns(schema?: string, table?: string): Promise<ColumnInfo[]>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=athena.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"athena.d.ts","sourceRoot":"","sources":["../../src/drivers/athena.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAA+B,MAAM,oBAAoB,CAAC;AAEnF,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,UAAU,YAAY;IAC/B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,SAAS,CAAC,CAAS;IAErB,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBhD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA4E9D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IASxB,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IASlC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAuB1E"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
export class AthenaConnector {
|
|
2
|
+
driverName = 'athena';
|
|
3
|
+
client = null;
|
|
4
|
+
athenaModule = null;
|
|
5
|
+
database;
|
|
6
|
+
outputLocation;
|
|
7
|
+
workgroup;
|
|
8
|
+
async connect(config) {
|
|
9
|
+
const moduleName = '@aws-sdk/client-athena';
|
|
10
|
+
this.athenaModule = await import(moduleName);
|
|
11
|
+
const clientConfig = { region: config.region ?? config.host ?? 'us-east-1' };
|
|
12
|
+
if (config.accessKeyId && config.secretAccessKey) {
|
|
13
|
+
clientConfig.credentials = {
|
|
14
|
+
accessKeyId: config.accessKeyId,
|
|
15
|
+
secretAccessKey: config.secretAccessKey,
|
|
16
|
+
sessionToken: config.sessionToken,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
else if (config.profile) {
|
|
20
|
+
const { fromIni } = await import('@aws-sdk/credential-provider-ini');
|
|
21
|
+
clientConfig.credentials = fromIni({ profile: config.profile });
|
|
22
|
+
}
|
|
23
|
+
this.client = new this.athenaModule.AthenaClient(clientConfig);
|
|
24
|
+
this.database = config.database;
|
|
25
|
+
this.outputLocation = config.outputLocation ?? config.schema;
|
|
26
|
+
this.workgroup = config.workgroup ?? config.warehouse;
|
|
27
|
+
}
|
|
28
|
+
async execute(sql, params) {
|
|
29
|
+
if (!this.client || !this.athenaModule) {
|
|
30
|
+
throw new Error('Athena connector not connected. Call connect() first.');
|
|
31
|
+
}
|
|
32
|
+
if (params && params.length > 0) {
|
|
33
|
+
throw new Error('Athena connector does not yet support positional parameters.');
|
|
34
|
+
}
|
|
35
|
+
if (!this.outputLocation) {
|
|
36
|
+
throw new Error('Athena connector requires outputLocation or schema to point to an S3 query-results path.');
|
|
37
|
+
}
|
|
38
|
+
const startTime = performance.now();
|
|
39
|
+
const started = await this.client.send(new this.athenaModule.StartQueryExecutionCommand({
|
|
40
|
+
QueryString: sql,
|
|
41
|
+
QueryExecutionContext: this.database ? { Database: this.database } : undefined,
|
|
42
|
+
ResultConfiguration: { OutputLocation: this.outputLocation },
|
|
43
|
+
WorkGroup: this.workgroup,
|
|
44
|
+
}));
|
|
45
|
+
const queryExecutionId = started.QueryExecutionId;
|
|
46
|
+
if (!queryExecutionId) {
|
|
47
|
+
throw new Error('Athena did not return a query execution id.');
|
|
48
|
+
}
|
|
49
|
+
while (true) {
|
|
50
|
+
const statusResult = await this.client.send(new this.athenaModule.GetQueryExecutionCommand({ QueryExecutionId: queryExecutionId }));
|
|
51
|
+
const state = statusResult.QueryExecution?.Status?.State;
|
|
52
|
+
if (state === 'SUCCEEDED') {
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
if (state === 'FAILED' || state === 'CANCELLED') {
|
|
56
|
+
throw new Error(statusResult.QueryExecution?.Status?.StateChangeReason ?? `Athena query ${state?.toLowerCase()}.`);
|
|
57
|
+
}
|
|
58
|
+
await delay(500);
|
|
59
|
+
}
|
|
60
|
+
const rows = [];
|
|
61
|
+
let columns = [];
|
|
62
|
+
let nextToken;
|
|
63
|
+
do {
|
|
64
|
+
const resultPage = await this.client.send(new this.athenaModule.GetQueryResultsCommand({
|
|
65
|
+
QueryExecutionId: queryExecutionId,
|
|
66
|
+
NextToken: nextToken,
|
|
67
|
+
}));
|
|
68
|
+
const columnInfo = resultPage.ResultSet?.ResultSetMetadata?.ColumnInfo ?? [];
|
|
69
|
+
if (columns.length === 0) {
|
|
70
|
+
columns = columnInfo.map((column) => ({
|
|
71
|
+
name: column.Name,
|
|
72
|
+
type: mapAthenaType(column.Type),
|
|
73
|
+
driverType: column.Type,
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
const pageRows = resultPage.ResultSet?.Rows ?? [];
|
|
77
|
+
for (let index = 0; index < pageRows.length; index++) {
|
|
78
|
+
const data = pageRows[index].Data ?? [];
|
|
79
|
+
const record = Object.fromEntries(columns.map((column, columnIndex) => [column.name, data[columnIndex]?.VarCharValue ?? null]));
|
|
80
|
+
const isHeaderRow = index === 0 && rows.length === 0 && columns.every((column) => String(record[column.name] ?? '') === column.name);
|
|
81
|
+
if (!isHeaderRow) {
|
|
82
|
+
rows.push(record);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
nextToken = resultPage.NextToken;
|
|
86
|
+
} while (nextToken);
|
|
87
|
+
return {
|
|
88
|
+
columns,
|
|
89
|
+
rows,
|
|
90
|
+
rowCount: rows.length,
|
|
91
|
+
executionTimeMs: performance.now() - startTime,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async disconnect() {
|
|
95
|
+
this.client = null;
|
|
96
|
+
this.athenaModule = null;
|
|
97
|
+
}
|
|
98
|
+
async ping() {
|
|
99
|
+
try {
|
|
100
|
+
await this.execute('SELECT 1 AS ok');
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async listTables() {
|
|
108
|
+
const db = this.database ?? 'default';
|
|
109
|
+
const result = await this.execute(`SHOW TABLES IN \`${db}\``);
|
|
110
|
+
return result.rows.map((row) => {
|
|
111
|
+
const name = String(Object.values(row)[0] ?? '');
|
|
112
|
+
return { schema: db, name, type: 'BASE TABLE' };
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async listColumns(schema, table) {
|
|
116
|
+
const db = schema ?? this.database ?? 'default';
|
|
117
|
+
const tables = table
|
|
118
|
+
? [{ schema: db, name: table, type: 'BASE TABLE' }]
|
|
119
|
+
: await this.listTables();
|
|
120
|
+
const columns = [];
|
|
121
|
+
for (const t of tables) {
|
|
122
|
+
try {
|
|
123
|
+
const result = await this.execute(`DESCRIBE \`${db}\`.\`${t.name}\``);
|
|
124
|
+
let pos = 1;
|
|
125
|
+
for (const row of result.rows) {
|
|
126
|
+
const colName = String(row['col_name'] ?? Object.values(row)[0] ?? '');
|
|
127
|
+
const dataType = String(row['data_type'] ?? Object.values(row)[1] ?? '');
|
|
128
|
+
if (colName && !colName.startsWith('#')) {
|
|
129
|
+
columns.push({ schema: db, table: t.name, name: colName, dataType, ordinalPosition: pos++ });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// table may not be describable — skip
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return columns;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function mapAthenaType(driverType) {
|
|
141
|
+
const lower = driverType.toLowerCase();
|
|
142
|
+
if (lower.includes('int') || lower.includes('double') || lower.includes('real') || lower.includes('decimal'))
|
|
143
|
+
return 'number';
|
|
144
|
+
if (lower === 'date')
|
|
145
|
+
return 'date';
|
|
146
|
+
if (lower.includes('timestamp'))
|
|
147
|
+
return 'datetime';
|
|
148
|
+
if (lower === 'boolean')
|
|
149
|
+
return 'boolean';
|
|
150
|
+
if (lower.includes('char') || lower.includes('string') || lower.includes('varchar'))
|
|
151
|
+
return 'string';
|
|
152
|
+
return 'unknown';
|
|
153
|
+
}
|
|
154
|
+
function delay(ms) {
|
|
155
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=athena.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"athena.js","sourceRoot":"","sources":["../../src/drivers/athena.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DatabaseConnector, ConnectionConfig, TableInfo, ColumnInfo } from '../connector.js';
|
|
2
|
+
import type { QueryResult } from '../result-types.js';
|
|
3
|
+
export declare class BigQueryConnector implements DatabaseConnector {
|
|
4
|
+
readonly driverName = "bigquery";
|
|
5
|
+
private client;
|
|
6
|
+
private location;
|
|
7
|
+
connect(config: ConnectionConfig): Promise<void>;
|
|
8
|
+
execute(sql: string, params?: unknown[]): Promise<QueryResult>;
|
|
9
|
+
disconnect(): Promise<void>;
|
|
10
|
+
ping(): Promise<boolean>;
|
|
11
|
+
listTables(): Promise<TableInfo[]>;
|
|
12
|
+
listColumns(schema?: string, table?: string): Promise<ColumnInfo[]>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=bigquery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bigquery.d.ts","sourceRoot":"","sources":["../../src/drivers/bigquery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAA+B,MAAM,oBAAoB,CAAC;AAEnF,qBAAa,iBAAkB,YAAW,iBAAiB;IACzD,QAAQ,CAAC,UAAU,cAAc;IACjC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAQ;IAElB,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgChD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAiE9D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAUxB,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAiBlC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CA4B1E"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
export class BigQueryConnector {
|
|
2
|
+
driverName = 'bigquery';
|
|
3
|
+
client = null;
|
|
4
|
+
location = 'US';
|
|
5
|
+
async connect(config) {
|
|
6
|
+
// Dynamic import to avoid requiring @google-cloud/bigquery when not used
|
|
7
|
+
const { BigQuery } = await import('@google-cloud/bigquery');
|
|
8
|
+
const options = {};
|
|
9
|
+
if (config.projectId) {
|
|
10
|
+
options.projectId = config.projectId;
|
|
11
|
+
}
|
|
12
|
+
if (config.keyFilename) {
|
|
13
|
+
options.keyFilename = config.keyFilename;
|
|
14
|
+
}
|
|
15
|
+
if (config.serviceAccountJson) {
|
|
16
|
+
try {
|
|
17
|
+
options.credentials = JSON.parse(config.serviceAccountJson);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
throw new Error(`BigQuery serviceAccountJson is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else if (config.credentials) {
|
|
24
|
+
options.credentials = config.credentials;
|
|
25
|
+
}
|
|
26
|
+
if (config.location) {
|
|
27
|
+
this.location = config.location;
|
|
28
|
+
}
|
|
29
|
+
// Without explicit key material, BigQuery uses Application Default Credentials.
|
|
30
|
+
this.client = new BigQuery(options);
|
|
31
|
+
}
|
|
32
|
+
async execute(sql, params) {
|
|
33
|
+
if (!this.client) {
|
|
34
|
+
throw new Error('BigQuery connector not connected. Call connect() first.');
|
|
35
|
+
}
|
|
36
|
+
const startTime = performance.now();
|
|
37
|
+
let queryText = sql;
|
|
38
|
+
const queryOptions = {
|
|
39
|
+
query: queryText,
|
|
40
|
+
location: this.location,
|
|
41
|
+
};
|
|
42
|
+
if (params && params.length > 0) {
|
|
43
|
+
// Prefer named parameters for compatibility. Convert positional "?" into "@pN"
|
|
44
|
+
// and pass { pN: value }.
|
|
45
|
+
const named = {};
|
|
46
|
+
let idx = 0;
|
|
47
|
+
queryText = replacePositionalQuestionMarks(queryText, () => {
|
|
48
|
+
idx++;
|
|
49
|
+
return `@p${idx}`;
|
|
50
|
+
});
|
|
51
|
+
for (let i = 0; i < params.length; i++) {
|
|
52
|
+
named[`p${i + 1}`] = params[i];
|
|
53
|
+
}
|
|
54
|
+
queryOptions.query = queryText;
|
|
55
|
+
queryOptions.params = named;
|
|
56
|
+
}
|
|
57
|
+
const [rows] = await this.client.query(queryOptions);
|
|
58
|
+
const executionTimeMs = performance.now() - startTime;
|
|
59
|
+
if (!rows || rows.length === 0) {
|
|
60
|
+
return {
|
|
61
|
+
columns: [],
|
|
62
|
+
rows: [],
|
|
63
|
+
rowCount: 0,
|
|
64
|
+
executionTimeMs,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// Infer columns from first row
|
|
68
|
+
const columns = Object.keys(rows[0]).map((name) => ({
|
|
69
|
+
name,
|
|
70
|
+
type: inferBigQueryType(rows[0][name]),
|
|
71
|
+
driverType: 'bigquery',
|
|
72
|
+
}));
|
|
73
|
+
// BigQuery returns BigQueryDate, BigQueryTimestamp etc. — normalize to plain values
|
|
74
|
+
const normalizedRows = rows.map((row) => {
|
|
75
|
+
const normalized = {};
|
|
76
|
+
for (const [key, value] of Object.entries(row)) {
|
|
77
|
+
normalized[key] = normalizeBigQueryValue(value);
|
|
78
|
+
}
|
|
79
|
+
return normalized;
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
columns,
|
|
83
|
+
rows: normalizedRows,
|
|
84
|
+
rowCount: normalizedRows.length,
|
|
85
|
+
executionTimeMs,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async disconnect() {
|
|
89
|
+
// BigQuery client doesn't maintain persistent connections
|
|
90
|
+
this.client = null;
|
|
91
|
+
}
|
|
92
|
+
async ping() {
|
|
93
|
+
if (!this.client)
|
|
94
|
+
return false;
|
|
95
|
+
try {
|
|
96
|
+
await this.client.query({ query: 'SELECT 1' });
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async listTables() {
|
|
104
|
+
if (!this.client)
|
|
105
|
+
throw new Error('BigQuery connector not connected.');
|
|
106
|
+
const [datasets] = await this.client.getDatasets();
|
|
107
|
+
const tables = [];
|
|
108
|
+
for (const ds of datasets ?? []) {
|
|
109
|
+
const [dsTables] = await ds.getTables();
|
|
110
|
+
for (const t of dsTables ?? []) {
|
|
111
|
+
tables.push({
|
|
112
|
+
schema: ds.id ?? '',
|
|
113
|
+
name: t.id ?? '',
|
|
114
|
+
type: (t.metadata?.type ?? 'TABLE') === 'VIEW' ? 'VIEW' : 'BASE TABLE',
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return tables;
|
|
119
|
+
}
|
|
120
|
+
async listColumns(schema, table) {
|
|
121
|
+
if (!this.client)
|
|
122
|
+
throw new Error('BigQuery connector not connected.');
|
|
123
|
+
const [datasets] = await this.client.getDatasets();
|
|
124
|
+
const filtered = schema ? (datasets ?? []).filter((ds) => ds.id === schema) : (datasets ?? []);
|
|
125
|
+
const columns = [];
|
|
126
|
+
for (const ds of filtered) {
|
|
127
|
+
let sql = `SELECT table_name, column_name, data_type, ordinal_position FROM \`${ds.id}\`.INFORMATION_SCHEMA.COLUMNS`;
|
|
128
|
+
if (table) {
|
|
129
|
+
sql += ` WHERE table_name = '${table.replace(/'/g, "''")}'`;
|
|
130
|
+
}
|
|
131
|
+
sql += ` ORDER BY table_name, ordinal_position`;
|
|
132
|
+
try {
|
|
133
|
+
const result = await this.execute(sql);
|
|
134
|
+
for (const row of result.rows) {
|
|
135
|
+
columns.push({
|
|
136
|
+
schema: ds.id ?? '',
|
|
137
|
+
table: String(row['table_name'] ?? ''),
|
|
138
|
+
name: String(row['column_name'] ?? ''),
|
|
139
|
+
dataType: String(row['data_type'] ?? ''),
|
|
140
|
+
ordinalPosition: Number(row['ordinal_position'] ?? 0),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Dataset may not support INFORMATION_SCHEMA — skip
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return columns;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function normalizeBigQueryValue(value) {
|
|
152
|
+
if (value === null || value === undefined)
|
|
153
|
+
return null;
|
|
154
|
+
// BigQuery wraps dates/timestamps in special objects with a .value property
|
|
155
|
+
if (typeof value === 'object' && value !== null && 'value' in value) {
|
|
156
|
+
return value.value;
|
|
157
|
+
}
|
|
158
|
+
return value;
|
|
159
|
+
}
|
|
160
|
+
function inferBigQueryType(value) {
|
|
161
|
+
if (value === null || value === undefined)
|
|
162
|
+
return 'null';
|
|
163
|
+
if (typeof value === 'number')
|
|
164
|
+
return 'number';
|
|
165
|
+
if (typeof value === 'boolean')
|
|
166
|
+
return 'boolean';
|
|
167
|
+
if (typeof value === 'string')
|
|
168
|
+
return 'string';
|
|
169
|
+
// BigQuery date/timestamp objects
|
|
170
|
+
if (typeof value === 'object' && value !== null) {
|
|
171
|
+
const constructor = value.constructor?.name ?? '';
|
|
172
|
+
if (constructor.includes('Date') || constructor.includes('date'))
|
|
173
|
+
return 'date';
|
|
174
|
+
if (constructor.includes('Timestamp') || constructor.includes('timestamp'))
|
|
175
|
+
return 'datetime';
|
|
176
|
+
}
|
|
177
|
+
return 'unknown';
|
|
178
|
+
}
|
|
179
|
+
function replacePositionalQuestionMarks(sql, replacer) {
|
|
180
|
+
let out = '';
|
|
181
|
+
let i = 0;
|
|
182
|
+
let inSingle = false;
|
|
183
|
+
let inDouble = false;
|
|
184
|
+
let inBacktick = false;
|
|
185
|
+
while (i < sql.length) {
|
|
186
|
+
const ch = sql[i];
|
|
187
|
+
if (ch === "'" && !inDouble && !inBacktick) {
|
|
188
|
+
out += ch;
|
|
189
|
+
if (inSingle && sql[i + 1] === "'") {
|
|
190
|
+
out += "'";
|
|
191
|
+
i += 2;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
inSingle = !inSingle;
|
|
195
|
+
i += 1;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (ch === '"' && !inSingle && !inBacktick) {
|
|
199
|
+
out += ch;
|
|
200
|
+
if (inDouble && sql[i + 1] === '"') {
|
|
201
|
+
out += '"';
|
|
202
|
+
i += 2;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
inDouble = !inDouble;
|
|
206
|
+
i += 1;
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (ch === '`' && !inSingle && !inDouble) {
|
|
210
|
+
out += ch;
|
|
211
|
+
if (inBacktick && sql[i + 1] === '`') {
|
|
212
|
+
out += '`';
|
|
213
|
+
i += 2;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
inBacktick = !inBacktick;
|
|
217
|
+
i += 1;
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (!inSingle && !inDouble && !inBacktick && ch === '?') {
|
|
221
|
+
out += replacer();
|
|
222
|
+
i += 1;
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
out += ch;
|
|
226
|
+
i += 1;
|
|
227
|
+
}
|
|
228
|
+
return out;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=bigquery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bigquery.js","sourceRoot":"","sources":["../../src/drivers/bigquery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DatabaseConnector, ConnectionConfig, TableInfo, ColumnInfo } from '../connector.js';
|
|
2
|
+
import type { QueryResult } from '../result-types.js';
|
|
3
|
+
export declare class ClickHouseConnector implements DatabaseConnector {
|
|
4
|
+
readonly driverName = "clickhouse";
|
|
5
|
+
private endpoint;
|
|
6
|
+
private headers;
|
|
7
|
+
connect(config: ConnectionConfig): Promise<void>;
|
|
8
|
+
execute(sql: string, params?: unknown[]): Promise<QueryResult>;
|
|
9
|
+
disconnect(): Promise<void>;
|
|
10
|
+
ping(): Promise<boolean>;
|
|
11
|
+
listTables(): Promise<TableInfo[]>;
|
|
12
|
+
listColumns(schema?: string, table?: string): Promise<ColumnInfo[]>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=clickhouse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickhouse.d.ts","sourceRoot":"","sources":["../../src/drivers/clickhouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAA+B,MAAM,oBAAoB,CAAC;AAEnF,qBAAa,mBAAoB,YAAW,iBAAiB;IAC3D,QAAQ,CAAC,UAAU,gBAAgB;IACnC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAA8B;IAEvC,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAehD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAoC9D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IASxB,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAWlC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAkB1E"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export class ClickHouseConnector {
|
|
2
|
+
driverName = 'clickhouse';
|
|
3
|
+
endpoint = null;
|
|
4
|
+
headers = {};
|
|
5
|
+
async connect(config) {
|
|
6
|
+
const protocol = config.ssl === false ? 'http' : 'https';
|
|
7
|
+
const host = config.host ?? 'localhost';
|
|
8
|
+
const port = config.port ?? (config.ssl === false ? 8123 : 8443);
|
|
9
|
+
this.endpoint = `${protocol}://${host}:${port}`;
|
|
10
|
+
this.headers = {
|
|
11
|
+
'Content-Type': 'text/plain; charset=utf-8',
|
|
12
|
+
};
|
|
13
|
+
if (config.username || config.password) {
|
|
14
|
+
const token = Buffer.from(`${config.username ?? 'default'}:${config.password ?? ''}`).toString('base64');
|
|
15
|
+
this.headers.Authorization = `Basic ${token}`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async execute(sql, params) {
|
|
19
|
+
if (!this.endpoint) {
|
|
20
|
+
throw new Error('ClickHouse connector not connected. Call connect() first.');
|
|
21
|
+
}
|
|
22
|
+
if (params && params.length > 0) {
|
|
23
|
+
throw new Error('ClickHouse connector does not yet support positional parameters.');
|
|
24
|
+
}
|
|
25
|
+
const startTime = performance.now();
|
|
26
|
+
const response = await fetch(this.endpoint, {
|
|
27
|
+
method: 'POST',
|
|
28
|
+
headers: this.headers,
|
|
29
|
+
body: `${sql.trim().replace(/;$/, '')} FORMAT JSON`,
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error(`ClickHouse query failed: ${await response.text()}`);
|
|
33
|
+
}
|
|
34
|
+
const payload = await response.json();
|
|
35
|
+
const executionTimeMs = performance.now() - startTime;
|
|
36
|
+
const rows = payload.data ?? [];
|
|
37
|
+
const columns = (payload.meta ?? []).map((column) => ({
|
|
38
|
+
name: column.name,
|
|
39
|
+
type: mapColumnType(column.type),
|
|
40
|
+
driverType: column.type,
|
|
41
|
+
}));
|
|
42
|
+
return {
|
|
43
|
+
columns,
|
|
44
|
+
rows,
|
|
45
|
+
rowCount: payload.rows ?? rows.length,
|
|
46
|
+
executionTimeMs,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async disconnect() {
|
|
50
|
+
this.endpoint = null;
|
|
51
|
+
this.headers = {};
|
|
52
|
+
}
|
|
53
|
+
async ping() {
|
|
54
|
+
try {
|
|
55
|
+
await this.execute('SELECT 1 AS ok');
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async listTables() {
|
|
63
|
+
const result = await this.execute(`SELECT database, name, engine FROM system.tables WHERE database NOT IN ('system', 'information_schema', 'INFORMATION_SCHEMA') ORDER BY database, name`);
|
|
64
|
+
return result.rows.map((row) => ({
|
|
65
|
+
schema: String(row['database'] ?? ''),
|
|
66
|
+
name: String(row['name'] ?? ''),
|
|
67
|
+
type: String(row['engine'] ?? '') === 'View' ? 'VIEW' : 'BASE TABLE',
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
async listColumns(schema, table) {
|
|
71
|
+
let sql = `SELECT database, table, name, type, position FROM system.columns WHERE database NOT IN ('system', 'information_schema', 'INFORMATION_SCHEMA')`;
|
|
72
|
+
if (schema) {
|
|
73
|
+
sql += ` AND database = '${schema.replace(/'/g, "''")}'`;
|
|
74
|
+
}
|
|
75
|
+
if (table) {
|
|
76
|
+
sql += ` AND table = '${table.replace(/'/g, "''")}'`;
|
|
77
|
+
}
|
|
78
|
+
sql += ` ORDER BY database, table, position`;
|
|
79
|
+
const result = await this.execute(sql);
|
|
80
|
+
return result.rows.map((row) => ({
|
|
81
|
+
schema: String(row['database'] ?? ''),
|
|
82
|
+
table: String(row['table'] ?? ''),
|
|
83
|
+
name: String(row['name'] ?? ''),
|
|
84
|
+
dataType: String(row['type'] ?? ''),
|
|
85
|
+
ordinalPosition: Number(row['position'] ?? 0),
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function mapColumnType(driverType) {
|
|
90
|
+
const lower = driverType.toLowerCase();
|
|
91
|
+
if (lower.includes('int') || lower.includes('float') || lower.includes('decimal'))
|
|
92
|
+
return 'number';
|
|
93
|
+
if (lower.includes('date') && !lower.includes('datetime'))
|
|
94
|
+
return 'date';
|
|
95
|
+
if (lower.includes('datetime') || lower.includes('timestamp'))
|
|
96
|
+
return 'datetime';
|
|
97
|
+
if (lower.includes('bool'))
|
|
98
|
+
return 'boolean';
|
|
99
|
+
if (lower.includes('string') || lower.includes('uuid'))
|
|
100
|
+
return 'string';
|
|
101
|
+
return 'unknown';
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=clickhouse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../../src/drivers/clickhouse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MSSQLConnector } from './mssql.js';
|
|
2
|
+
import type { ConnectionConfig } from '../connector.js';
|
|
3
|
+
export declare class FabricConnector extends MSSQLConnector {
|
|
4
|
+
readonly driverName = "fabric";
|
|
5
|
+
connect(config: ConnectionConfig): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=fabric.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fabric.d.ts","sourceRoot":"","sources":["../../src/drivers/fabric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,qBAAa,eAAgB,SAAQ,cAAc;IACjD,QAAQ,CAAC,UAAU,YAAY;IAEzB,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAOvD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MSSQLConnector } from './mssql.js';
|
|
2
|
+
export class FabricConnector extends MSSQLConnector {
|
|
3
|
+
driverName = 'fabric';
|
|
4
|
+
async connect(config) {
|
|
5
|
+
await super.connect({
|
|
6
|
+
...config,
|
|
7
|
+
driver: 'fabric',
|
|
8
|
+
port: config.port ?? 1433,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=fabric.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fabric.js","sourceRoot":"","sources":["../../src/drivers/fabric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACxC,UAAU,GAAG,QAAQ,CAAC;IAE/B,KAAK,CAAC,OAAO,CAAC,MAAwB;QACpC,MAAM,KAAK,CAAC,OAAO,CAAC;YAClB,GAAG,MAAM;YACT,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;SAC1B,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DatabaseConnector, ConnectionConfig, DriverName, TableInfo, ColumnInfo } from '../connector.js';
|
|
2
|
+
import type { QueryResult } from '../result-types.js';
|
|
3
|
+
export declare class MSSQLConnector implements DatabaseConnector {
|
|
4
|
+
readonly driverName: DriverName;
|
|
5
|
+
private pool;
|
|
6
|
+
private sql;
|
|
7
|
+
connect(config: ConnectionConfig): Promise<void>;
|
|
8
|
+
execute(sql: string, params?: unknown[]): Promise<QueryResult>;
|
|
9
|
+
disconnect(): Promise<void>;
|
|
10
|
+
ping(): Promise<boolean>;
|
|
11
|
+
listTables(): Promise<TableInfo[]>;
|
|
12
|
+
listColumns(schema?: string, table?: string): Promise<ColumnInfo[]>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=mssql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mssql.d.ts","sourceRoot":"","sources":["../../src/drivers/mssql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9G,OAAO,KAAK,EAAE,WAAW,EAA+B,MAAM,oBAAoB,CAAC;AAEnF,qBAAa,cAAe,YAAW,iBAAiB;IACtD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAW;IAC1C,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,GAAG,CAAa;IAElB,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BhD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA2D9D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAUxB,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAclC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAqB1E"}
|