@fett/sql-translator 0.0.1-beta
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/README.md +191 -0
- package/lib/client/client.d.ts +59 -0
- package/lib/client/client.d.ts.map +1 -0
- package/lib/client/client.js +201 -0
- package/lib/client/client.js.map +1 -0
- package/lib/client/index.d.ts +15 -0
- package/lib/client/index.d.ts.map +1 -0
- package/lib/client/index.js +15 -0
- package/lib/client/index.js.map +1 -0
- package/lib/client/manager.d.ts +27 -0
- package/lib/client/manager.d.ts.map +1 -0
- package/lib/client/manager.js +73 -0
- package/lib/client/manager.js.map +1 -0
- package/lib/client/registry.d.ts +31 -0
- package/lib/client/registry.d.ts.map +1 -0
- package/lib/client/registry.js +128 -0
- package/lib/client/registry.js.map +1 -0
- package/lib/core/cache.d.ts +28 -0
- package/lib/core/cache.d.ts.map +1 -0
- package/lib/core/cache.js +58 -0
- package/lib/core/cache.js.map +1 -0
- package/lib/core/config.d.ts +16 -0
- package/lib/core/config.d.ts.map +1 -0
- package/lib/core/config.js +47 -0
- package/lib/core/config.js.map +1 -0
- package/lib/core/field-mapper/mysql.d.ts +42 -0
- package/lib/core/field-mapper/mysql.d.ts.map +1 -0
- package/lib/core/field-mapper/mysql.js +129 -0
- package/lib/core/field-mapper/mysql.js.map +1 -0
- package/lib/core/field-mapper/postgresql.d.ts +25 -0
- package/lib/core/field-mapper/postgresql.d.ts.map +1 -0
- package/lib/core/field-mapper/postgresql.js +121 -0
- package/lib/core/field-mapper/postgresql.js.map +1 -0
- package/lib/core/sql/normalize.d.ts +10 -0
- package/lib/core/sql/normalize.d.ts.map +1 -0
- package/lib/core/sql/normalize.js +121 -0
- package/lib/core/sql/normalize.js.map +1 -0
- package/lib/core/sql/pagination.d.ts +22 -0
- package/lib/core/sql/pagination.d.ts.map +1 -0
- package/lib/core/sql/pagination.js +61 -0
- package/lib/core/sql/pagination.js.map +1 -0
- package/lib/core/sql/statement.d.ts +28 -0
- package/lib/core/sql/statement.d.ts.map +1 -0
- package/lib/core/sql/statement.js +155 -0
- package/lib/core/sql/statement.js.map +1 -0
- package/lib/core/sql/table-mapper.d.ts +24 -0
- package/lib/core/sql/table-mapper.d.ts.map +1 -0
- package/lib/core/sql/table-mapper.js +113 -0
- package/lib/core/sql/table-mapper.js.map +1 -0
- package/lib/core/task-queue.d.ts +31 -0
- package/lib/core/task-queue.d.ts.map +1 -0
- package/lib/core/task-queue.js +185 -0
- package/lib/core/task-queue.js.map +1 -0
- package/lib/core/worker/bun-worker.d.ts +21 -0
- package/lib/core/worker/bun-worker.d.ts.map +1 -0
- package/lib/core/worker/bun-worker.js +93 -0
- package/lib/core/worker/bun-worker.js.map +1 -0
- package/lib/core/worker/index.d.ts +16 -0
- package/lib/core/worker/index.d.ts.map +1 -0
- package/lib/core/worker/index.js +16 -0
- package/lib/core/worker/index.js.map +1 -0
- package/lib/core/worker/node-worker.d.ts +19 -0
- package/lib/core/worker/node-worker.d.ts.map +1 -0
- package/lib/core/worker/node-worker.js +94 -0
- package/lib/core/worker/node-worker.js.map +1 -0
- package/lib/core/worker/task-runner-bun.d.ts +2 -0
- package/lib/core/worker/task-runner-bun.d.ts.map +1 -0
- package/lib/core/worker/task-runner-bun.js +18 -0
- package/lib/core/worker/task-runner-bun.js.map +1 -0
- package/lib/core/worker/task-runner.d.ts +2 -0
- package/lib/core/worker/task-runner.d.ts.map +1 -0
- package/lib/core/worker/task-runner.js +21 -0
- package/lib/core/worker/task-runner.js.map +1 -0
- package/lib/driver/index.d.ts +3 -0
- package/lib/driver/index.d.ts.map +1 -0
- package/lib/driver/index.js +16 -0
- package/lib/driver/index.js.map +1 -0
- package/lib/driver/interface.d.ts +39 -0
- package/lib/driver/interface.d.ts.map +1 -0
- package/lib/driver/interface.js +2 -0
- package/lib/driver/interface.js.map +1 -0
- package/lib/driver/mongodb/dml-translator.d.ts +21 -0
- package/lib/driver/mongodb/dml-translator.d.ts.map +1 -0
- package/lib/driver/mongodb/dml-translator.js +127 -0
- package/lib/driver/mongodb/dml-translator.js.map +1 -0
- package/lib/driver/mongodb/index.d.ts +27 -0
- package/lib/driver/mongodb/index.d.ts.map +1 -0
- package/lib/driver/mongodb/index.js +263 -0
- package/lib/driver/mongodb/index.js.map +1 -0
- package/lib/driver/mongodb/pool.d.ts +31 -0
- package/lib/driver/mongodb/pool.d.ts.map +1 -0
- package/lib/driver/mongodb/pool.js +96 -0
- package/lib/driver/mongodb/pool.js.map +1 -0
- package/lib/driver/mongodb/schema.d.ts +37 -0
- package/lib/driver/mongodb/schema.d.ts.map +1 -0
- package/lib/driver/mongodb/schema.js +238 -0
- package/lib/driver/mongodb/schema.js.map +1 -0
- package/lib/driver/mongodb/sql-translator.d.ts +19 -0
- package/lib/driver/mongodb/sql-translator.d.ts.map +1 -0
- package/lib/driver/mongodb/sql-translator.js +30 -0
- package/lib/driver/mongodb/sql-translator.js.map +1 -0
- package/lib/driver/mysql/index.d.ts +41 -0
- package/lib/driver/mysql/index.d.ts.map +1 -0
- package/lib/driver/mysql/index.js +338 -0
- package/lib/driver/mysql/index.js.map +1 -0
- package/lib/driver/mysql/pool.d.ts +46 -0
- package/lib/driver/mysql/pool.d.ts.map +1 -0
- package/lib/driver/mysql/pool.js +141 -0
- package/lib/driver/mysql/pool.js.map +1 -0
- package/lib/driver/mysql/version.d.ts +27 -0
- package/lib/driver/mysql/version.d.ts.map +1 -0
- package/lib/driver/mysql/version.js +77 -0
- package/lib/driver/mysql/version.js.map +1 -0
- package/lib/driver/postgresql/index.d.ts +34 -0
- package/lib/driver/postgresql/index.d.ts.map +1 -0
- package/lib/driver/postgresql/index.js +383 -0
- package/lib/driver/postgresql/index.js.map +1 -0
- package/lib/driver/postgresql/pool.d.ts +33 -0
- package/lib/driver/postgresql/pool.d.ts.map +1 -0
- package/lib/driver/postgresql/pool.js +104 -0
- package/lib/driver/postgresql/pool.js.map +1 -0
- package/lib/driver/registry.d.ts +16 -0
- package/lib/driver/registry.d.ts.map +1 -0
- package/lib/driver/registry.js +27 -0
- package/lib/driver/registry.js.map +1 -0
- package/lib/driver/sqlite/backend.d.ts +19 -0
- package/lib/driver/sqlite/backend.d.ts.map +1 -0
- package/lib/driver/sqlite/backend.js +5 -0
- package/lib/driver/sqlite/backend.js.map +1 -0
- package/lib/driver/sqlite/bun.d.ts +10 -0
- package/lib/driver/sqlite/bun.d.ts.map +1 -0
- package/lib/driver/sqlite/bun.js +36 -0
- package/lib/driver/sqlite/bun.js.map +1 -0
- package/lib/driver/sqlite/index.d.ts +49 -0
- package/lib/driver/sqlite/index.d.ts.map +1 -0
- package/lib/driver/sqlite/index.js +421 -0
- package/lib/driver/sqlite/index.js.map +1 -0
- package/lib/driver/sqlite/node.d.ts +10 -0
- package/lib/driver/sqlite/node.d.ts.map +1 -0
- package/lib/driver/sqlite/node.js +37 -0
- package/lib/driver/sqlite/node.js.map +1 -0
- package/lib/driver/sqlite/store.d.ts +13 -0
- package/lib/driver/sqlite/store.d.ts.map +1 -0
- package/lib/driver/sqlite/store.js +57 -0
- package/lib/driver/sqlite/store.js.map +1 -0
- package/lib/errors.d.ts +18 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +24 -0
- package/lib/errors.js.map +1 -0
- package/lib/facade/engine.d.ts +29 -0
- package/lib/facade/engine.d.ts.map +1 -0
- package/lib/facade/engine.js +107 -0
- package/lib/facade/engine.js.map +1 -0
- package/lib/index.d.ts +41 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +40 -0
- package/lib/index.js.map +1 -0
- package/lib/optional/static-source.d.ts +36 -0
- package/lib/optional/static-source.d.ts.map +1 -0
- package/lib/optional/static-source.js +141 -0
- package/lib/optional/static-source.js.map +1 -0
- package/lib/runtime.d.ts +12 -0
- package/lib/runtime.d.ts.map +1 -0
- package/lib/runtime.js +26 -0
- package/lib/runtime.js.map +1 -0
- package/lib/types/config.d.ts +146 -0
- package/lib/types/config.d.ts.map +1 -0
- package/lib/types/config.js +5 -0
- package/lib/types/config.js.map +1 -0
- package/lib/types/index.d.ts +7 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +7 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/manager.d.ts +37 -0
- package/lib/types/manager.d.ts.map +1 -0
- package/lib/types/manager.js +5 -0
- package/lib/types/manager.js.map +1 -0
- package/lib/types/queue.d.ts +45 -0
- package/lib/types/queue.d.ts.map +1 -0
- package/lib/types/queue.js +5 -0
- package/lib/types/queue.js.map +1 -0
- package/lib/types/result.d.ts +61 -0
- package/lib/types/result.d.ts.map +1 -0
- package/lib/types/result.js +16 -0
- package/lib/types/result.js.map +1 -0
- package/lib/types/schema.d.ts +51 -0
- package/lib/types/schema.d.ts.map +1 -0
- package/lib/types/schema.js +5 -0
- package/lib/types/schema.js.map +1 -0
- package/lib/types/task.d.ts +48 -0
- package/lib/types/task.d.ts.map +1 -0
- package/lib/types/task.js +136 -0
- package/lib/types/task.js.map +1 -0
- package/lib/types/transaction.d.ts +13 -0
- package/lib/types/transaction.d.ts.map +1 -0
- package/lib/types/transaction.js +2 -0
- package/lib/types/transaction.js.map +1 -0
- package/package.json +93 -0
- package/patches/bson@7.3.2.patch +105 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export const MYSQL5_CAPS = {
|
|
2
|
+
major: 5,
|
|
3
|
+
supportsCTE: false,
|
|
4
|
+
supportsWindowFunctions: false,
|
|
5
|
+
supportsJson: true,
|
|
6
|
+
};
|
|
7
|
+
export const MYSQL8_CAPS = {
|
|
8
|
+
major: 8,
|
|
9
|
+
supportsCTE: true,
|
|
10
|
+
supportsWindowFunctions: true,
|
|
11
|
+
supportsJson: true,
|
|
12
|
+
};
|
|
13
|
+
/** 解析 VERSION() 字符串 → 能力矩阵 */
|
|
14
|
+
export function parseMysqlVersion(version) {
|
|
15
|
+
const m = String(version || '').match(/^(\d+)\.(\d+)\.(\d+)/);
|
|
16
|
+
if (!m)
|
|
17
|
+
return { major: 0, supportsCTE: false, supportsWindowFunctions: false, supportsJson: false };
|
|
18
|
+
const major = Number(m[1]);
|
|
19
|
+
const minor = Number(m[2]);
|
|
20
|
+
const patch = Number(m[3]);
|
|
21
|
+
return {
|
|
22
|
+
major,
|
|
23
|
+
supportsCTE: major >= 8,
|
|
24
|
+
supportsWindowFunctions: major >= 8,
|
|
25
|
+
supportsJson: major > 5 || (major === 5 && (minor > 7 || (minor === 7 && patch >= 8))),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** 通过 SELECT VERSION() 探测(knex raw 对 mysql2 返回 [rows, fields]) */
|
|
29
|
+
export async function detectMysqlVersion(k) {
|
|
30
|
+
const res = (await k.raw('SELECT VERSION() AS v'));
|
|
31
|
+
const rows = (Array.isArray(res) ? res[0] : res);
|
|
32
|
+
const version = rows?.[0]?.v ?? '';
|
|
33
|
+
return parseMysqlVersion(version);
|
|
34
|
+
}
|
|
35
|
+
/** 解析 MariaDB VERSION() → 能力矩阵(10.2+ CTE / 10.3+ 窗口函数 / 10.2+ JSON) */
|
|
36
|
+
export function parseMariaDbVersion(version) {
|
|
37
|
+
// MariaDB 常见格式:'10.11.4-MariaDB'、'5.5.5-10.6.12-MariaDB-0+deb11u1'
|
|
38
|
+
const m = String(version || '').match(/(\d+)\.(\d+)\.(\d+)/);
|
|
39
|
+
if (!m)
|
|
40
|
+
return { major: 0, supportsCTE: false, supportsWindowFunctions: false, supportsJson: false };
|
|
41
|
+
const major = Number(m[1]);
|
|
42
|
+
const minor = Number(m[2]);
|
|
43
|
+
return {
|
|
44
|
+
major,
|
|
45
|
+
supportsCTE: major >= 10 && minor >= 2,
|
|
46
|
+
supportsWindowFunctions: major >= 10 && minor >= 3,
|
|
47
|
+
supportsJson: major >= 10 && minor >= 2,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** 探测 VERSION() 原始字符串 */
|
|
51
|
+
export async function detectVersionString(k) {
|
|
52
|
+
const res = (await k.raw('SELECT VERSION() AS v'));
|
|
53
|
+
const rows = (Array.isArray(res) ? res[0] : res);
|
|
54
|
+
return rows?.[0]?.v ?? '';
|
|
55
|
+
}
|
|
56
|
+
/** 按 config.version 解析能力(强制模式 / auto 探测;isMariaDb 决定解析器) */
|
|
57
|
+
export async function resolveMysqlCapabilities(k, versionChoice, isMariaDb = false) {
|
|
58
|
+
if (!isMariaDb) {
|
|
59
|
+
if (versionChoice === '5')
|
|
60
|
+
return MYSQL5_CAPS;
|
|
61
|
+
if (versionChoice === '8')
|
|
62
|
+
return MYSQL8_CAPS;
|
|
63
|
+
return detectMysqlVersion(k);
|
|
64
|
+
}
|
|
65
|
+
// MariaDB:强制模式 10/11 走对应矩阵,auto 探测
|
|
66
|
+
const mariaMajor = versionChoice === '10' ? 10 : versionChoice === '11' ? 11 : 0;
|
|
67
|
+
if (mariaMajor) {
|
|
68
|
+
return {
|
|
69
|
+
major: mariaMajor,
|
|
70
|
+
supportsCTE: true,
|
|
71
|
+
supportsWindowFunctions: mariaMajor >= 11,
|
|
72
|
+
supportsJson: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return parseMariaDbVersion(await detectVersionString(k));
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/driver/mysql/version.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { SqlDriver, PoolHandle } from '../interface.js';
|
|
2
|
+
import type { PostgresqlConfig, SchemaOptions } from '../../types/config.js';
|
|
3
|
+
import type { ExecResult, Field, RunSqlRequest, TestResult } from '../../types/result.js';
|
|
4
|
+
import type { TableSchema } from '../../types/schema.js';
|
|
5
|
+
import type { IntrospectTask } from '../../types/task.js';
|
|
6
|
+
import type { TransactionHandle } from '../../types/transaction.js';
|
|
7
|
+
import { PostgresqlPoolHandle } from './pool.js';
|
|
8
|
+
type Knex = Awaited<ReturnType<PostgresqlPoolHandle['getKnex']>>;
|
|
9
|
+
/** PG $n 占位符 → knex '?'(knex pg 只支持 ? bindings) */
|
|
10
|
+
export declare function pgParamsToQuestion(sql: string): string;
|
|
11
|
+
export declare class PostgresqlDriver implements SqlDriver {
|
|
12
|
+
readonly dialect = "postgresql";
|
|
13
|
+
createPool(config: PostgresqlConfig): Promise<PoolHandle>;
|
|
14
|
+
testConnection(config: PostgresqlConfig): Promise<TestResult>;
|
|
15
|
+
getTableList(pool: PoolHandle): Promise<string[]>;
|
|
16
|
+
getTableDDL(pool: PoolHandle, table: string): Promise<string>;
|
|
17
|
+
getPreviewRows(pool: PoolHandle, table: string, offset: number, limit: number, whereClause?: string): Promise<any[]>;
|
|
18
|
+
getColumns(pool: PoolHandle, table: string): Promise<Field[]>;
|
|
19
|
+
getRowsCount(pool: PoolHandle, table: string, whereClause?: string): Promise<number>;
|
|
20
|
+
runSql(pool: PoolHandle, request: RunSqlRequest): Promise<ExecResult>;
|
|
21
|
+
/** 事务/常规共用执行核心(k 可指定为事务连接) */
|
|
22
|
+
runSqlWithKnex(k: Knex, handle: PostgresqlPoolHandle, request: RunSqlRequest): Promise<ExecResult>;
|
|
23
|
+
/** 事务:knex.transaction(fn 抛错自动回滚,成功自动提交) */
|
|
24
|
+
withTransaction<T>(pool: PoolHandle, fn: (tx: TransactionHandle) => Promise<T>): Promise<T>;
|
|
25
|
+
private bind;
|
|
26
|
+
private runSelect;
|
|
27
|
+
private mapFields;
|
|
28
|
+
private runDml;
|
|
29
|
+
getTableSchema(pool: PoolHandle, table: string): Promise<TableSchema>;
|
|
30
|
+
getAllTableSchemas(pool: PoolHandle, opts?: SchemaOptions): IntrospectTask<TableSchema[]>;
|
|
31
|
+
}
|
|
32
|
+
export declare const postgresqlDriver: PostgresqlDriver;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/driver/postgresql/index.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EACV,UAAU,EACV,KAAK,EAEL,aAAa,EACb,UAAU,EAEX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAA+C,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACtG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAoB,MAAM,WAAW,CAAC;AAEnE,KAAK,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAEjE,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAmBD,qBAAa,gBAAiB,YAAW,SAAS;IAChD,QAAQ,CAAC,OAAO,gBAAgB;IAE1B,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IASzD,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAiC7D,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAUjD,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB7D,cAAc,CAClB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,GAAG,EAAE,CAAC;IAQX,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IA+B7D,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWpF,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IAM3E,8BAA8B;IAC9B,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IAsBlG,4CAA4C;IACtC,eAAe,CAAC,CAAC,EACrB,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC;IAsBb,OAAO,CAAC,IAAI;YAIE,SAAS;YAwCT,SAAS;YAaT,MAAM;IA+Cd,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA6H3E,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;CAoB1F;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL 驱动
|
|
3
|
+
* 元数据:pg_tables / information_schema / pg_type OID 解析
|
|
4
|
+
* 执行:SELECT 分页(CTE 包装)、DML(rowCount + RETURNING)、DDL 透传
|
|
5
|
+
*/
|
|
6
|
+
import knex from 'knex';
|
|
7
|
+
import { SqlEngineError, wrapError } from '../../errors.js';
|
|
8
|
+
import { normalizeSql } from '../../core/sql/normalize.js';
|
|
9
|
+
import { hasPaginationClause, buildPagedSql, buildCountSql, wrapWithWhereClause, } from '../../core/sql/pagination.js';
|
|
10
|
+
import { detectStatementType, isDmlStatement, hasDmlWhere, countInsertValueRows, } from '../../core/sql/statement.js';
|
|
11
|
+
import { createTask } from '../../types/task.js';
|
|
12
|
+
import { mapPostgresColumnsToFields } from '../../core/field-mapper/postgresql.js';
|
|
13
|
+
import { PostgresqlPoolHandle, buildPgSslConfig } from './pool.js';
|
|
14
|
+
/** PG $n 占位符 → knex '?'(knex pg 只支持 ? bindings) */
|
|
15
|
+
export function pgParamsToQuestion(sql) {
|
|
16
|
+
return String(sql).replace(/\$(\d+)/g, '?');
|
|
17
|
+
}
|
|
18
|
+
/** 批量解析 OID → typname */
|
|
19
|
+
async function resolvePostgresTypeOids(k, oids) {
|
|
20
|
+
const map = new Map();
|
|
21
|
+
if (!oids.length)
|
|
22
|
+
return map;
|
|
23
|
+
const res = (await k.raw('SELECT oid, typname FROM pg_type WHERE oid = ANY(?)', [oids]));
|
|
24
|
+
for (const row of res.rows || [])
|
|
25
|
+
map.set(row.oid, row.typname);
|
|
26
|
+
return map;
|
|
27
|
+
}
|
|
28
|
+
export class PostgresqlDriver {
|
|
29
|
+
dialect = 'postgresql';
|
|
30
|
+
async createPool(config) {
|
|
31
|
+
if (config.type !== 'postgresql') {
|
|
32
|
+
throw new SqlEngineError('UNSUPPORTED_DIALECT', `postgresql 驱动收到 ${config.type} 配置`);
|
|
33
|
+
}
|
|
34
|
+
return new PostgresqlPoolHandle(config);
|
|
35
|
+
}
|
|
36
|
+
// ==================== 连接测试 ====================
|
|
37
|
+
async testConnection(config) {
|
|
38
|
+
let k = null;
|
|
39
|
+
try {
|
|
40
|
+
k = knex({
|
|
41
|
+
client: 'pg',
|
|
42
|
+
connection: {
|
|
43
|
+
host: config.host,
|
|
44
|
+
port: Number(config.port ?? 5432),
|
|
45
|
+
user: config.user || config.username,
|
|
46
|
+
password: config.password,
|
|
47
|
+
database: config.database,
|
|
48
|
+
ssl: buildPgSslConfig(config),
|
|
49
|
+
connectionTimeoutMillis: 5000,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
await k.raw('SELECT 1');
|
|
53
|
+
return { success: true, message: 'PostgreSQL connection test successful' };
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
const e = err;
|
|
57
|
+
return { success: false, message: `PostgreSQL connection test failed: ${e.message}` };
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
if (k) {
|
|
61
|
+
try {
|
|
62
|
+
await k.destroy();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// ignore
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ==================== 元信息 ====================
|
|
71
|
+
async getTableList(pool) {
|
|
72
|
+
const k = await pool.getKnex();
|
|
73
|
+
const schema = pool.config.schema || 'public';
|
|
74
|
+
const res = (await k.raw('SELECT tablename FROM pg_tables WHERE schemaname = ? ORDER BY tablename', [schema]));
|
|
75
|
+
return (res.rows || []).map((r) => r.tablename);
|
|
76
|
+
}
|
|
77
|
+
async getTableDDL(pool, table) {
|
|
78
|
+
const k = await pool.getKnex();
|
|
79
|
+
const schema = pool.config.schema || 'public';
|
|
80
|
+
const res = (await k.raw(`SELECT column_name, data_type, character_maximum_length,
|
|
81
|
+
numeric_precision, numeric_scale, is_nullable, column_default
|
|
82
|
+
FROM information_schema.columns
|
|
83
|
+
WHERE table_schema = ? AND table_name = ?
|
|
84
|
+
ORDER BY ordinal_position`, [schema, table]));
|
|
85
|
+
const columns = res.rows || [];
|
|
86
|
+
if (!columns.length)
|
|
87
|
+
return '';
|
|
88
|
+
const lines = columns.map((col) => {
|
|
89
|
+
let typeStr = col.data_type;
|
|
90
|
+
if (col.character_maximum_length)
|
|
91
|
+
typeStr += `(${col.character_maximum_length})`;
|
|
92
|
+
if (col.numeric_precision && col.numeric_scale)
|
|
93
|
+
typeStr += `(${col.numeric_precision},${col.numeric_scale})`;
|
|
94
|
+
const nullable = col.is_nullable === 'YES' ? '' : ' NOT NULL';
|
|
95
|
+
const defaultVal = col.column_default ? ` DEFAULT ${col.column_default}` : '';
|
|
96
|
+
return ` "${col.column_name}" ${typeStr}${nullable}${defaultVal}`;
|
|
97
|
+
});
|
|
98
|
+
return `CREATE TABLE "${table}" (\n${lines.join(',\n')}\n);`;
|
|
99
|
+
}
|
|
100
|
+
async getPreviewRows(pool, table, offset, limit, whereClause) {
|
|
101
|
+
const k = await pool.getKnex();
|
|
102
|
+
let query = k(table).select('*');
|
|
103
|
+
if (whereClause)
|
|
104
|
+
query = query.whereRaw(whereClause);
|
|
105
|
+
const rows = await query.limit(limit).offset(offset);
|
|
106
|
+
return rows;
|
|
107
|
+
}
|
|
108
|
+
async getColumns(pool, table) {
|
|
109
|
+
const k = await pool.getKnex();
|
|
110
|
+
const schema = pool.config.schema || 'public';
|
|
111
|
+
const res = (await k.raw(`SELECT
|
|
112
|
+
c.column_name AS "Field",
|
|
113
|
+
c.data_type AS "Type",
|
|
114
|
+
c.is_nullable AS "Null",
|
|
115
|
+
c.column_default AS "Default",
|
|
116
|
+
col_description(
|
|
117
|
+
(quote_ident(c.table_schema) || '.' || quote_ident(c.table_name))::regclass,
|
|
118
|
+
c.ordinal_position
|
|
119
|
+
) AS "Comment",
|
|
120
|
+
(CASE WHEN EXISTS (
|
|
121
|
+
SELECT 1 FROM information_schema.table_constraints tc
|
|
122
|
+
JOIN information_schema.key_column_usage kcu
|
|
123
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
124
|
+
AND tc.table_schema = kcu.table_schema
|
|
125
|
+
WHERE tc.constraint_type = 'PRIMARY KEY'
|
|
126
|
+
AND tc.table_schema = ?
|
|
127
|
+
AND kcu.table_name = ?
|
|
128
|
+
AND kcu.column_name = c.column_name
|
|
129
|
+
) THEN 'PRI' ELSE '' END) AS "Key"
|
|
130
|
+
FROM information_schema.columns c
|
|
131
|
+
WHERE c.table_schema = ? AND c.table_name = ?
|
|
132
|
+
ORDER BY c.ordinal_position`, [schema, table, schema, table]));
|
|
133
|
+
return mapPostgresColumnsToFields((res.rows || []));
|
|
134
|
+
}
|
|
135
|
+
async getRowsCount(pool, table, whereClause) {
|
|
136
|
+
const k = await pool.getKnex();
|
|
137
|
+
let query = k(table).count({ total: '*' });
|
|
138
|
+
if (whereClause)
|
|
139
|
+
query = query.whereRaw(whereClause);
|
|
140
|
+
const row = await query.first();
|
|
141
|
+
const total = row ? Number(row.total) : 0;
|
|
142
|
+
return Number.isNaN(total) ? 0 : total;
|
|
143
|
+
}
|
|
144
|
+
// ==================== SQL 执行 ====================
|
|
145
|
+
async runSql(pool, request) {
|
|
146
|
+
const handle = pool;
|
|
147
|
+
const k = await handle.getKnex();
|
|
148
|
+
return this.runSqlWithKnex(k, handle, request);
|
|
149
|
+
}
|
|
150
|
+
/** 事务/常规共用执行核心(k 可指定为事务连接) */
|
|
151
|
+
runSqlWithKnex(k, handle, request) {
|
|
152
|
+
const sql = pgParamsToQuestion(normalizeSql(request.sql));
|
|
153
|
+
const type = detectStatementType(sql);
|
|
154
|
+
try {
|
|
155
|
+
if (isDmlStatement(type)) {
|
|
156
|
+
return this.runDml(handle, k, sql, request.params, type, request.dml);
|
|
157
|
+
}
|
|
158
|
+
if (type === 'SELECT') {
|
|
159
|
+
return this.runSelect(k, sql, request);
|
|
160
|
+
}
|
|
161
|
+
if (type === 'DDL' || type === 'TRANSACTION') {
|
|
162
|
+
return k.raw(sql, this.bind(request.params)).then((res) => ({
|
|
163
|
+
affectedRows: Number(res.rowCount ?? 0),
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
throw new SqlEngineError('QUERY_FAILED', `暂不支持执行 ${type} 语句`);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
if (err instanceof SqlEngineError)
|
|
170
|
+
return Promise.reject(err);
|
|
171
|
+
return Promise.reject(wrapError('QUERY_FAILED', err));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** 事务:knex.transaction(fn 抛错自动回滚,成功自动提交) */
|
|
175
|
+
async withTransaction(pool, fn) {
|
|
176
|
+
const handle = pool;
|
|
177
|
+
const k = await handle.getKnex();
|
|
178
|
+
const self = this;
|
|
179
|
+
return k.transaction(async (trx) => {
|
|
180
|
+
const tx = {
|
|
181
|
+
runSql: (req) => self.runSqlWithKnex(trx, handle, req),
|
|
182
|
+
query: (sql, params) => self.runSqlWithKnex(trx, handle, { sql, params }),
|
|
183
|
+
execute: (sql, params) => self.runSqlWithKnex(trx, handle, { sql, params }),
|
|
184
|
+
commit: async () => {
|
|
185
|
+
await trx.commit();
|
|
186
|
+
},
|
|
187
|
+
rollback: async () => {
|
|
188
|
+
await trx.rollback();
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
return fn(tx);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
bind(params) {
|
|
195
|
+
return (params ?? []);
|
|
196
|
+
}
|
|
197
|
+
async runSelect(k, sql, request) {
|
|
198
|
+
const offset = Math.max(Number(request.offset ?? 0), 0);
|
|
199
|
+
const limit = Math.max(Number(request.limit ?? 100), 0);
|
|
200
|
+
const params = this.bind(request.params);
|
|
201
|
+
let baseSql = sql;
|
|
202
|
+
if (request.whereClause) {
|
|
203
|
+
baseSql = wrapWithWhereClause(sql, request.whereClause, { supportsCTE: true }); // PG 8.4+
|
|
204
|
+
}
|
|
205
|
+
// 用户 SQL 自带分页 → 直接执行
|
|
206
|
+
if (hasPaginationClause(baseSql, [/\bfetch\s+first\b/i, /\btop\b/i])) {
|
|
207
|
+
const res = (await k.raw(baseSql, params));
|
|
208
|
+
const fields = await this.mapFields(k, res.fields || []);
|
|
209
|
+
return { rows: res.rows, fields, total: res.rows.length, offset, limit };
|
|
210
|
+
}
|
|
211
|
+
const countRes = (await k.raw(buildCountSql(baseSql), params));
|
|
212
|
+
const total = Number(countRes.rows?.[0]?.total ?? 0);
|
|
213
|
+
const pageRes = (await k.raw(buildPagedSql(baseSql, limit, offset), params));
|
|
214
|
+
const fields = await this.mapFields(k, pageRes.fields || []);
|
|
215
|
+
return {
|
|
216
|
+
rows: pageRes.rows,
|
|
217
|
+
fields,
|
|
218
|
+
total: Number.isNaN(total) ? 0 : total,
|
|
219
|
+
offset,
|
|
220
|
+
limit,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
async mapFields(k, rawFields) {
|
|
224
|
+
const oidMap = await resolvePostgresTypeOids(k, rawFields.map((f) => f.dataTypeID).filter(Boolean));
|
|
225
|
+
const columns = rawFields.map((field) => ({
|
|
226
|
+
Field: field.name,
|
|
227
|
+
Type: oidMap.get(field.dataTypeID) || 'text',
|
|
228
|
+
Default: null,
|
|
229
|
+
}));
|
|
230
|
+
return mapPostgresColumnsToFields(columns);
|
|
231
|
+
}
|
|
232
|
+
async runDml(handle, k, sql, params, type, dmlOverride) {
|
|
233
|
+
const dml = dmlOverride ?? handle.config.dml ?? {};
|
|
234
|
+
const args = this.bind(params);
|
|
235
|
+
if ((type === 'UPDATE' || type === 'DELETE') &&
|
|
236
|
+
dml.requireWhereForUpdateDelete !== false &&
|
|
237
|
+
!hasDmlWhere(sql)) {
|
|
238
|
+
throw new SqlEngineError('DML_BLOCKED', `禁止无 WHERE 的 ${type}(config.dml.requireWhereForUpdateDelete 可关闭)`);
|
|
239
|
+
}
|
|
240
|
+
if (type === 'INSERT' && dml.maxInsertRows) {
|
|
241
|
+
const rows = countInsertValueRows(sql);
|
|
242
|
+
if (rows > dml.maxInsertRows) {
|
|
243
|
+
throw new SqlEngineError('DML_BLOCKED', `INSERT 行数 ${rows} 超过上限 ${dml.maxInsertRows}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
let execSql = sql;
|
|
247
|
+
const hasReturning = /\breturning\b/i.test(sql);
|
|
248
|
+
const needReturning = dml.returning && !hasReturning;
|
|
249
|
+
if (needReturning) {
|
|
250
|
+
execSql = `${sql} RETURNING *`;
|
|
251
|
+
}
|
|
252
|
+
const res = (await k.raw(execSql, args));
|
|
253
|
+
const writeResult = { affectedRows: Number(res.rowCount ?? 0) };
|
|
254
|
+
// SQL 自带 RETURNING 或 dml.returning → 回传被写行
|
|
255
|
+
if (hasReturning || needReturning) {
|
|
256
|
+
writeResult.returning = res.rows || [];
|
|
257
|
+
writeResult.affectedRows = writeResult.returning.length;
|
|
258
|
+
}
|
|
259
|
+
return writeResult;
|
|
260
|
+
}
|
|
261
|
+
// ==================== 结构 JSON 检出 ====================
|
|
262
|
+
async getTableSchema(pool, table) {
|
|
263
|
+
const handle = pool;
|
|
264
|
+
const k = await handle.getKnex();
|
|
265
|
+
const schema = handle.config.schema || 'public';
|
|
266
|
+
// 字段(复用 getColumns 的查询,扩展序号与注释)
|
|
267
|
+
const colRes = (await k.raw(`SELECT
|
|
268
|
+
c.column_name AS "Field", c.data_type AS "Type", c.is_nullable AS "Null",
|
|
269
|
+
c.column_default AS "Default", c.ordinal_position,
|
|
270
|
+
col_description((quote_ident(c.table_schema) || '.' || quote_ident(c.table_name))::regclass, c.ordinal_position) AS "Comment",
|
|
271
|
+
(CASE WHEN EXISTS (
|
|
272
|
+
SELECT 1 FROM information_schema.table_constraints tc
|
|
273
|
+
JOIN information_schema.key_column_usage kcu
|
|
274
|
+
ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
|
|
275
|
+
WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_schema = ? AND kcu.table_name = ? AND kcu.column_name = c.column_name
|
|
276
|
+
) THEN 'PRI' ELSE '' END) AS "Key"
|
|
277
|
+
FROM information_schema.columns c
|
|
278
|
+
WHERE c.table_schema = ? AND c.table_name = ?
|
|
279
|
+
ORDER BY c.ordinal_position`, [schema, table, schema, table]));
|
|
280
|
+
const columns = colRes.rows || [];
|
|
281
|
+
if (!columns.length) {
|
|
282
|
+
throw new SqlEngineError('TABLE_NOT_FOUND', `表 ${table} 不存在`);
|
|
283
|
+
}
|
|
284
|
+
// 索引
|
|
285
|
+
const idxRes = (await k.raw(`SELECT i.relname AS index_name, ix.indisunique AS is_unique,
|
|
286
|
+
x.attname AS column_name, ix.indkey
|
|
287
|
+
FROM pg_index ix
|
|
288
|
+
JOIN pg_class t ON t.oid = ix.indrelid
|
|
289
|
+
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
290
|
+
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
291
|
+
JOIN unnest(ix.indkey) WITH ORDINALITY AS k(attnum, ord) ON true
|
|
292
|
+
JOIN pg_attribute x ON x.attrelid = t.oid AND x.attnum = k.attnum
|
|
293
|
+
WHERE n.nspname = ? AND t.relname = ?
|
|
294
|
+
ORDER BY i.relname, k.ord`, [schema, table]));
|
|
295
|
+
const indexMap = new Map();
|
|
296
|
+
for (const r of idxRes.rows || []) {
|
|
297
|
+
let idx = indexMap.get(r.index_name);
|
|
298
|
+
if (!idx) {
|
|
299
|
+
idx = { name: r.index_name, unique: r.is_unique, columns: [], type: undefined };
|
|
300
|
+
indexMap.set(r.index_name, idx);
|
|
301
|
+
}
|
|
302
|
+
idx.columns.push(r.column_name);
|
|
303
|
+
}
|
|
304
|
+
// 外键
|
|
305
|
+
const fkRes = (await k.raw(`SELECT tc.constraint_name, kcu.column_name AS column_name,
|
|
306
|
+
ccu.table_name AS ref_table, ccu.column_name AS ref_column,
|
|
307
|
+
rc.delete_rule, rc.update_rule
|
|
308
|
+
FROM information_schema.table_constraints tc
|
|
309
|
+
JOIN information_schema.key_column_usage kcu
|
|
310
|
+
ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
|
|
311
|
+
JOIN information_schema.constraint_column_usage ccu
|
|
312
|
+
ON ccu.constraint_name = tc.constraint_name AND ccu.table_schema = tc.table_schema
|
|
313
|
+
JOIN information_schema.referential_constraints rc
|
|
314
|
+
ON rc.constraint_name = tc.constraint_name AND rc.constraint_schema = tc.table_schema
|
|
315
|
+
WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = ? AND tc.table_name = ?
|
|
316
|
+
ORDER BY tc.constraint_name, kcu.ordinal_position`, [schema, table]));
|
|
317
|
+
const fkMap = new Map();
|
|
318
|
+
for (const r of fkRes.rows || []) {
|
|
319
|
+
let fk = fkMap.get(r.constraint_name);
|
|
320
|
+
if (!fk) {
|
|
321
|
+
fk = {
|
|
322
|
+
name: r.constraint_name,
|
|
323
|
+
columns: [],
|
|
324
|
+
refTable: r.ref_table,
|
|
325
|
+
refColumns: [],
|
|
326
|
+
onDelete: r.delete_rule || undefined,
|
|
327
|
+
onUpdate: r.update_rule || undefined,
|
|
328
|
+
};
|
|
329
|
+
fkMap.set(r.constraint_name, fk);
|
|
330
|
+
}
|
|
331
|
+
fk.columns.push(r.column_name);
|
|
332
|
+
fk.refColumns.push(r.ref_column);
|
|
333
|
+
}
|
|
334
|
+
// 表注释
|
|
335
|
+
const cmtRes = (await k.raw(`SELECT obj_description((quote_ident(?) || '.' || quote_ident(?))::regclass) AS comment`, [schema, table]));
|
|
336
|
+
const comment = cmtRes.rows?.[0]?.comment || undefined;
|
|
337
|
+
const columnSchemas = columns.map((c) => ({
|
|
338
|
+
name: c.Field,
|
|
339
|
+
type: String(c.Type),
|
|
340
|
+
nullable: c.Null === 'YES',
|
|
341
|
+
default: c.Default,
|
|
342
|
+
comment: c.Comment || undefined,
|
|
343
|
+
primaryKey: String(c.Key || '').toUpperCase() === 'PRI',
|
|
344
|
+
autoIncrement: false, // PG 无列级 auto_increment 概念(serial 反映在 default)
|
|
345
|
+
ordinal: Number(c.ordinal_position),
|
|
346
|
+
}));
|
|
347
|
+
return {
|
|
348
|
+
name: table,
|
|
349
|
+
schema,
|
|
350
|
+
kind: 'table',
|
|
351
|
+
comment,
|
|
352
|
+
columns: columnSchemas,
|
|
353
|
+
indexes: [...indexMap.values()],
|
|
354
|
+
foreignKeys: [...fkMap.values()],
|
|
355
|
+
ddl: await this.getTableDDL(handle, table),
|
|
356
|
+
raw: {},
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
getAllTableSchemas(pool, opts) {
|
|
360
|
+
const handle = pool;
|
|
361
|
+
const self = this;
|
|
362
|
+
return createTask(async (ctx) => {
|
|
363
|
+
const tables = await self.getTableList(handle);
|
|
364
|
+
const total = tables.length;
|
|
365
|
+
const schemas = [];
|
|
366
|
+
for (let i = 0; i < tables.length; i++) {
|
|
367
|
+
if (ctx.isCancelled())
|
|
368
|
+
break;
|
|
369
|
+
ctx.report({ stage: 'introspecting', processed: i, total, message: tables[i] });
|
|
370
|
+
try {
|
|
371
|
+
schemas.push(await self.getTableSchema(handle, tables[i]));
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
// 单表失败不中断
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
void opts;
|
|
378
|
+
return schemas;
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
export const postgresqlDriver = new PostgresqlDriver();
|
|
383
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/driver/postgresql/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL 连接池句柄(Knex/pg)
|
|
3
|
+
*/
|
|
4
|
+
import { type Knex } from 'knex';
|
|
5
|
+
import type { PoolHandle } from '../interface.js';
|
|
6
|
+
import type { PostgresqlConfig } from '../../types/config.js';
|
|
7
|
+
/** 构建 PostgreSQL SSL 配置 */
|
|
8
|
+
export declare function buildPgSslConfig(config: PostgresqlConfig): {
|
|
9
|
+
ca: string | undefined;
|
|
10
|
+
cert: string | undefined;
|
|
11
|
+
key: string | undefined;
|
|
12
|
+
rejectUnauthorized: boolean;
|
|
13
|
+
} | undefined;
|
|
14
|
+
export declare class PostgresqlPoolHandle implements PoolHandle {
|
|
15
|
+
readonly fingerprint: string;
|
|
16
|
+
readonly config: PostgresqlConfig;
|
|
17
|
+
private knexInstance;
|
|
18
|
+
private destroyedFlag;
|
|
19
|
+
constructor(config: PostgresqlConfig);
|
|
20
|
+
get destroyed(): boolean;
|
|
21
|
+
/** 获取 Knex 实例(懒创建) */
|
|
22
|
+
getKnex(): Promise<Knex>;
|
|
23
|
+
get stats(): {
|
|
24
|
+
active: number;
|
|
25
|
+
idle: number;
|
|
26
|
+
waiting: number;
|
|
27
|
+
createdTotal: number;
|
|
28
|
+
destroyedTotal: number;
|
|
29
|
+
};
|
|
30
|
+
ping(): Promise<void>;
|
|
31
|
+
destroy(): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../src/driver/postgresql/pool.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAa,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,2BAA2B;AAC3B,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB;;;;;cAQxD;AAED,qBAAa,oBAAqB,YAAW,UAAU;IACrD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,aAAa,CAAS;gBAElB,MAAM,EAAE,gBAAgB;IAKpC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,sBAAsB;IAChB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoC9B,IAAI,KAAK;;;;;;MAqBR;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAY/B"}
|