@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,21 @@
|
|
|
1
|
+
import type { Document } from 'mongodb';
|
|
2
|
+
export interface MongoDmlSpec {
|
|
3
|
+
type: 'insert' | 'update' | 'delete';
|
|
4
|
+
collection: string;
|
|
5
|
+
/** insert */
|
|
6
|
+
documents?: Document[];
|
|
7
|
+
/** update/delete:WHERE 翻译 */
|
|
8
|
+
filter?: Document;
|
|
9
|
+
/** update:{ $set, $inc } */
|
|
10
|
+
updateDoc?: Document;
|
|
11
|
+
}
|
|
12
|
+
/** 参数内联:'?' → 字面量(数字/布尔/null 原样,字符串单引号转义) */
|
|
13
|
+
export declare function inlineParams(sql: string, params: unknown[]): string;
|
|
14
|
+
/**
|
|
15
|
+
* 翻译 DML 语句
|
|
16
|
+
* @returns spec(filter 由外部通过 extractDmlWhere + noql 翻译注入,见 MongoDriver.runDml)
|
|
17
|
+
*/
|
|
18
|
+
export declare function translateDml(sql: string, params: unknown[]): MongoDmlSpec;
|
|
19
|
+
/** 翻译 UPDATE/DELETE 的 WHERE → filter(无 WHERE 返回 {}) */
|
|
20
|
+
export declare function translateDmlFilter(sql: string): Document;
|
|
21
|
+
//# sourceMappingURL=dml-translator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dml-translator.d.ts","sourceRoot":"","sources":["../../../src/driver/mongodb/dml-translator.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKxC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa;IACb,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,QAAQ,CAAC;CACtB;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAUnE;AA6ED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAYzE;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAGxD"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB DML 翻译:INSERT/UPDATE/DELETE → Mongo 写操作(node-sql-parser 解析)
|
|
3
|
+
*
|
|
4
|
+
* 分工:
|
|
5
|
+
* - node-sql-parser:INSERT 的 columns/values、UPDATE 的 SET($set vs $inc 识别)
|
|
6
|
+
* - WHERE 子句:从原始 SQL 提取原文 → noql 翻译(与 SELECT 路径一致)
|
|
7
|
+
* - 参数(?):先内联进 SQL 再解析(Mongo 无参数化概念,值直接进文档)
|
|
8
|
+
*/
|
|
9
|
+
import pkg from 'node-sql-parser';
|
|
10
|
+
import { SqlEngineError } from '../../errors.js';
|
|
11
|
+
import { extractDmlWhere } from '../../core/sql/statement.js';
|
|
12
|
+
import { translateWhereToMatch } from './sql-translator.js';
|
|
13
|
+
const { Parser } = pkg;
|
|
14
|
+
const parser = new Parser();
|
|
15
|
+
/** 参数内联:'?' → 字面量(数字/布尔/null 原样,字符串单引号转义) */
|
|
16
|
+
export function inlineParams(sql, params) {
|
|
17
|
+
if (!params?.length)
|
|
18
|
+
return sql;
|
|
19
|
+
let i = 0;
|
|
20
|
+
return sql.replace(/\?/g, () => {
|
|
21
|
+
const v = params[i++];
|
|
22
|
+
if (v === null || v === undefined)
|
|
23
|
+
return 'NULL';
|
|
24
|
+
if (typeof v === 'number')
|
|
25
|
+
return String(v);
|
|
26
|
+
if (typeof v === 'boolean')
|
|
27
|
+
return v ? 'TRUE' : 'FALSE';
|
|
28
|
+
return `'${String(v).replace(/'/g, "''")}'`;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/** AST 值节点 → JS 值 */
|
|
32
|
+
function astValueToJs(node) {
|
|
33
|
+
if (!node)
|
|
34
|
+
return null;
|
|
35
|
+
switch (node.type) {
|
|
36
|
+
case 'number':
|
|
37
|
+
return Number(node.value);
|
|
38
|
+
case 'single_quote_string':
|
|
39
|
+
case 'double_quote_string':
|
|
40
|
+
return String(node.value);
|
|
41
|
+
case 'null':
|
|
42
|
+
return null;
|
|
43
|
+
case 'boolean':
|
|
44
|
+
return node.value === true || String(node.value).toLowerCase() === 'true';
|
|
45
|
+
case 'origin':
|
|
46
|
+
// 内联后 '?' 应已被替换;裸标识符视为字符串
|
|
47
|
+
return String(node.value);
|
|
48
|
+
default:
|
|
49
|
+
throw new SqlEngineError('DML_UNSUPPORTED_EXPRESSION', `不支持的表达式节点: ${node.type}(仅支持字面量值)`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** INSERT → documents */
|
|
53
|
+
function translateInsert(ast) {
|
|
54
|
+
const collection = ast.table?.[0]?.table;
|
|
55
|
+
if (!collection)
|
|
56
|
+
throw new SqlEngineError('QUERY_FAILED', '无法解析 INSERT 目标集合');
|
|
57
|
+
const columns = ast.columns || [];
|
|
58
|
+
const rows = ast.values?.values || [];
|
|
59
|
+
if (!columns.length || !rows.length) {
|
|
60
|
+
throw new SqlEngineError('DML_UNSUPPORTED_EXPRESSION', 'INSERT 需要显式列与 VALUES');
|
|
61
|
+
}
|
|
62
|
+
const documents = rows.map((row) => {
|
|
63
|
+
const values = row.value || [];
|
|
64
|
+
const doc = {};
|
|
65
|
+
columns.forEach((col, i) => {
|
|
66
|
+
doc[col] = astValueToJs(values[i]);
|
|
67
|
+
});
|
|
68
|
+
return doc;
|
|
69
|
+
});
|
|
70
|
+
return { type: 'insert', collection, documents };
|
|
71
|
+
}
|
|
72
|
+
/** UPDATE → { $set, $inc } */
|
|
73
|
+
function translateUpdate(ast) {
|
|
74
|
+
const collection = ast.table?.[0]?.table;
|
|
75
|
+
if (!collection)
|
|
76
|
+
throw new SqlEngineError('QUERY_FAILED', '无法解析 UPDATE 目标集合');
|
|
77
|
+
const $set = {};
|
|
78
|
+
const $inc = {};
|
|
79
|
+
for (const s of ast.set || []) {
|
|
80
|
+
const col = s.column;
|
|
81
|
+
const v = s.value;
|
|
82
|
+
// SET n = n + k / n = n - k → $inc
|
|
83
|
+
if (v?.type === 'binary_expr' &&
|
|
84
|
+
(v.operator === '+' || v.operator === '-') &&
|
|
85
|
+
v.left?.type === 'column_ref' &&
|
|
86
|
+
v.left?.column === col &&
|
|
87
|
+
v.right?.type === 'number') {
|
|
88
|
+
$inc[col] = v.operator === '+' ? Number(v.right.value) : -Number(v.right.value);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
$set[col] = astValueToJs(v);
|
|
92
|
+
}
|
|
93
|
+
const updateDoc = {};
|
|
94
|
+
if (Object.keys($set).length)
|
|
95
|
+
updateDoc.$set = $set;
|
|
96
|
+
if (Object.keys($inc).length)
|
|
97
|
+
updateDoc.$inc = $inc;
|
|
98
|
+
if (!Object.keys(updateDoc).length) {
|
|
99
|
+
throw new SqlEngineError('QUERY_FAILED', 'UPDATE 没有可执行的 SET 子句');
|
|
100
|
+
}
|
|
101
|
+
return { type: 'update', collection, updateDoc };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 翻译 DML 语句
|
|
105
|
+
* @returns spec(filter 由外部通过 extractDmlWhere + noql 翻译注入,见 MongoDriver.runDml)
|
|
106
|
+
*/
|
|
107
|
+
export function translateDml(sql, params) {
|
|
108
|
+
const inlined = inlineParams(sql, params);
|
|
109
|
+
const ast = parser.astify(inlined, { database: 'mysql' });
|
|
110
|
+
if (ast.type === 'insert')
|
|
111
|
+
return translateInsert(ast);
|
|
112
|
+
if (ast.type === 'update')
|
|
113
|
+
return translateUpdate(ast);
|
|
114
|
+
if (ast.type === 'delete') {
|
|
115
|
+
const collection = ast.from?.[0]?.table ?? ast.table?.[0]?.table;
|
|
116
|
+
if (!collection)
|
|
117
|
+
throw new SqlEngineError('QUERY_FAILED', '无法解析 DELETE 目标集合');
|
|
118
|
+
return { type: 'delete', collection };
|
|
119
|
+
}
|
|
120
|
+
throw new SqlEngineError('DML_UNSUPPORTED_EXPRESSION', `不支持的 DML 语句类型: ${ast.type}`);
|
|
121
|
+
}
|
|
122
|
+
/** 翻译 UPDATE/DELETE 的 WHERE → filter(无 WHERE 返回 {}) */
|
|
123
|
+
export function translateDmlFilter(sql) {
|
|
124
|
+
const where = extractDmlWhere(sql);
|
|
125
|
+
return where ? translateWhereToMatch(where) : {};
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=dml-translator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dml-translator.js","sourceRoot":"","sources":["../../../src/driver/mongodb/dml-translator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { SqlDriver, PoolHandle } from '../interface.js';
|
|
2
|
+
import type { MongodbConfig, 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 { MongoPoolHandle } from './pool.js';
|
|
8
|
+
export declare class MongoDriver implements SqlDriver {
|
|
9
|
+
readonly dialect = "mongodb";
|
|
10
|
+
createPool(config: MongodbConfig): Promise<PoolHandle>;
|
|
11
|
+
testConnection(config: MongodbConfig): Promise<TestResult>;
|
|
12
|
+
getTableList(pool: PoolHandle): Promise<string[]>;
|
|
13
|
+
getPreviewRows(pool: PoolHandle, table: string, offset: number, limit: number, whereClause?: string): Promise<any[]>;
|
|
14
|
+
getColumns(pool: PoolHandle, table: string): Promise<Field[]>;
|
|
15
|
+
getRowsCount(pool: PoolHandle, table: string, whereClause?: string): Promise<number>;
|
|
16
|
+
runSql(pool: PoolHandle, request: RunSqlRequest): Promise<ExecResult>;
|
|
17
|
+
/** 事务/常规共用执行核心(session 可指定为事务会话) */
|
|
18
|
+
runSqlInternal(handle: MongoPoolHandle, request: RunSqlRequest, session?: import('mongodb').ClientSession): Promise<ExecResult>;
|
|
19
|
+
/** 事务:session.withTransaction(需要副本集/分片集群,单实例不支持) */
|
|
20
|
+
withTransaction<T>(pool: PoolHandle, fn: (tx: TransactionHandle) => Promise<T>): Promise<T>;
|
|
21
|
+
private runSelect;
|
|
22
|
+
private runDml;
|
|
23
|
+
getTableSchema(pool: PoolHandle, table: string, opts?: SchemaOptions): Promise<TableSchema>;
|
|
24
|
+
getAllTableSchemas(pool: PoolHandle, opts?: SchemaOptions): IntrospectTask<TableSchema[]>;
|
|
25
|
+
}
|
|
26
|
+
export declare const mongodbDriver: MongoDriver;
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/driver/mongodb/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EACV,UAAU,EACV,KAAK,EAEL,aAAa,EACb,UAAU,EAEX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAgB5C,qBAAa,WAAY,YAAW,SAAS;IAC3C,QAAQ,CAAC,OAAO,aAAa;IAEvB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IAStD,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IAkB1D,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMjD,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;IAMX,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAO7D,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQpF,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IAK3E,oCAAoC;IACpC,cAAc,CACZ,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,OAAO,SAAS,EAAE,aAAa,GACxC,OAAO,CAAC,UAAU,CAAC;IAiBtB,oDAAoD;IAC9C,eAAe,CAAC,CAAC,EACrB,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC;YA8BC,SAAS;YAsET,MAAM;IAyDpB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IAa3F,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;CAuB1F;AAED,eAAO,MAAM,aAAa,aAAoB,CAAC"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB 驱动(SQL → Query / DML 翻译)
|
|
3
|
+
* SELECT 走 @synatic/noql;DML 走 node-sql-parser + noql WHERE 翻译;
|
|
4
|
+
* 结构检出为长任务(采样分批 + 进度 + 取消)
|
|
5
|
+
*/
|
|
6
|
+
import { SqlEngineError, wrapError } from '../../errors.js';
|
|
7
|
+
import { normalizeSql } from '../../core/sql/normalize.js';
|
|
8
|
+
import { detectStatementType, isDmlStatement, hasDmlWhere, countInsertValueRows } from '../../core/sql/statement.js';
|
|
9
|
+
import { createTask } from '../../types/task.js';
|
|
10
|
+
import { MongoPoolHandle } from './pool.js';
|
|
11
|
+
import { translateSelect, translateWhereToMatch, mergeMatch } from './sql-translator.js';
|
|
12
|
+
import { translateDml, translateDmlFilter } from './dml-translator.js';
|
|
13
|
+
import { analyzeCollection, analysisToTableSchema, analysisToFields, inferFieldsFromRows } from './schema.js';
|
|
14
|
+
/** noql 投影({field: '$field'})→ Mongo 投影({field: 1},排除默认 _id) */
|
|
15
|
+
function toMongoProjection(projection) {
|
|
16
|
+
if (!projection)
|
|
17
|
+
return {};
|
|
18
|
+
const out = {};
|
|
19
|
+
for (const [k, v] of Object.entries(projection)) {
|
|
20
|
+
out[k] = 1;
|
|
21
|
+
}
|
|
22
|
+
if (!('_id' in out))
|
|
23
|
+
out._id = 0;
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
export class MongoDriver {
|
|
27
|
+
dialect = 'mongodb';
|
|
28
|
+
async createPool(config) {
|
|
29
|
+
if (config.type !== 'mongodb') {
|
|
30
|
+
throw new SqlEngineError('UNSUPPORTED_DIALECT', `mongodb 驱动收到 ${config.type} 配置`);
|
|
31
|
+
}
|
|
32
|
+
return new MongoPoolHandle(config);
|
|
33
|
+
}
|
|
34
|
+
// ==================== 连接测试 ====================
|
|
35
|
+
async testConnection(config) {
|
|
36
|
+
let handle = null;
|
|
37
|
+
try {
|
|
38
|
+
handle = new MongoPoolHandle(config);
|
|
39
|
+
const client = await handle.getClient();
|
|
40
|
+
const result = await client.db().command({ ping: 1 });
|
|
41
|
+
if (result.ok !== 1)
|
|
42
|
+
throw new Error('ping command failed');
|
|
43
|
+
return { success: true, message: 'MongoDB connection test successful' };
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const e = err;
|
|
47
|
+
return { success: false, message: `MongoDB connection test failed: ${e.message}` };
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
if (handle)
|
|
51
|
+
await handle.destroy();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// ==================== 元信息 ====================
|
|
55
|
+
async getTableList(pool) {
|
|
56
|
+
const db = await pool.getDb();
|
|
57
|
+
const collections = await db.listCollections().toArray();
|
|
58
|
+
return collections.map((c) => c.name);
|
|
59
|
+
}
|
|
60
|
+
async getPreviewRows(pool, table, offset, limit, whereClause) {
|
|
61
|
+
const db = await pool.getDb();
|
|
62
|
+
const query = translateWhereToMatch(whereClause ?? '');
|
|
63
|
+
return db.collection(table).find(query).skip(offset).limit(limit).toArray();
|
|
64
|
+
}
|
|
65
|
+
async getColumns(pool, table) {
|
|
66
|
+
const db = await pool.getDb();
|
|
67
|
+
const opts = pool.config.introspect ?? {};
|
|
68
|
+
const analysis = await analyzeCollection(db, table, { ...opts, sampleSize: opts.sampleSize ?? 50 }).promise;
|
|
69
|
+
return analysisToFields(analysis);
|
|
70
|
+
}
|
|
71
|
+
async getRowsCount(pool, table, whereClause) {
|
|
72
|
+
const db = await pool.getDb();
|
|
73
|
+
const query = translateWhereToMatch(whereClause ?? '');
|
|
74
|
+
return db.collection(table).countDocuments(query);
|
|
75
|
+
}
|
|
76
|
+
// ==================== SQL 执行 ====================
|
|
77
|
+
async runSql(pool, request) {
|
|
78
|
+
const handle = pool;
|
|
79
|
+
return this.runSqlInternal(handle, request, undefined);
|
|
80
|
+
}
|
|
81
|
+
/** 事务/常规共用执行核心(session 可指定为事务会话) */
|
|
82
|
+
runSqlInternal(handle, request, session) {
|
|
83
|
+
const sql = normalizeSql(request.sql);
|
|
84
|
+
const type = detectStatementType(sql);
|
|
85
|
+
try {
|
|
86
|
+
if (isDmlStatement(type)) {
|
|
87
|
+
return this.runDml(handle, sql, request.params, type, request.dml, session);
|
|
88
|
+
}
|
|
89
|
+
if (type === 'SELECT') {
|
|
90
|
+
return this.runSelect(handle, sql, request, session);
|
|
91
|
+
}
|
|
92
|
+
throw new SqlEngineError('QUERY_FAILED', `MongoDB 不支持执行 ${type} 语句`);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
if (err instanceof SqlEngineError)
|
|
96
|
+
return Promise.reject(err);
|
|
97
|
+
return Promise.reject(wrapError('QUERY_FAILED', err));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** 事务:session.withTransaction(需要副本集/分片集群,单实例不支持) */
|
|
101
|
+
async withTransaction(pool, fn) {
|
|
102
|
+
const handle = pool;
|
|
103
|
+
const client = await handle.getClient();
|
|
104
|
+
const session = client.startSession();
|
|
105
|
+
const self = this;
|
|
106
|
+
try {
|
|
107
|
+
let result;
|
|
108
|
+
await session.withTransaction(async () => {
|
|
109
|
+
const tx = {
|
|
110
|
+
runSql: (req) => self.runSqlInternal(handle, req, session),
|
|
111
|
+
query: (sql, params) => self.runSqlInternal(handle, { sql, params }, session),
|
|
112
|
+
execute: (sql, params) => self.runSqlInternal(handle, { sql, params }, session),
|
|
113
|
+
commit: async () => {
|
|
114
|
+
await session.commitTransaction();
|
|
115
|
+
},
|
|
116
|
+
rollback: async () => {
|
|
117
|
+
await session.abortTransaction();
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
result = await fn(tx);
|
|
121
|
+
});
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
await session.endSession().catch(() => undefined);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// ---- SELECT(noql:query / aggregate) ----
|
|
129
|
+
async runSelect(handle, sql, request, session) {
|
|
130
|
+
const db = await handle.getDb();
|
|
131
|
+
const parsed = translateSelect(sql);
|
|
132
|
+
const additionalMatch = translateWhereToMatch(request.whereClause ?? '');
|
|
133
|
+
// SQL 自带分页 → 用 noql 解析出的 limit/offset;否则用请求级标准分页
|
|
134
|
+
const sqlHasPagination = !!parsed.limit || !!parsed.offset;
|
|
135
|
+
const standardPagination = !sqlHasPagination;
|
|
136
|
+
const offset = Math.max(Number(parsed.offset ?? request.offset ?? 0), 0);
|
|
137
|
+
const limit = Math.max(Number(parsed.limit ?? request.limit ?? 100), 0);
|
|
138
|
+
const projection = toMongoProjection(parsed.projection);
|
|
139
|
+
if (parsed.type === 'query' && parsed.collection) {
|
|
140
|
+
const query = mergeMatch(parsed.query, additionalMatch);
|
|
141
|
+
const findOpts = session ? { session } : {};
|
|
142
|
+
const docs = await db
|
|
143
|
+
.collection(parsed.collection)
|
|
144
|
+
.find(query, Object.keys(projection).length ? { projection, ...findOpts } : findOpts)
|
|
145
|
+
.skip(offset)
|
|
146
|
+
.limit(limit)
|
|
147
|
+
.toArray();
|
|
148
|
+
const total = standardPagination
|
|
149
|
+
? await db.collection(parsed.collection).countDocuments(query, session ? { session } : undefined)
|
|
150
|
+
: docs.length;
|
|
151
|
+
return {
|
|
152
|
+
rows: docs,
|
|
153
|
+
fields: inferFieldsFromRows(docs),
|
|
154
|
+
total,
|
|
155
|
+
offset,
|
|
156
|
+
limit,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (parsed.type === 'aggregate' && parsed.collections?.[0]) {
|
|
160
|
+
const pipeline = [...(parsed.pipeline ?? [])];
|
|
161
|
+
if (Object.keys(additionalMatch).length) {
|
|
162
|
+
pipeline.push({ $match: additionalMatch });
|
|
163
|
+
}
|
|
164
|
+
const total = standardPagination
|
|
165
|
+
? await db
|
|
166
|
+
.collection(parsed.collections[0])
|
|
167
|
+
.aggregate([...pipeline, { $count: 'total' }], session ? { session } : undefined)
|
|
168
|
+
.toArray()
|
|
169
|
+
.then((r) => Number(r[0]?.total ?? 0))
|
|
170
|
+
: 0;
|
|
171
|
+
if (standardPagination) {
|
|
172
|
+
pipeline.push({ $skip: offset }, { $limit: limit });
|
|
173
|
+
}
|
|
174
|
+
const docs = await db
|
|
175
|
+
.collection(parsed.collections[0])
|
|
176
|
+
.aggregate(pipeline, session ? { session } : undefined)
|
|
177
|
+
.toArray();
|
|
178
|
+
return {
|
|
179
|
+
rows: docs,
|
|
180
|
+
fields: inferFieldsFromRows(docs),
|
|
181
|
+
total,
|
|
182
|
+
offset,
|
|
183
|
+
limit,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
throw new SqlEngineError('QUERY_FAILED', `无法翻译 SQL: ${sql}`);
|
|
187
|
+
}
|
|
188
|
+
// ---- DML(node-sql-parser + noql WHERE) ----
|
|
189
|
+
async runDml(handle, sql, params, type, dmlOverride, session) {
|
|
190
|
+
const db = await handle.getDb();
|
|
191
|
+
const dml = dmlOverride ?? handle.config.dml ?? {};
|
|
192
|
+
if ((type === 'UPDATE' || type === 'DELETE') && dml.requireWhereForUpdateDelete !== false) {
|
|
193
|
+
if (!hasDmlWhere(sql)) {
|
|
194
|
+
throw new SqlEngineError('DML_BLOCKED', `禁止无 WHERE 的 ${type}(config.dml.requireWhereForUpdateDelete 可关闭)`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const spec = translateDml(sql, params ?? []);
|
|
198
|
+
const filter = translateDmlFilter(sql);
|
|
199
|
+
if (type === 'INSERT') {
|
|
200
|
+
const documents = spec.documents ?? [];
|
|
201
|
+
if (dml.maxInsertRows && documents.length > dml.maxInsertRows) {
|
|
202
|
+
throw new SqlEngineError('DML_BLOCKED', `INSERT 行数 ${documents.length} 超过上限 ${dml.maxInsertRows}`);
|
|
203
|
+
}
|
|
204
|
+
const coll = db.collection(spec.collection);
|
|
205
|
+
const opts = session ? { session } : undefined;
|
|
206
|
+
if (documents.length === 1) {
|
|
207
|
+
const { insertedId } = await coll.insertOne(documents[0], opts);
|
|
208
|
+
return { affectedRows: 1, insertId: String(insertedId) };
|
|
209
|
+
}
|
|
210
|
+
const res = await coll.insertMany(documents, opts);
|
|
211
|
+
return { affectedRows: documents.length, insertId: String(Object.values(res.insertedIds)[0]) };
|
|
212
|
+
}
|
|
213
|
+
if (type === 'UPDATE') {
|
|
214
|
+
const res = await db
|
|
215
|
+
.collection(spec.collection)
|
|
216
|
+
.updateMany(filter, spec.updateDoc ?? {}, session ? { session } : undefined);
|
|
217
|
+
return { affectedRows: res.modifiedCount };
|
|
218
|
+
}
|
|
219
|
+
// DELETE
|
|
220
|
+
const res = await db
|
|
221
|
+
.collection(spec.collection)
|
|
222
|
+
.deleteMany(filter, session ? { session } : undefined);
|
|
223
|
+
return { affectedRows: res.deletedCount };
|
|
224
|
+
}
|
|
225
|
+
// ==================== 结构 JSON 检出(长任务) ====================
|
|
226
|
+
getTableSchema(pool, table, opts) {
|
|
227
|
+
const handle = pool;
|
|
228
|
+
return handle.getDb().then((db) => {
|
|
229
|
+
const merged = {
|
|
230
|
+
...(handle.config.introspect ?? {}),
|
|
231
|
+
...(opts ?? {}),
|
|
232
|
+
};
|
|
233
|
+
return analyzeCollection(db, table, merged).promise.then((analysis) => analysisToTableSchema(table, analysis, handle.config.database));
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
getAllTableSchemas(pool, opts) {
|
|
237
|
+
const handle = pool;
|
|
238
|
+
const self = this;
|
|
239
|
+
return createTask(async (ctx) => {
|
|
240
|
+
const db = await handle.getDb();
|
|
241
|
+
const collections = await db.listCollections().toArray();
|
|
242
|
+
const total = collections.length;
|
|
243
|
+
const schemas = [];
|
|
244
|
+
for (let i = 0; i < collections.length; i++) {
|
|
245
|
+
if (ctx.isCancelled())
|
|
246
|
+
break;
|
|
247
|
+
const name = collections[i].name;
|
|
248
|
+
ctx.report({ stage: 'introspecting', processed: i, total, message: name });
|
|
249
|
+
try {
|
|
250
|
+
const analysis = await analyzeCollection(db, name, opts ?? handle.config.introspect ?? {}).promise;
|
|
251
|
+
schemas.push(analysisToTableSchema(name, analysis, handle.config.database));
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
// 单集合失败不中断
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
void self;
|
|
258
|
+
return schemas;
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
export const mongodbDriver = new MongoDriver();
|
|
263
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/driver/mongodb/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB 连接池句柄(mongodb 原生驱动 MongoClient)
|
|
3
|
+
*/
|
|
4
|
+
import { MongoClient, type Db } from 'mongodb';
|
|
5
|
+
import type { PoolHandle } from '../interface.js';
|
|
6
|
+
import type { MongodbConfig } from '../../types/config.js';
|
|
7
|
+
/** 由 host/port/database 拼装连接串 */
|
|
8
|
+
export declare function buildMongoUri(config: MongodbConfig): string;
|
|
9
|
+
export declare function buildMongoOptions(config: MongodbConfig): Record<string, unknown>;
|
|
10
|
+
export declare class MongoPoolHandle implements PoolHandle {
|
|
11
|
+
readonly fingerprint: string;
|
|
12
|
+
readonly config: MongodbConfig;
|
|
13
|
+
private client;
|
|
14
|
+
private destroyedFlag;
|
|
15
|
+
constructor(config: MongodbConfig);
|
|
16
|
+
get destroyed(): boolean;
|
|
17
|
+
/** 获取 MongoClient(懒连接) */
|
|
18
|
+
getClient(): Promise<MongoClient>;
|
|
19
|
+
/** 获取数据库实例 */
|
|
20
|
+
getDb(): Promise<Db>;
|
|
21
|
+
get stats(): {
|
|
22
|
+
active: number;
|
|
23
|
+
idle: number;
|
|
24
|
+
waiting: number;
|
|
25
|
+
createdTotal: number;
|
|
26
|
+
destroyedTotal: number;
|
|
27
|
+
};
|
|
28
|
+
ping(): Promise<void>;
|
|
29
|
+
destroy(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../src/driver/mongodb/pool.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,iCAAiC;AACjC,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAU3D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBhF;AAED,qBAAa,eAAgB,YAAW,UAAU;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,aAAa,CAAS;gBAElB,MAAM,EAAE,aAAa;IAKjC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,0BAA0B;IACpB,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;IASvC,cAAc;IACR,KAAK,IAAI,OAAO,CAAC,EAAE,CAAC;IAK1B,IAAI,KAAK;;;;;;MAQR;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAY/B"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB 连接池句柄(mongodb 原生驱动 MongoClient)
|
|
3
|
+
*/
|
|
4
|
+
import { MongoClient } from 'mongodb';
|
|
5
|
+
import { configKey } from '../../core/config.js';
|
|
6
|
+
/** 由 host/port/database 拼装连接串 */
|
|
7
|
+
export function buildMongoUri(config) {
|
|
8
|
+
if (config.uri)
|
|
9
|
+
return config.uri;
|
|
10
|
+
const user = config.user || config.username;
|
|
11
|
+
const pass = config.password;
|
|
12
|
+
const auth = user ? `${encodeURIComponent(user)}:${encodeURIComponent(pass ?? '')}@` : '';
|
|
13
|
+
const host = config.host ?? 'localhost';
|
|
14
|
+
const port = config.port ? `:${config.port}` : '';
|
|
15
|
+
const db = config.database ? `/${encodeURIComponent(config.database)}` : '';
|
|
16
|
+
const authSource = user && config.authSource ? `?authSource=${encodeURIComponent(config.authSource)}` : '';
|
|
17
|
+
return `mongodb://${auth}${host}${port}${db}${authSource}`;
|
|
18
|
+
}
|
|
19
|
+
export function buildMongoOptions(config) {
|
|
20
|
+
const options = {
|
|
21
|
+
connectTimeoutMS: 10000,
|
|
22
|
+
socketTimeoutMS: 30000,
|
|
23
|
+
serverSelectionTimeoutMS: 10000,
|
|
24
|
+
// 单实例部署不支持 retryable writes(事务/会话需要),默认关闭
|
|
25
|
+
retryWrites: config.retryWrites ?? false,
|
|
26
|
+
};
|
|
27
|
+
if (config.ssl?.enabled) {
|
|
28
|
+
options.tls = true;
|
|
29
|
+
const tlsOptions = {};
|
|
30
|
+
if (config.ssl.ca)
|
|
31
|
+
tlsOptions.ca = Buffer.from(config.ssl.ca);
|
|
32
|
+
if (config.ssl.cert)
|
|
33
|
+
tlsOptions.cert = Buffer.from(config.ssl.cert);
|
|
34
|
+
if (config.ssl.key)
|
|
35
|
+
tlsOptions.key = Buffer.from(config.ssl.key);
|
|
36
|
+
tlsOptions.rejectUnauthorized = config.ssl.rejectUnauthorized ?? false;
|
|
37
|
+
if (Object.keys(tlsOptions).length > 0)
|
|
38
|
+
options.tlsOptions = tlsOptions;
|
|
39
|
+
}
|
|
40
|
+
return options;
|
|
41
|
+
}
|
|
42
|
+
export class MongoPoolHandle {
|
|
43
|
+
fingerprint;
|
|
44
|
+
config;
|
|
45
|
+
client = null;
|
|
46
|
+
destroyedFlag = false;
|
|
47
|
+
constructor(config) {
|
|
48
|
+
this.config = { ...config };
|
|
49
|
+
this.fingerprint = configKey(config);
|
|
50
|
+
}
|
|
51
|
+
get destroyed() {
|
|
52
|
+
return this.destroyedFlag;
|
|
53
|
+
}
|
|
54
|
+
/** 获取 MongoClient(懒连接) */
|
|
55
|
+
async getClient() {
|
|
56
|
+
if (!this.client) {
|
|
57
|
+
const uri = buildMongoUri(this.config);
|
|
58
|
+
this.client = new MongoClient(uri, buildMongoOptions(this.config));
|
|
59
|
+
await this.client.connect();
|
|
60
|
+
}
|
|
61
|
+
return this.client;
|
|
62
|
+
}
|
|
63
|
+
/** 获取数据库实例 */
|
|
64
|
+
async getDb() {
|
|
65
|
+
const client = await this.getClient();
|
|
66
|
+
return client.db(this.config.database);
|
|
67
|
+
}
|
|
68
|
+
get stats() {
|
|
69
|
+
return {
|
|
70
|
+
active: 0,
|
|
71
|
+
idle: this.client ? 1 : 0,
|
|
72
|
+
waiting: 0,
|
|
73
|
+
createdTotal: this.client ? 1 : 0,
|
|
74
|
+
destroyedTotal: this.destroyedFlag ? 1 : 0,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async ping() {
|
|
78
|
+
const client = await this.getClient();
|
|
79
|
+
await client.db().command({ ping: 1 });
|
|
80
|
+
}
|
|
81
|
+
async destroy() {
|
|
82
|
+
if (this.destroyedFlag)
|
|
83
|
+
return;
|
|
84
|
+
this.destroyedFlag = true;
|
|
85
|
+
if (this.client) {
|
|
86
|
+
try {
|
|
87
|
+
await this.client.close();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// ignore
|
|
91
|
+
}
|
|
92
|
+
this.client = null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../src/driver/mongodb/pool.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAW,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,iCAAiC;AACjC,MAAM,UAAU,aAAa,CAAC,MAAqB;IACjD,IAAI,MAAM,CAAC,GAAG;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,UAAU,GAAG,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3G,OAAO,aAAa,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,MAAM,OAAO,GAA4B;QACvC,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,KAAK;QACtB,wBAAwB,EAAE,KAAK;QAC/B,0CAA0C;QAC1C,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,KAAK;KACzC,CAAC;IACF,IAAI,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;QACnB,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;YAAE,UAAU,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI;YAAE,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG;YAAE,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjE,UAAU,CAAC,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,IAAI,KAAK,CAAC;QACvE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAC1E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,eAAe;IACjB,WAAW,CAAS;IACpB,MAAM,CAAgB;IACvB,MAAM,GAAuB,IAAI,CAAC;IAClC,aAAa,GAAG,KAAK,CAAC;IAE9B,YAAY,MAAqB;QAC/B,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,0BAA0B;IAC1B,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAQ,CAAC,CAAC;YAC1E,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,cAAc;IACd,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,KAAK;QACP,OAAO;YACL,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,OAAO,EAAE,CAAC;YACV,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,MAAM,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;CACF"}
|