@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.
Files changed (41) hide show
  1. package/dist/drivers/athena.d.ts +17 -0
  2. package/dist/drivers/athena.d.ts.map +1 -0
  3. package/dist/drivers/athena.js +157 -0
  4. package/dist/drivers/athena.js.map +1 -0
  5. package/dist/drivers/bigquery.d.ts +14 -0
  6. package/dist/drivers/bigquery.d.ts.map +1 -0
  7. package/dist/drivers/bigquery.js +230 -0
  8. package/dist/drivers/bigquery.js.map +1 -0
  9. package/dist/drivers/clickhouse.d.ts +14 -0
  10. package/dist/drivers/clickhouse.d.ts.map +1 -0
  11. package/dist/drivers/clickhouse.js +103 -0
  12. package/dist/drivers/clickhouse.js.map +1 -0
  13. package/dist/drivers/fabric.d.ts +7 -0
  14. package/dist/drivers/fabric.d.ts.map +1 -0
  15. package/dist/drivers/fabric.js +12 -0
  16. package/dist/drivers/fabric.js.map +1 -0
  17. package/dist/drivers/mssql.d.ts +14 -0
  18. package/dist/drivers/mssql.d.ts.map +1 -0
  19. package/dist/drivers/mssql.js +164 -0
  20. package/dist/drivers/mssql.js.map +1 -0
  21. package/dist/drivers/mysql.d.ts +13 -0
  22. package/dist/drivers/mysql.d.ts.map +1 -0
  23. package/dist/drivers/mysql.js +136 -0
  24. package/dist/drivers/mysql.js.map +1 -0
  25. package/dist/drivers/postgresql.d.ts +13 -0
  26. package/dist/drivers/postgresql.d.ts.map +1 -0
  27. package/dist/drivers/postgresql.js +117 -0
  28. package/dist/drivers/postgresql.js.map +1 -0
  29. package/dist/drivers/redshift.d.ts +7 -0
  30. package/dist/drivers/redshift.d.ts.map +1 -0
  31. package/dist/drivers/redshift.js +12 -0
  32. package/dist/drivers/redshift.js.map +1 -0
  33. package/dist/drivers/sqlite.d.ts +13 -0
  34. package/dist/drivers/sqlite.d.ts.map +1 -0
  35. package/dist/drivers/sqlite.js +104 -0
  36. package/dist/drivers/sqlite.js.map +1 -0
  37. package/dist/drivers/trino.d.ts +14 -0
  38. package/dist/drivers/trino.d.ts.map +1 -0
  39. package/dist/drivers/trino.js +133 -0
  40. package/dist/drivers/trino.js.map +1 -0
  41. package/package.json +1 -1
@@ -0,0 +1,164 @@
1
+ export class MSSQLConnector {
2
+ driverName = 'mssql';
3
+ pool = null;
4
+ sql = null;
5
+ async connect(config) {
6
+ // Dynamic import to avoid requiring tedious/mssql when not used
7
+ this.sql = await import('mssql');
8
+ const mssqlConfig = {
9
+ server: config.host ?? 'localhost',
10
+ port: config.port ?? 1433,
11
+ database: config.database,
12
+ user: config.username,
13
+ password: config.password,
14
+ options: {
15
+ encrypt: config.ssl !== false,
16
+ trustServerCertificate: true,
17
+ },
18
+ pool: {
19
+ max: 10,
20
+ min: 0,
21
+ idleTimeoutMillis: 30000,
22
+ },
23
+ };
24
+ if (config.connectionString) {
25
+ this.pool = await this.sql.connect(config.connectionString);
26
+ }
27
+ else {
28
+ this.pool = await this.sql.connect(mssqlConfig);
29
+ }
30
+ }
31
+ async execute(sql, params) {
32
+ if (!this.pool) {
33
+ throw new Error('MSSQL connector not connected. Call connect() first.');
34
+ }
35
+ const startTime = performance.now();
36
+ const request = this.pool.request();
37
+ // Bind positional parameters as @p1, @p2, etc.
38
+ if (params && params.length > 0) {
39
+ for (let i = 0; i < params.length; i++) {
40
+ request.input(`p${i + 1}`, params[i]);
41
+ }
42
+ // Replace $N placeholders with @pN for MSSQL syntax
43
+ sql = sql.replace(/\$(\d+)/g, (_match, num) => `@p${num}`);
44
+ }
45
+ const result = await request.query(sql);
46
+ const executionTimeMs = performance.now() - startTime;
47
+ const recordset = result.recordset;
48
+ if (!recordset || recordset.length === 0) {
49
+ return {
50
+ columns: [],
51
+ rows: [],
52
+ rowCount: result.rowsAffected?.[0] ?? 0,
53
+ executionTimeMs,
54
+ };
55
+ }
56
+ // Extract column metadata from recordset.columns
57
+ const columns = Object.keys(recordset.columns ?? {}).map((name) => {
58
+ const col = recordset.columns[name];
59
+ return {
60
+ name,
61
+ type: mapMSSQLType(col?.type?.declaration ?? ''),
62
+ driverType: col?.type?.declaration ?? 'unknown',
63
+ };
64
+ });
65
+ // If columns metadata is empty, infer from first row
66
+ if (columns.length === 0 && recordset.length > 0) {
67
+ for (const key of Object.keys(recordset[0])) {
68
+ columns.push({
69
+ name: key,
70
+ type: inferMSSQLType(recordset[0][key]),
71
+ driverType: 'inferred',
72
+ });
73
+ }
74
+ }
75
+ return {
76
+ columns,
77
+ rows: recordset,
78
+ rowCount: recordset.length,
79
+ executionTimeMs,
80
+ };
81
+ }
82
+ async disconnect() {
83
+ if (this.pool) {
84
+ await this.pool.close();
85
+ this.pool = null;
86
+ }
87
+ }
88
+ async ping() {
89
+ if (!this.pool)
90
+ return false;
91
+ try {
92
+ await this.pool.request().query('SELECT 1');
93
+ return true;
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ }
99
+ async listTables() {
100
+ const result = await this.execute(`SELECT TABLE_SCHEMA AS table_schema, TABLE_NAME AS table_name, TABLE_TYPE AS table_type
101
+ FROM INFORMATION_SCHEMA.TABLES
102
+ WHERE TABLE_SCHEMA NOT IN ('INFORMATION_SCHEMA', 'sys')
103
+ ORDER BY TABLE_SCHEMA, TABLE_NAME`);
104
+ return result.rows.map((row) => ({
105
+ schema: String(row['table_schema'] ?? ''),
106
+ name: String(row['table_name'] ?? ''),
107
+ type: String(row['table_type'] ?? ''),
108
+ }));
109
+ }
110
+ async listColumns(schema, table) {
111
+ let sql = `SELECT TABLE_SCHEMA AS table_schema, TABLE_NAME AS table_name,
112
+ COLUMN_NAME AS column_name, DATA_TYPE AS data_type, ORDINAL_POSITION AS ordinal_position
113
+ FROM INFORMATION_SCHEMA.COLUMNS
114
+ WHERE TABLE_SCHEMA NOT IN ('INFORMATION_SCHEMA', 'sys')`;
115
+ if (schema) {
116
+ sql += ` AND TABLE_SCHEMA = '${schema.replace(/'/g, "''")}'`;
117
+ }
118
+ if (table) {
119
+ sql += ` AND TABLE_NAME = '${table.replace(/'/g, "''")}'`;
120
+ }
121
+ sql += ` ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION`;
122
+ const result = await this.execute(sql);
123
+ return result.rows.map((row) => ({
124
+ schema: String(row['table_schema'] ?? ''),
125
+ table: String(row['table_name'] ?? ''),
126
+ name: String(row['column_name'] ?? ''),
127
+ dataType: String(row['data_type'] ?? ''),
128
+ ordinalPosition: Number(row['ordinal_position'] ?? 0),
129
+ }));
130
+ }
131
+ }
132
+ function mapMSSQLType(declaration) {
133
+ const lower = (declaration ?? '').toLowerCase();
134
+ if (['int', 'bigint', 'smallint', 'tinyint', 'float', 'real', 'decimal', 'numeric', 'money', 'smallmoney'].some((t) => lower.includes(t))) {
135
+ return 'number';
136
+ }
137
+ if (lower.includes('date') && !lower.includes('datetime')) {
138
+ return 'date';
139
+ }
140
+ if (['datetime', 'datetime2', 'datetimeoffset', 'smalldatetime', 'timestamp'].some((t) => lower.includes(t))) {
141
+ return 'datetime';
142
+ }
143
+ if (lower.includes('bit')) {
144
+ return 'boolean';
145
+ }
146
+ if (['varchar', 'nvarchar', 'char', 'nchar', 'text', 'ntext', 'xml'].some((t) => lower.includes(t))) {
147
+ return 'string';
148
+ }
149
+ return 'unknown';
150
+ }
151
+ function inferMSSQLType(value) {
152
+ if (value === null || value === undefined)
153
+ return 'null';
154
+ if (typeof value === 'number')
155
+ return 'number';
156
+ if (typeof value === 'boolean')
157
+ return 'boolean';
158
+ if (typeof value === 'string')
159
+ return 'string';
160
+ if (value instanceof Date)
161
+ return 'datetime';
162
+ return 'unknown';
163
+ }
164
+ //# sourceMappingURL=mssql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mssql.js","sourceRoot":"","sources":["../../src/drivers/mssql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { DatabaseConnector, ConnectionConfig, TableInfo, ColumnInfo } from '../connector.js';
2
+ import type { QueryResult } from '../result-types.js';
3
+ export declare class MySQLConnector implements DatabaseConnector {
4
+ readonly driverName = "mysql";
5
+ private pool;
6
+ connect(config: ConnectionConfig): Promise<void>;
7
+ execute(sql: string, params?: unknown[]): Promise<QueryResult>;
8
+ disconnect(): Promise<void>;
9
+ ping(): Promise<boolean>;
10
+ listTables(): Promise<TableInfo[]>;
11
+ listColumns(schema?: string, table?: string): Promise<ColumnInfo[]>;
12
+ }
13
+ //# sourceMappingURL=mysql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/drivers/mysql.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,cAAe,YAAW,iBAAiB;IACtD,QAAQ,CAAC,UAAU,WAAW;IAC9B,OAAO,CAAC,IAAI,CAAa;IAEnB,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BhD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAiC9D,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;CAuB1E"}
@@ -0,0 +1,136 @@
1
+ export class MySQLConnector {
2
+ driverName = 'mysql';
3
+ pool = null;
4
+ async connect(config) {
5
+ // Dynamic import to avoid requiring mysql2 when not used
6
+ const mysql = await import('mysql2/promise');
7
+ const poolConfig = {
8
+ host: config.host ?? 'localhost',
9
+ port: config.port ?? 3306,
10
+ database: config.database,
11
+ user: config.username,
12
+ password: config.password,
13
+ waitForConnections: true,
14
+ connectionLimit: 10,
15
+ queueLimit: 0,
16
+ };
17
+ if (config.connectionString) {
18
+ poolConfig.uri = config.connectionString;
19
+ }
20
+ if (config.ssl) {
21
+ poolConfig.ssl = { rejectUnauthorized: false };
22
+ }
23
+ this.pool = mysql.createPool(poolConfig);
24
+ }
25
+ async execute(sql, params) {
26
+ if (!this.pool) {
27
+ throw new Error('MySQL connector not connected. Call connect() first.');
28
+ }
29
+ const startTime = performance.now();
30
+ const [rows, fields] = await this.pool.execute(sql, params);
31
+ const executionTimeMs = performance.now() - startTime;
32
+ if (!Array.isArray(rows)) {
33
+ // Non-SELECT statement (INSERT, UPDATE, DELETE)
34
+ return {
35
+ columns: [],
36
+ rows: [],
37
+ rowCount: rows.affectedRows ?? 0,
38
+ executionTimeMs,
39
+ };
40
+ }
41
+ const columns = (fields ?? []).map((field) => ({
42
+ name: field.name,
43
+ type: mapMySQLType(field.columnType),
44
+ driverType: String(field.columnType),
45
+ }));
46
+ return {
47
+ columns,
48
+ rows: rows,
49
+ rowCount: rows.length,
50
+ executionTimeMs,
51
+ };
52
+ }
53
+ async disconnect() {
54
+ if (this.pool) {
55
+ await this.pool.end();
56
+ this.pool = null;
57
+ }
58
+ }
59
+ async ping() {
60
+ if (!this.pool)
61
+ return false;
62
+ try {
63
+ await this.pool.execute('SELECT 1');
64
+ return true;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ async listTables() {
71
+ const result = await this.execute(`SELECT table_schema, table_name, table_type
72
+ FROM information_schema.tables
73
+ WHERE table_schema NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
74
+ ORDER BY table_schema, table_name`);
75
+ return result.rows.map((row) => ({
76
+ schema: String(row['TABLE_SCHEMA'] ?? row['table_schema'] ?? ''),
77
+ name: String(row['TABLE_NAME'] ?? row['table_name'] ?? ''),
78
+ type: String(row['TABLE_TYPE'] ?? row['table_type'] ?? ''),
79
+ }));
80
+ }
81
+ async listColumns(schema, table) {
82
+ let sql = `SELECT table_schema, table_name, column_name, data_type, ordinal_position
83
+ FROM information_schema.columns
84
+ WHERE table_schema NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')`;
85
+ const params = [];
86
+ if (schema) {
87
+ params.push(schema);
88
+ sql += ` AND table_schema = ?`;
89
+ }
90
+ if (table) {
91
+ params.push(table);
92
+ sql += ` AND table_name = ?`;
93
+ }
94
+ sql += ` ORDER BY table_schema, table_name, ordinal_position`;
95
+ const result = await this.execute(sql, params);
96
+ return result.rows.map((row) => ({
97
+ schema: String(row['TABLE_SCHEMA'] ?? row['table_schema'] ?? ''),
98
+ table: String(row['TABLE_NAME'] ?? row['table_name'] ?? ''),
99
+ name: String(row['COLUMN_NAME'] ?? row['column_name'] ?? ''),
100
+ dataType: String(row['DATA_TYPE'] ?? row['data_type'] ?? ''),
101
+ ordinalPosition: Number(row['ORDINAL_POSITION'] ?? row['ordinal_position'] ?? 0),
102
+ }));
103
+ }
104
+ }
105
+ // MySQL column type constants
106
+ // See: https://dev.mysql.com/doc/dev/mysql-server/latest/field__types_8h.html
107
+ function mapMySQLType(typeId) {
108
+ switch (typeId) {
109
+ case 0: // DECIMAL
110
+ case 1: // TINY
111
+ case 2: // SHORT
112
+ case 3: // LONG
113
+ case 4: // FLOAT
114
+ case 5: // DOUBLE
115
+ case 8: // LONGLONG
116
+ case 9: // INT24
117
+ case 246: // NEWDECIMAL
118
+ return 'number';
119
+ case 10: // DATE
120
+ case 14: // NEWDATE
121
+ return 'date';
122
+ case 7: // TIMESTAMP
123
+ case 12: // DATETIME
124
+ return 'datetime';
125
+ case 16: // BIT
126
+ return 'boolean';
127
+ case 15: // VARCHAR
128
+ case 253: // VAR_STRING
129
+ case 254: // STRING
130
+ case 252: // BLOB (text types)
131
+ return 'string';
132
+ default:
133
+ return 'unknown';
134
+ }
135
+ }
136
+ //# sourceMappingURL=mysql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/drivers/mysql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { DatabaseConnector, ConnectionConfig, DriverName, TableInfo, ColumnInfo } from '../connector.js';
2
+ import type { QueryResult } from '../result-types.js';
3
+ export declare class PostgreSQLConnector implements DatabaseConnector {
4
+ readonly driverName: DriverName;
5
+ private pool;
6
+ connect(config: ConnectionConfig): Promise<void>;
7
+ execute(sql: string, params?: unknown[]): Promise<QueryResult>;
8
+ disconnect(): Promise<void>;
9
+ ping(): Promise<boolean>;
10
+ listTables(): Promise<TableInfo[]>;
11
+ listColumns(schema?: string, table?: string): Promise<ColumnInfo[]>;
12
+ }
13
+ //# sourceMappingURL=postgresql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresql.d.ts","sourceRoot":"","sources":["../../src/drivers/postgresql.ts"],"names":[],"mappings":"AACA,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,mBAAoB,YAAW,iBAAiB;IAC3D,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAgB;IAC/C,OAAO,CAAC,IAAI,CAAwB;IAE9B,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAyB9D,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;CAuB1E"}
@@ -0,0 +1,117 @@
1
+ import pg from 'pg';
2
+ export class PostgreSQLConnector {
3
+ driverName = 'postgresql';
4
+ pool = null;
5
+ async connect(config) {
6
+ const poolConfig = config.connectionString
7
+ ? { connectionString: config.connectionString }
8
+ : {
9
+ host: config.host ?? 'localhost',
10
+ port: config.port ?? 5432,
11
+ database: config.database,
12
+ user: config.username,
13
+ password: config.password,
14
+ ssl: config.ssl ? { rejectUnauthorized: false } : undefined,
15
+ };
16
+ poolConfig.max = 10;
17
+ poolConfig.idleTimeoutMillis = 30000;
18
+ this.pool = new pg.Pool(poolConfig);
19
+ }
20
+ async execute(sql, params) {
21
+ if (!this.pool) {
22
+ throw new Error('PostgreSQL connector not connected. Call connect() first.');
23
+ }
24
+ const startTime = performance.now();
25
+ const result = await this.pool.query(sql, params);
26
+ const executionTimeMs = performance.now() - startTime;
27
+ const columns = (result.fields ?? []).map((field) => ({
28
+ name: field.name,
29
+ type: mapPgType(field.dataTypeID),
30
+ driverType: String(field.dataTypeID),
31
+ }));
32
+ const rows = result.rows ?? [];
33
+ return {
34
+ columns,
35
+ rows,
36
+ rowCount: rows.length,
37
+ executionTimeMs,
38
+ };
39
+ }
40
+ async disconnect() {
41
+ if (this.pool) {
42
+ await this.pool.end();
43
+ this.pool = null;
44
+ }
45
+ }
46
+ async ping() {
47
+ if (!this.pool)
48
+ return false;
49
+ try {
50
+ await this.pool.query('SELECT 1');
51
+ return true;
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ async listTables() {
58
+ const result = await this.execute(`SELECT table_schema, table_name, table_type
59
+ FROM information_schema.tables
60
+ WHERE table_schema NOT IN ('information_schema', 'pg_catalog')
61
+ ORDER BY table_schema, table_name`);
62
+ return result.rows.map((row) => ({
63
+ schema: String(row['table_schema'] ?? ''),
64
+ name: String(row['table_name'] ?? ''),
65
+ type: String(row['table_type'] ?? ''),
66
+ }));
67
+ }
68
+ async listColumns(schema, table) {
69
+ let sql = `SELECT table_schema, table_name, column_name, data_type, ordinal_position
70
+ FROM information_schema.columns
71
+ WHERE table_schema NOT IN ('information_schema', 'pg_catalog')`;
72
+ const params = [];
73
+ if (schema) {
74
+ params.push(schema);
75
+ sql += ` AND table_schema = $${params.length}`;
76
+ }
77
+ if (table) {
78
+ params.push(table);
79
+ sql += ` AND table_name = $${params.length}`;
80
+ }
81
+ sql += ` ORDER BY table_schema, table_name, ordinal_position`;
82
+ const result = await this.execute(sql, params);
83
+ return result.rows.map((row) => ({
84
+ schema: String(row['table_schema'] ?? ''),
85
+ table: String(row['table_name'] ?? ''),
86
+ name: String(row['column_name'] ?? ''),
87
+ dataType: String(row['data_type'] ?? ''),
88
+ ordinalPosition: Number(row['ordinal_position'] ?? 0),
89
+ }));
90
+ }
91
+ }
92
+ function mapPgType(oid) {
93
+ // Common PostgreSQL OIDs
94
+ switch (oid) {
95
+ case 16:
96
+ return 'boolean'; // bool
97
+ case 20:
98
+ case 21:
99
+ case 23:
100
+ case 700:
101
+ case 701:
102
+ case 1700:
103
+ return 'number'; // int8, int2, int4, float4, float8, numeric
104
+ case 1082:
105
+ return 'date'; // date
106
+ case 1114:
107
+ case 1184:
108
+ return 'datetime'; // timestamp, timestamptz
109
+ case 25:
110
+ case 1042:
111
+ case 1043:
112
+ return 'string'; // text, char, varchar
113
+ default:
114
+ return 'unknown';
115
+ }
116
+ }
117
+ //# sourceMappingURL=postgresql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresql.js","sourceRoot":"","sources":["../../src/drivers/postgresql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { PostgreSQLConnector } from './postgresql.js';
2
+ import type { ConnectionConfig } from '../connector.js';
3
+ export declare class RedshiftConnector extends PostgreSQLConnector {
4
+ readonly driverName = "redshift";
5
+ connect(config: ConnectionConfig): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=redshift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redshift.d.ts","sourceRoot":"","sources":["../../src/drivers/redshift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,qBAAa,iBAAkB,SAAQ,mBAAmB;IACxD,QAAQ,CAAC,UAAU,cAAc;IAE3B,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAOvD"}
@@ -0,0 +1,12 @@
1
+ import { PostgreSQLConnector } from './postgresql.js';
2
+ export class RedshiftConnector extends PostgreSQLConnector {
3
+ driverName = 'redshift';
4
+ async connect(config) {
5
+ await super.connect({
6
+ ...config,
7
+ driver: 'redshift',
8
+ port: config.port ?? 5439,
9
+ });
10
+ }
11
+ }
12
+ //# sourceMappingURL=redshift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redshift.js","sourceRoot":"","sources":["../../src/drivers/redshift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGtD,MAAM,OAAO,iBAAkB,SAAQ,mBAAmB;IAC/C,UAAU,GAAG,UAAU,CAAC;IAEjC,KAAK,CAAC,OAAO,CAAC,MAAwB;QACpC,MAAM,KAAK,CAAC,OAAO,CAAC;YAClB,GAAG,MAAM;YACT,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;SAC1B,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { DatabaseConnector, ConnectionConfig, TableInfo, ColumnInfo } from '../connector.js';
2
+ import type { QueryResult } from '../result-types.js';
3
+ export declare class SQLiteConnector implements DatabaseConnector {
4
+ readonly driverName = "sqlite";
5
+ private db;
6
+ connect(config: ConnectionConfig): Promise<void>;
7
+ execute(sql: string, params?: unknown[]): Promise<QueryResult>;
8
+ disconnect(): Promise<void>;
9
+ ping(): Promise<boolean>;
10
+ listTables(): Promise<TableInfo[]>;
11
+ listColumns(schema?: string, table?: string): Promise<ColumnInfo[]>;
12
+ }
13
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/drivers/sqlite.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AAUvE,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,UAAU,YAAY;IAC/B,OAAO,CAAC,EAAE,CAAkC;IAEtC,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAwC9D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAUxB,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,104 @@
1
+ import { createRequire } from 'node:module';
2
+ const require = createRequire(import.meta.url);
3
+ let databaseCtor = null;
4
+ function loadDatabase() {
5
+ databaseCtor ??= require('better-sqlite3');
6
+ return databaseCtor;
7
+ }
8
+ export class SQLiteConnector {
9
+ driverName = 'sqlite';
10
+ db = null;
11
+ async connect(config) {
12
+ const filepath = config.filepath ?? config.database ?? ':memory:';
13
+ const Database = loadDatabase();
14
+ this.db = new Database(filepath);
15
+ this.db.pragma('journal_mode = WAL');
16
+ }
17
+ async execute(sql, params) {
18
+ if (!this.db) {
19
+ throw new Error('SQLite connector not connected. Call connect() first.');
20
+ }
21
+ const startTime = performance.now();
22
+ const stmt = this.db.prepare(sql);
23
+ if (stmt.reader) {
24
+ const rows = (params ? stmt.all(...params) : stmt.all());
25
+ const executionTimeMs = performance.now() - startTime;
26
+ const columns = rows.length > 0
27
+ ? Object.keys(rows[0]).map((name) => ({
28
+ name,
29
+ type: inferType(rows[0][name]),
30
+ driverType: 'unknown',
31
+ }))
32
+ : [];
33
+ return {
34
+ columns,
35
+ rows,
36
+ rowCount: rows.length,
37
+ executionTimeMs,
38
+ };
39
+ }
40
+ const result = params ? stmt.run(...params) : stmt.run();
41
+ const executionTimeMs = performance.now() - startTime;
42
+ return {
43
+ columns: [],
44
+ rows: [],
45
+ rowCount: result.changes,
46
+ executionTimeMs,
47
+ };
48
+ }
49
+ async disconnect() {
50
+ if (this.db) {
51
+ this.db.close();
52
+ this.db = null;
53
+ }
54
+ }
55
+ async ping() {
56
+ if (!this.db)
57
+ return false;
58
+ try {
59
+ this.db.prepare('SELECT 1').get();
60
+ return true;
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ async listTables() {
67
+ const result = await this.execute(`SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' ORDER BY name`);
68
+ return result.rows.map((row) => ({
69
+ schema: 'main',
70
+ name: String(row['name'] ?? ''),
71
+ type: String(row['type'] ?? '') === 'table' ? 'BASE TABLE' : 'VIEW',
72
+ }));
73
+ }
74
+ async listColumns(schema, table) {
75
+ const tables = await this.listTables();
76
+ const filtered = table ? tables.filter((t) => t.name === table) : tables;
77
+ const columns = [];
78
+ for (const t of filtered) {
79
+ const result = await this.execute(`PRAGMA table_info("${t.name.replace(/"/g, '""')}")`);
80
+ for (const row of result.rows) {
81
+ columns.push({
82
+ schema: 'main',
83
+ table: t.name,
84
+ name: String(row['name'] ?? ''),
85
+ dataType: String(row['type'] ?? 'TEXT'),
86
+ ordinalPosition: Number(row['cid'] ?? 0) + 1,
87
+ });
88
+ }
89
+ }
90
+ return columns;
91
+ }
92
+ }
93
+ function inferType(value) {
94
+ if (value === null)
95
+ return 'null';
96
+ if (typeof value === 'number')
97
+ return 'number';
98
+ if (typeof value === 'boolean')
99
+ return 'boolean';
100
+ if (typeof value === 'string')
101
+ return 'string';
102
+ return 'unknown';
103
+ }
104
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/drivers/sqlite.ts"],"names":[],"mappings":"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"}