@duckcodeailabs/dql-connectors 0.1.0
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 +123 -0
- package/dist/connection-pool.d.ts +11 -0
- package/dist/connection-pool.d.ts.map +1 -0
- package/dist/connection-pool.js +99 -0
- package/dist/connection-pool.js.map +1 -0
- package/dist/connector.d.ts +26 -0
- package/dist/connector.d.ts.map +1 -0
- package/dist/connector.js +2 -0
- package/dist/connector.js.map +1 -0
- package/dist/drivers/bigquery.d.ts +11 -0
- package/dist/drivers/bigquery.d.ts.map +1 -0
- package/dist/drivers/bigquery.js +166 -0
- package/dist/drivers/bigquery.js.map +1 -0
- package/dist/drivers/duckdb.d.ts +12 -0
- package/dist/drivers/duckdb.d.ts.map +1 -0
- package/dist/drivers/duckdb.js +103 -0
- package/dist/drivers/duckdb.js.map +1 -0
- package/dist/drivers/file.d.ts +24 -0
- package/dist/drivers/file.d.ts.map +1 -0
- package/dist/drivers/file.js +38 -0
- package/dist/drivers/file.js.map +1 -0
- package/dist/drivers/mssql.d.ts +12 -0
- package/dist/drivers/mssql.d.ts.map +1 -0
- package/dist/drivers/mssql.js +132 -0
- package/dist/drivers/mssql.js.map +1 -0
- package/dist/drivers/mysql.d.ts +11 -0
- package/dist/drivers/mysql.d.ts.map +1 -0
- package/dist/drivers/mysql.js +102 -0
- package/dist/drivers/mysql.js.map +1 -0
- package/dist/drivers/postgresql.d.ts +11 -0
- package/dist/drivers/postgresql.d.ts.map +1 -0
- package/dist/drivers/postgresql.js +83 -0
- package/dist/drivers/postgresql.js.map +1 -0
- package/dist/drivers/snowflake.d.ts +14 -0
- package/dist/drivers/snowflake.d.ts.map +1 -0
- package/dist/drivers/snowflake.js +154 -0
- package/dist/drivers/snowflake.js.map +1 -0
- package/dist/drivers/sqlite.d.ts +11 -0
- package/dist/drivers/sqlite.d.ts.map +1 -0
- package/dist/drivers/sqlite.js +71 -0
- package/dist/drivers/sqlite.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/query-executor.d.ts +13 -0
- package/dist/query-executor.d.ts.map +1 -0
- package/dist/query-executor.js +24 -0
- package/dist/query-executor.js.map +1 -0
- package/dist/result-types.d.ts +14 -0
- package/dist/result-types.d.ts.map +1 -0
- package/dist/result-types.js +2 -0
- package/dist/result-types.js.map +1 -0
- package/dist/sql-params.d.ts +17 -0
- package/dist/sql-params.d.ts.map +1 -0
- package/dist/sql-params.js +89 -0
- package/dist/sql-params.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
export class SQLiteConnector {
|
|
3
|
+
driverName = 'sqlite';
|
|
4
|
+
db = null;
|
|
5
|
+
async connect(config) {
|
|
6
|
+
const filepath = config.filepath ?? config.database ?? ':memory:';
|
|
7
|
+
this.db = new Database(filepath);
|
|
8
|
+
this.db.pragma('journal_mode = WAL');
|
|
9
|
+
}
|
|
10
|
+
async execute(sql, params) {
|
|
11
|
+
if (!this.db) {
|
|
12
|
+
throw new Error('SQLite connector not connected. Call connect() first.');
|
|
13
|
+
}
|
|
14
|
+
const startTime = performance.now();
|
|
15
|
+
const stmt = this.db.prepare(sql);
|
|
16
|
+
if (stmt.reader) {
|
|
17
|
+
const rows = (params ? stmt.all(...params) : stmt.all());
|
|
18
|
+
const executionTimeMs = performance.now() - startTime;
|
|
19
|
+
const columns = rows.length > 0
|
|
20
|
+
? Object.keys(rows[0]).map((name) => ({
|
|
21
|
+
name,
|
|
22
|
+
type: inferType(rows[0][name]),
|
|
23
|
+
driverType: 'unknown',
|
|
24
|
+
}))
|
|
25
|
+
: [];
|
|
26
|
+
return {
|
|
27
|
+
columns,
|
|
28
|
+
rows,
|
|
29
|
+
rowCount: rows.length,
|
|
30
|
+
executionTimeMs,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const result = params ? stmt.run(...params) : stmt.run();
|
|
34
|
+
const executionTimeMs = performance.now() - startTime;
|
|
35
|
+
return {
|
|
36
|
+
columns: [],
|
|
37
|
+
rows: [],
|
|
38
|
+
rowCount: result.changes,
|
|
39
|
+
executionTimeMs,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async disconnect() {
|
|
43
|
+
if (this.db) {
|
|
44
|
+
this.db.close();
|
|
45
|
+
this.db = null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async ping() {
|
|
49
|
+
if (!this.db)
|
|
50
|
+
return false;
|
|
51
|
+
try {
|
|
52
|
+
this.db.prepare('SELECT 1').get();
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function inferType(value) {
|
|
61
|
+
if (value === null)
|
|
62
|
+
return 'null';
|
|
63
|
+
if (typeof value === 'number')
|
|
64
|
+
return 'number';
|
|
65
|
+
if (typeof value === 'boolean')
|
|
66
|
+
return 'boolean';
|
|
67
|
+
if (typeof value === 'string')
|
|
68
|
+
return 'string';
|
|
69
|
+
return 'unknown';
|
|
70
|
+
}
|
|
71
|
+
//# 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { DatabaseConnector, ConnectionConfig } from './connector.js';
|
|
2
|
+
export type { QueryResult, ColumnMeta, ColumnType, Row } from './result-types.js';
|
|
3
|
+
export { ConnectionPoolManager } from './connection-pool.js';
|
|
4
|
+
export { QueryExecutor } from './query-executor.js';
|
|
5
|
+
export type { SQLParamSpec } from './sql-params.js';
|
|
6
|
+
export { buildParamValues, normalizeSQLPlaceholders } from './sql-params.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @dql/connectors - DQL Database Connectors
|
|
2
|
+
export { ConnectionPoolManager } from './connection-pool.js';
|
|
3
|
+
export { QueryExecutor } from './query-executor.js';
|
|
4
|
+
export { buildParamValues, normalizeSQLPlaceholders } from './sql-params.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAI5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DatabaseConnector, ConnectionConfig } from './connector.js';
|
|
2
|
+
import type { QueryResult } from './result-types.js';
|
|
3
|
+
import { ConnectionPoolManager } from './connection-pool.js';
|
|
4
|
+
import { type SQLParamSpec } from './sql-params.js';
|
|
5
|
+
export declare class QueryExecutor {
|
|
6
|
+
private pool;
|
|
7
|
+
constructor(pool?: ConnectionPoolManager);
|
|
8
|
+
getConnector(config: ConnectionConfig): Promise<DatabaseConnector>;
|
|
9
|
+
executeQuery(sql: string, params: SQLParamSpec[], variables: Record<string, unknown>, config: ConnectionConfig): Promise<QueryResult>;
|
|
10
|
+
executePositional(sql: string, paramValues: unknown[], config: ConnectionConfig): Promise<QueryResult>;
|
|
11
|
+
disconnect(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=query-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-executor.d.ts","sourceRoot":"","sources":["../src/query-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAA8C,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEhG,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAwB;gBAExB,IAAI,CAAC,EAAE,qBAAqB;IAIlC,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIlE,YAAY,CAChB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,YAAY,EAAE,EACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,WAAW,CAAC;IAKjB,iBAAiB,CACrB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,OAAO,EAAE,EACtB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,WAAW,CAAC;IASjB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ConnectionPoolManager } from './connection-pool.js';
|
|
2
|
+
import { buildParamValues, normalizeSQLPlaceholders } from './sql-params.js';
|
|
3
|
+
export class QueryExecutor {
|
|
4
|
+
pool;
|
|
5
|
+
constructor(pool) {
|
|
6
|
+
this.pool = pool ?? new ConnectionPoolManager();
|
|
7
|
+
}
|
|
8
|
+
async getConnector(config) {
|
|
9
|
+
return this.pool.getConnector(config);
|
|
10
|
+
}
|
|
11
|
+
async executeQuery(sql, params, variables, config) {
|
|
12
|
+
const paramValues = buildParamValues(params ?? [], variables ?? {});
|
|
13
|
+
return this.executePositional(sql, paramValues, config);
|
|
14
|
+
}
|
|
15
|
+
async executePositional(sql, paramValues, config) {
|
|
16
|
+
const connector = await this.pool.getConnector(config);
|
|
17
|
+
const normalizedSQL = normalizeSQLPlaceholders(sql, config.driver);
|
|
18
|
+
return connector.execute(normalizedSQL, paramValues && paramValues.length > 0 ? paramValues : undefined);
|
|
19
|
+
}
|
|
20
|
+
async disconnect() {
|
|
21
|
+
await this.pool.disconnectAll();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=query-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-executor.js","sourceRoot":"","sources":["../src/query-executor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAqB,MAAM,iBAAiB,CAAC;AAEhG,MAAM,OAAO,aAAa;IAChB,IAAI,CAAwB;IAEpC,YAAY,IAA4B;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,qBAAqB,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAwB;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,GAAW,EACX,MAAsB,EACtB,SAAkC,EAClC,MAAwB;QAExB,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,IAAI,EAAE,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,GAAW,EACX,WAAsB,EACtB,MAAwB;QAExB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,OAAO,SAAS,CAAC,OAAO,CACtB,aAAa,EACb,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAChE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ColumnType = 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'null' | 'unknown';
|
|
2
|
+
export interface ColumnMeta {
|
|
3
|
+
name: string;
|
|
4
|
+
type: ColumnType;
|
|
5
|
+
driverType: string;
|
|
6
|
+
}
|
|
7
|
+
export type Row = Record<string, unknown>;
|
|
8
|
+
export interface QueryResult {
|
|
9
|
+
columns: ColumnMeta[];
|
|
10
|
+
rows: Row[];
|
|
11
|
+
rowCount: number;
|
|
12
|
+
executionTimeMs: number;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=result-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-types.d.ts","sourceRoot":"","sources":["../src/result-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-types.js","sourceRoot":"","sources":["../src/result-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ConnectionConfig } from './connector.js';
|
|
2
|
+
export type SQLParamSpec = {
|
|
3
|
+
name: string;
|
|
4
|
+
position: number;
|
|
5
|
+
literalValue?: unknown;
|
|
6
|
+
};
|
|
7
|
+
export declare function buildParamValues(params: SQLParamSpec[], variables: Record<string, unknown>): unknown[];
|
|
8
|
+
/**
|
|
9
|
+
* Normalize "$N" placeholders emitted by the compiler to the placeholder syntax
|
|
10
|
+
* expected by each driver.
|
|
11
|
+
*
|
|
12
|
+
* - PostgreSQL: "$1" (no change)
|
|
13
|
+
* - MSSQL: keep "$N" (driver rewrites to "@pN" while binding)
|
|
14
|
+
* - Others (Snowflake/BigQuery/MySQL/SQLite/DuckDB): "?" positional
|
|
15
|
+
*/
|
|
16
|
+
export declare function normalizeSQLPlaceholders(sql: string, driver: ConnectionConfig['driver']): string;
|
|
17
|
+
//# sourceMappingURL=sql-params.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-params.d.ts","sourceRoot":"","sources":["../src/sql-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtF,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EAAE,EACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,EAAE,CAaX;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GACjC,MAAM,CAqER"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export function buildParamValues(params, variables) {
|
|
2
|
+
if (!params || params.length === 0)
|
|
3
|
+
return [];
|
|
4
|
+
return [...params]
|
|
5
|
+
.sort((a, b) => a.position - b.position)
|
|
6
|
+
.map((p) => {
|
|
7
|
+
if (Object.prototype.hasOwnProperty.call(variables, p.name)) {
|
|
8
|
+
return variables[p.name];
|
|
9
|
+
}
|
|
10
|
+
if (Object.prototype.hasOwnProperty.call(p, 'literalValue')) {
|
|
11
|
+
return p.literalValue;
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Normalize "$N" placeholders emitted by the compiler to the placeholder syntax
|
|
18
|
+
* expected by each driver.
|
|
19
|
+
*
|
|
20
|
+
* - PostgreSQL: "$1" (no change)
|
|
21
|
+
* - MSSQL: keep "$N" (driver rewrites to "@pN" while binding)
|
|
22
|
+
* - Others (Snowflake/BigQuery/MySQL/SQLite/DuckDB): "?" positional
|
|
23
|
+
*/
|
|
24
|
+
export function normalizeSQLPlaceholders(sql, driver) {
|
|
25
|
+
if (!sql)
|
|
26
|
+
return sql;
|
|
27
|
+
if (driver === 'postgresql' || driver === 'mssql')
|
|
28
|
+
return sql;
|
|
29
|
+
// Replace $N -> ? outside quoted regions.
|
|
30
|
+
let out = '';
|
|
31
|
+
let i = 0;
|
|
32
|
+
let inSingle = false;
|
|
33
|
+
let inDouble = false;
|
|
34
|
+
let inBacktick = false;
|
|
35
|
+
while (i < sql.length) {
|
|
36
|
+
const ch = sql[i];
|
|
37
|
+
// Handle quote toggles with basic SQL escaping.
|
|
38
|
+
if (ch === "'" && !inDouble && !inBacktick) {
|
|
39
|
+
out += ch;
|
|
40
|
+
// SQL single-quote escape: '' inside string literal.
|
|
41
|
+
if (inSingle && sql[i + 1] === "'") {
|
|
42
|
+
out += "'";
|
|
43
|
+
i += 2;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
inSingle = !inSingle;
|
|
47
|
+
i += 1;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (ch === '"' && !inSingle && !inBacktick) {
|
|
51
|
+
out += ch;
|
|
52
|
+
// Identifier escape: "" inside quoted identifier.
|
|
53
|
+
if (inDouble && sql[i + 1] === '"') {
|
|
54
|
+
out += '"';
|
|
55
|
+
i += 2;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
inDouble = !inDouble;
|
|
59
|
+
i += 1;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (ch === '`' && !inSingle && !inDouble) {
|
|
63
|
+
out += ch;
|
|
64
|
+
// BigQuery identifier escape: `` inside backticks.
|
|
65
|
+
if (inBacktick && sql[i + 1] === '`') {
|
|
66
|
+
out += '`';
|
|
67
|
+
i += 2;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
inBacktick = !inBacktick;
|
|
71
|
+
i += 1;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (!inSingle && !inDouble && !inBacktick && ch === '$') {
|
|
75
|
+
let j = i + 1;
|
|
76
|
+
if (j < sql.length && sql[j] >= '0' && sql[j] <= '9') {
|
|
77
|
+
while (j < sql.length && sql[j] >= '0' && sql[j] <= '9')
|
|
78
|
+
j++;
|
|
79
|
+
out += '?';
|
|
80
|
+
i = j;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
out += ch;
|
|
85
|
+
i += 1;
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=sql-params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-params.js","sourceRoot":"","sources":["../src/sql-params.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@duckcodeailabs/dql-connectors",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "DQL database connectors: PostgreSQL, SQLite, MySQL, BigQuery, Snowflake",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/duckcode-ai/dql.git",
|
|
21
|
+
"directory": "packages/dql-connectors"
|
|
22
|
+
},
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@google-cloud/bigquery": "^7.5.0",
|
|
28
|
+
"better-sqlite3": "^11.7.0",
|
|
29
|
+
"duckdb": "^1.1.0",
|
|
30
|
+
"mssql": "^11.0.0",
|
|
31
|
+
"mysql2": "^3.9.0",
|
|
32
|
+
"pg": "^8.13.0",
|
|
33
|
+
"snowflake-sdk": "^1.12.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/better-sqlite3": "^7.6.0",
|
|
37
|
+
"@types/mssql": "^9.1.9",
|
|
38
|
+
"@types/node": "^22.0.0",
|
|
39
|
+
"@types/pg": "^8.11.0",
|
|
40
|
+
"typescript": "^5.7.0",
|
|
41
|
+
"vitest": "^3.0.0"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "rm -rf dist tsconfig.tsbuildinfo && tsc",
|
|
45
|
+
"test": "vitest run --passWithNoTests",
|
|
46
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo"
|
|
47
|
+
}
|
|
48
|
+
}
|