@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.
Files changed (199) hide show
  1. package/README.md +191 -0
  2. package/lib/client/client.d.ts +59 -0
  3. package/lib/client/client.d.ts.map +1 -0
  4. package/lib/client/client.js +201 -0
  5. package/lib/client/client.js.map +1 -0
  6. package/lib/client/index.d.ts +15 -0
  7. package/lib/client/index.d.ts.map +1 -0
  8. package/lib/client/index.js +15 -0
  9. package/lib/client/index.js.map +1 -0
  10. package/lib/client/manager.d.ts +27 -0
  11. package/lib/client/manager.d.ts.map +1 -0
  12. package/lib/client/manager.js +73 -0
  13. package/lib/client/manager.js.map +1 -0
  14. package/lib/client/registry.d.ts +31 -0
  15. package/lib/client/registry.d.ts.map +1 -0
  16. package/lib/client/registry.js +128 -0
  17. package/lib/client/registry.js.map +1 -0
  18. package/lib/core/cache.d.ts +28 -0
  19. package/lib/core/cache.d.ts.map +1 -0
  20. package/lib/core/cache.js +58 -0
  21. package/lib/core/cache.js.map +1 -0
  22. package/lib/core/config.d.ts +16 -0
  23. package/lib/core/config.d.ts.map +1 -0
  24. package/lib/core/config.js +47 -0
  25. package/lib/core/config.js.map +1 -0
  26. package/lib/core/field-mapper/mysql.d.ts +42 -0
  27. package/lib/core/field-mapper/mysql.d.ts.map +1 -0
  28. package/lib/core/field-mapper/mysql.js +129 -0
  29. package/lib/core/field-mapper/mysql.js.map +1 -0
  30. package/lib/core/field-mapper/postgresql.d.ts +25 -0
  31. package/lib/core/field-mapper/postgresql.d.ts.map +1 -0
  32. package/lib/core/field-mapper/postgresql.js +121 -0
  33. package/lib/core/field-mapper/postgresql.js.map +1 -0
  34. package/lib/core/sql/normalize.d.ts +10 -0
  35. package/lib/core/sql/normalize.d.ts.map +1 -0
  36. package/lib/core/sql/normalize.js +121 -0
  37. package/lib/core/sql/normalize.js.map +1 -0
  38. package/lib/core/sql/pagination.d.ts +22 -0
  39. package/lib/core/sql/pagination.d.ts.map +1 -0
  40. package/lib/core/sql/pagination.js +61 -0
  41. package/lib/core/sql/pagination.js.map +1 -0
  42. package/lib/core/sql/statement.d.ts +28 -0
  43. package/lib/core/sql/statement.d.ts.map +1 -0
  44. package/lib/core/sql/statement.js +155 -0
  45. package/lib/core/sql/statement.js.map +1 -0
  46. package/lib/core/sql/table-mapper.d.ts +24 -0
  47. package/lib/core/sql/table-mapper.d.ts.map +1 -0
  48. package/lib/core/sql/table-mapper.js +113 -0
  49. package/lib/core/sql/table-mapper.js.map +1 -0
  50. package/lib/core/task-queue.d.ts +31 -0
  51. package/lib/core/task-queue.d.ts.map +1 -0
  52. package/lib/core/task-queue.js +185 -0
  53. package/lib/core/task-queue.js.map +1 -0
  54. package/lib/core/worker/bun-worker.d.ts +21 -0
  55. package/lib/core/worker/bun-worker.d.ts.map +1 -0
  56. package/lib/core/worker/bun-worker.js +93 -0
  57. package/lib/core/worker/bun-worker.js.map +1 -0
  58. package/lib/core/worker/index.d.ts +16 -0
  59. package/lib/core/worker/index.d.ts.map +1 -0
  60. package/lib/core/worker/index.js +16 -0
  61. package/lib/core/worker/index.js.map +1 -0
  62. package/lib/core/worker/node-worker.d.ts +19 -0
  63. package/lib/core/worker/node-worker.d.ts.map +1 -0
  64. package/lib/core/worker/node-worker.js +94 -0
  65. package/lib/core/worker/node-worker.js.map +1 -0
  66. package/lib/core/worker/task-runner-bun.d.ts +2 -0
  67. package/lib/core/worker/task-runner-bun.d.ts.map +1 -0
  68. package/lib/core/worker/task-runner-bun.js +18 -0
  69. package/lib/core/worker/task-runner-bun.js.map +1 -0
  70. package/lib/core/worker/task-runner.d.ts +2 -0
  71. package/lib/core/worker/task-runner.d.ts.map +1 -0
  72. package/lib/core/worker/task-runner.js +21 -0
  73. package/lib/core/worker/task-runner.js.map +1 -0
  74. package/lib/driver/index.d.ts +3 -0
  75. package/lib/driver/index.d.ts.map +1 -0
  76. package/lib/driver/index.js +16 -0
  77. package/lib/driver/index.js.map +1 -0
  78. package/lib/driver/interface.d.ts +39 -0
  79. package/lib/driver/interface.d.ts.map +1 -0
  80. package/lib/driver/interface.js +2 -0
  81. package/lib/driver/interface.js.map +1 -0
  82. package/lib/driver/mongodb/dml-translator.d.ts +21 -0
  83. package/lib/driver/mongodb/dml-translator.d.ts.map +1 -0
  84. package/lib/driver/mongodb/dml-translator.js +127 -0
  85. package/lib/driver/mongodb/dml-translator.js.map +1 -0
  86. package/lib/driver/mongodb/index.d.ts +27 -0
  87. package/lib/driver/mongodb/index.d.ts.map +1 -0
  88. package/lib/driver/mongodb/index.js +263 -0
  89. package/lib/driver/mongodb/index.js.map +1 -0
  90. package/lib/driver/mongodb/pool.d.ts +31 -0
  91. package/lib/driver/mongodb/pool.d.ts.map +1 -0
  92. package/lib/driver/mongodb/pool.js +96 -0
  93. package/lib/driver/mongodb/pool.js.map +1 -0
  94. package/lib/driver/mongodb/schema.d.ts +37 -0
  95. package/lib/driver/mongodb/schema.d.ts.map +1 -0
  96. package/lib/driver/mongodb/schema.js +238 -0
  97. package/lib/driver/mongodb/schema.js.map +1 -0
  98. package/lib/driver/mongodb/sql-translator.d.ts +19 -0
  99. package/lib/driver/mongodb/sql-translator.d.ts.map +1 -0
  100. package/lib/driver/mongodb/sql-translator.js +30 -0
  101. package/lib/driver/mongodb/sql-translator.js.map +1 -0
  102. package/lib/driver/mysql/index.d.ts +41 -0
  103. package/lib/driver/mysql/index.d.ts.map +1 -0
  104. package/lib/driver/mysql/index.js +338 -0
  105. package/lib/driver/mysql/index.js.map +1 -0
  106. package/lib/driver/mysql/pool.d.ts +46 -0
  107. package/lib/driver/mysql/pool.d.ts.map +1 -0
  108. package/lib/driver/mysql/pool.js +141 -0
  109. package/lib/driver/mysql/pool.js.map +1 -0
  110. package/lib/driver/mysql/version.d.ts +27 -0
  111. package/lib/driver/mysql/version.d.ts.map +1 -0
  112. package/lib/driver/mysql/version.js +77 -0
  113. package/lib/driver/mysql/version.js.map +1 -0
  114. package/lib/driver/postgresql/index.d.ts +34 -0
  115. package/lib/driver/postgresql/index.d.ts.map +1 -0
  116. package/lib/driver/postgresql/index.js +383 -0
  117. package/lib/driver/postgresql/index.js.map +1 -0
  118. package/lib/driver/postgresql/pool.d.ts +33 -0
  119. package/lib/driver/postgresql/pool.d.ts.map +1 -0
  120. package/lib/driver/postgresql/pool.js +104 -0
  121. package/lib/driver/postgresql/pool.js.map +1 -0
  122. package/lib/driver/registry.d.ts +16 -0
  123. package/lib/driver/registry.d.ts.map +1 -0
  124. package/lib/driver/registry.js +27 -0
  125. package/lib/driver/registry.js.map +1 -0
  126. package/lib/driver/sqlite/backend.d.ts +19 -0
  127. package/lib/driver/sqlite/backend.d.ts.map +1 -0
  128. package/lib/driver/sqlite/backend.js +5 -0
  129. package/lib/driver/sqlite/backend.js.map +1 -0
  130. package/lib/driver/sqlite/bun.d.ts +10 -0
  131. package/lib/driver/sqlite/bun.d.ts.map +1 -0
  132. package/lib/driver/sqlite/bun.js +36 -0
  133. package/lib/driver/sqlite/bun.js.map +1 -0
  134. package/lib/driver/sqlite/index.d.ts +49 -0
  135. package/lib/driver/sqlite/index.d.ts.map +1 -0
  136. package/lib/driver/sqlite/index.js +421 -0
  137. package/lib/driver/sqlite/index.js.map +1 -0
  138. package/lib/driver/sqlite/node.d.ts +10 -0
  139. package/lib/driver/sqlite/node.d.ts.map +1 -0
  140. package/lib/driver/sqlite/node.js +37 -0
  141. package/lib/driver/sqlite/node.js.map +1 -0
  142. package/lib/driver/sqlite/store.d.ts +13 -0
  143. package/lib/driver/sqlite/store.d.ts.map +1 -0
  144. package/lib/driver/sqlite/store.js +57 -0
  145. package/lib/driver/sqlite/store.js.map +1 -0
  146. package/lib/errors.d.ts +18 -0
  147. package/lib/errors.d.ts.map +1 -0
  148. package/lib/errors.js +24 -0
  149. package/lib/errors.js.map +1 -0
  150. package/lib/facade/engine.d.ts +29 -0
  151. package/lib/facade/engine.d.ts.map +1 -0
  152. package/lib/facade/engine.js +107 -0
  153. package/lib/facade/engine.js.map +1 -0
  154. package/lib/index.d.ts +41 -0
  155. package/lib/index.d.ts.map +1 -0
  156. package/lib/index.js +40 -0
  157. package/lib/index.js.map +1 -0
  158. package/lib/optional/static-source.d.ts +36 -0
  159. package/lib/optional/static-source.d.ts.map +1 -0
  160. package/lib/optional/static-source.js +141 -0
  161. package/lib/optional/static-source.js.map +1 -0
  162. package/lib/runtime.d.ts +12 -0
  163. package/lib/runtime.d.ts.map +1 -0
  164. package/lib/runtime.js +26 -0
  165. package/lib/runtime.js.map +1 -0
  166. package/lib/types/config.d.ts +146 -0
  167. package/lib/types/config.d.ts.map +1 -0
  168. package/lib/types/config.js +5 -0
  169. package/lib/types/config.js.map +1 -0
  170. package/lib/types/index.d.ts +7 -0
  171. package/lib/types/index.d.ts.map +1 -0
  172. package/lib/types/index.js +7 -0
  173. package/lib/types/index.js.map +1 -0
  174. package/lib/types/manager.d.ts +37 -0
  175. package/lib/types/manager.d.ts.map +1 -0
  176. package/lib/types/manager.js +5 -0
  177. package/lib/types/manager.js.map +1 -0
  178. package/lib/types/queue.d.ts +45 -0
  179. package/lib/types/queue.d.ts.map +1 -0
  180. package/lib/types/queue.js +5 -0
  181. package/lib/types/queue.js.map +1 -0
  182. package/lib/types/result.d.ts +61 -0
  183. package/lib/types/result.d.ts.map +1 -0
  184. package/lib/types/result.js +16 -0
  185. package/lib/types/result.js.map +1 -0
  186. package/lib/types/schema.d.ts +51 -0
  187. package/lib/types/schema.d.ts.map +1 -0
  188. package/lib/types/schema.js +5 -0
  189. package/lib/types/schema.js.map +1 -0
  190. package/lib/types/task.d.ts +48 -0
  191. package/lib/types/task.d.ts.map +1 -0
  192. package/lib/types/task.js +136 -0
  193. package/lib/types/task.js.map +1 -0
  194. package/lib/types/transaction.d.ts +13 -0
  195. package/lib/types/transaction.d.ts.map +1 -0
  196. package/lib/types/transaction.js +2 -0
  197. package/lib/types/transaction.js.map +1 -0
  198. package/package.json +93 -0
  199. package/patches/bson@7.3.2.patch +105 -0
@@ -0,0 +1,338 @@
1
+ /**
2
+ * MySQL 驱动(5.7 / 8.x 双版本)
3
+ * 连接池懒创建;分页包装按版本能力矩阵选择 CTE / 派生表;
4
+ * DML 走 ResultSetHeader(affectedRows/insertId);结构 JSON 检出
5
+ */
6
+ import { createConnection } from 'mysql2/promise';
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 { mapMysqlColumnsToFields, mapMysqlProtocolFields, } from '../../core/field-mapper/mysql.js';
13
+ import { MysqlPoolHandle, buildSslConfig } from './pool.js';
14
+ export class MysqlDriver {
15
+ dialect;
16
+ constructor(dialect = 'mysql') {
17
+ this.dialect = dialect;
18
+ }
19
+ async createPool(config) {
20
+ if (config.type !== this.dialect) {
21
+ throw new SqlEngineError('UNSUPPORTED_DIALECT', `${this.dialect} 驱动收到 ${config.type} 配置`);
22
+ }
23
+ return new MysqlPoolHandle(config, { isMariaDb: this.dialect === 'mariadb' });
24
+ }
25
+ // ==================== 连接测试 ====================
26
+ /** knex 参数绑定(RawBinding 类型限制,unknown[] → any[]) */
27
+ bind(params) {
28
+ return (params ?? []);
29
+ }
30
+ async testConnection(config) {
31
+ let connection = null;
32
+ try {
33
+ connection = await createConnection({
34
+ host: config.host,
35
+ port: Number(config.port ?? 3306),
36
+ user: config.user || config.username,
37
+ password: config.password,
38
+ database: config.database,
39
+ charset: 'utf8mb4',
40
+ ssl: buildSslConfig(config),
41
+ connectTimeout: 5000,
42
+ });
43
+ await connection.execute('SELECT 1');
44
+ return { success: true, message: 'MySQL connection test successful' };
45
+ }
46
+ catch (err) {
47
+ const e = err;
48
+ return { success: false, message: `MySQL connection test failed: ${e.message}` };
49
+ }
50
+ finally {
51
+ if (connection) {
52
+ try {
53
+ await connection.end();
54
+ }
55
+ catch {
56
+ // ignore
57
+ }
58
+ }
59
+ }
60
+ }
61
+ // ==================== 元信息 ====================
62
+ async getTableList(pool) {
63
+ const k = await pool.getKnex();
64
+ const res = (await k.raw('SHOW TABLES'));
65
+ const rows = (Array.isArray(res) ? res[0] : res);
66
+ const names = [];
67
+ for (const row of rows) {
68
+ const firstKey = Object.keys(row)[0];
69
+ if (firstKey)
70
+ names.push(String(row[firstKey]));
71
+ }
72
+ return names;
73
+ }
74
+ async getTableDDL(pool, table) {
75
+ const k = await pool.getKnex();
76
+ const res = (await k.raw('SHOW CREATE TABLE ??', [table]));
77
+ const rows = (Array.isArray(res) ? res[0] : res);
78
+ const row = rows[0];
79
+ return row?.['Create Table'] || row?.['Create View'] || '';
80
+ }
81
+ async getPreviewRows(pool, table, offset, limit, whereClause) {
82
+ const k = await pool.getKnex();
83
+ let query = k(table).select('*');
84
+ if (whereClause)
85
+ query = query.whereRaw(whereClause);
86
+ const rows = await query.limit(limit).offset(offset);
87
+ return rows;
88
+ }
89
+ async getColumns(pool, table) {
90
+ const k = await pool.getKnex();
91
+ const res = (await k.raw('SHOW FULL COLUMNS FROM ??', [table]));
92
+ const rows = (Array.isArray(res) ? res[0] : res);
93
+ return mapMysqlColumnsToFields(rows);
94
+ }
95
+ async getRowsCount(pool, table, whereClause) {
96
+ const k = await pool.getKnex();
97
+ let query = k(table).count({ total: '*' });
98
+ if (whereClause)
99
+ query = query.whereRaw(whereClause);
100
+ const row = await query.first();
101
+ const total = row ? Number(row.total) : 0;
102
+ return Number.isNaN(total) ? 0 : total;
103
+ }
104
+ // ==================== SQL 执行 ====================
105
+ async runSql(pool, request) {
106
+ const handle = pool;
107
+ const k = await handle.getKnex();
108
+ return this.runSqlWithKnex(k, handle, request);
109
+ }
110
+ /** 事务/常规共用执行核心(k 可指定为事务连接) */
111
+ runSqlWithKnex(k, handle, request) {
112
+ const sql = normalizeSql(request.sql);
113
+ const type = detectStatementType(sql);
114
+ try {
115
+ if (isDmlStatement(type)) {
116
+ return this.runDml(handle, k, sql, request.params, type, request.dml);
117
+ }
118
+ if (type === 'SELECT') {
119
+ return this.runSelect(handle, k, sql, request);
120
+ }
121
+ if (type === 'DDL' || type === 'TRANSACTION') {
122
+ return k.raw(sql, this.bind(request.params)).then((raw) => {
123
+ const [result] = raw;
124
+ const header = result;
125
+ return { affectedRows: Number(header?.affectedRows ?? 0) };
126
+ });
127
+ }
128
+ throw new SqlEngineError('QUERY_FAILED', `暂不支持执行 ${type} 语句`);
129
+ }
130
+ catch (err) {
131
+ if (err instanceof SqlEngineError)
132
+ return Promise.reject(err);
133
+ return Promise.reject(wrapError('QUERY_FAILED', err));
134
+ }
135
+ }
136
+ /** 事务:knex.transaction(fn 抛错自动回滚,成功自动提交) */
137
+ async withTransaction(pool, fn) {
138
+ const handle = pool;
139
+ const k = await handle.getKnex();
140
+ const self = this;
141
+ return k.transaction(async (trx) => {
142
+ const tx = {
143
+ runSql: (req) => self.runSqlWithKnex(trx, handle, req),
144
+ query: (sql, params) => self.runSqlWithKnex(trx, handle, { sql, params }),
145
+ execute: (sql, params) => self.runSqlWithKnex(trx, handle, { sql, params }),
146
+ commit: async () => {
147
+ await trx.commit();
148
+ },
149
+ rollback: async () => {
150
+ await trx.rollback();
151
+ },
152
+ };
153
+ return fn(tx);
154
+ });
155
+ }
156
+ // ---- SELECT(分页包装按版本能力矩阵) ----
157
+ async runSelect(handle, k, sql, request) {
158
+ const offset = Math.max(Number(request.offset ?? 0), 0);
159
+ const limit = Math.max(Number(request.limit ?? 100), 0);
160
+ const params = request.params ?? [];
161
+ const caps = await handle.getCapabilities();
162
+ let baseSql = sql;
163
+ if (request.whereClause) {
164
+ baseSql = wrapWithWhereClause(sql, request.whereClause, { supportsCTE: caps.supportsCTE });
165
+ }
166
+ // 用户 SQL 自带分页 → 直接执行,不再二次包装
167
+ if (hasPaginationClause(baseSql, [/\bfetch\s+first\b/i, /\btop\b/i])) {
168
+ const [rows, fields] = (await k.raw(baseSql, this.bind(params)));
169
+ return {
170
+ rows: rows,
171
+ fields: mapMysqlProtocolFields(fields ?? []),
172
+ };
173
+ }
174
+ const countSql = buildCountSql(baseSql);
175
+ const [countRows] = (await k.raw(countSql, this.bind(params)));
176
+ const countArr = countRows;
177
+ const total = Number(countArr?.[0]?.total ?? 0);
178
+ const pageSql = buildPagedSql(baseSql, limit, offset);
179
+ const [rows, fields] = (await k.raw(pageSql, this.bind(params)));
180
+ return {
181
+ rows: rows,
182
+ fields: mapMysqlProtocolFields(fields ?? []),
183
+ total: Number.isNaN(total) ? 0 : total,
184
+ offset,
185
+ limit,
186
+ };
187
+ }
188
+ // ---- DML ----
189
+ async runDml(handle, k, sql, params, type, dmlOverride) {
190
+ const dml = dmlOverride ?? handle.config.dml ?? {};
191
+ const args = params ?? [];
192
+ // 安全护栏:无 WHERE 的 UPDATE/DELETE
193
+ if ((type === 'UPDATE' || type === 'DELETE') &&
194
+ dml.requireWhereForUpdateDelete !== false &&
195
+ !hasDmlWhere(sql)) {
196
+ throw new SqlEngineError('DML_BLOCKED', `禁止无 WHERE 的 ${type}(config.dml.requireWhereForUpdateDelete 可关闭)`);
197
+ }
198
+ // 批量插入上限
199
+ if (type === 'INSERT' && dml.maxInsertRows) {
200
+ const rows = countInsertValueRows(sql);
201
+ if (rows > dml.maxInsertRows) {
202
+ throw new SqlEngineError('DML_BLOCKED', `INSERT 行数 ${rows} 超过上限 ${dml.maxInsertRows}`);
203
+ }
204
+ }
205
+ const [result] = (await k.raw(sql, this.bind(args)));
206
+ const header = result;
207
+ const writeResult = { affectedRows: Number(header?.affectedRows ?? 0) };
208
+ if (type === 'INSERT' && header?.insertId !== undefined && header?.insertId !== 0) {
209
+ writeResult.insertId = header.insertId;
210
+ // returning=true:按自增主键回读插入行(仅限单自增主键表)
211
+ if (dml.returning) {
212
+ const table = extractInsertTable(sql);
213
+ if (table) {
214
+ const pk = await handle.getPrimaryKeyColumn(table);
215
+ if (pk) {
216
+ const rows = await this.getPreviewRows(handle, table, 0, 1, `${pk} = ${Number(header.insertId)}`);
217
+ writeResult.returning = rows;
218
+ }
219
+ }
220
+ }
221
+ }
222
+ return writeResult;
223
+ }
224
+ // ==================== 结构 JSON 检出 ====================
225
+ async getTableSchema(pool, table) {
226
+ const handle = pool;
227
+ const k = await handle.getKnex();
228
+ // 字段
229
+ const colRes = (await k.raw('SHOW FULL COLUMNS FROM ??', [table]));
230
+ const columns = (Array.isArray(colRes) ? colRes[0] : colRes);
231
+ if (!columns.length) {
232
+ throw new SqlEngineError('TABLE_NOT_FOUND', `表 ${table} 不存在`);
233
+ }
234
+ // 索引
235
+ const idxRes = (await k.raw('SHOW INDEX FROM ??', [table]));
236
+ const idxRows = (Array.isArray(idxRes) ? idxRes[0] : idxRes);
237
+ const indexMap = new Map();
238
+ for (const r of idxRows) {
239
+ let idx = indexMap.get(r.Key_name);
240
+ if (!idx) {
241
+ idx = { name: r.Key_name, unique: r.Non_unique === 0, columns: [], type: r.Index_type };
242
+ indexMap.set(r.Key_name, idx);
243
+ }
244
+ if (r.Column_name)
245
+ idx.columns.push(r.Column_name);
246
+ }
247
+ // 外键
248
+ const fkRes = (await k.raw(`SELECT kcu.constraint_name AS constraint_name, kcu.column_name AS column_name,
249
+ kcu.referenced_table_name AS referenced_table_name, kcu.referenced_column_name AS referenced_column_name,
250
+ rc.delete_rule AS delete_rule, rc.update_rule AS update_rule
251
+ FROM information_schema.key_column_usage kcu
252
+ JOIN information_schema.referential_constraints rc
253
+ ON kcu.constraint_name = rc.constraint_name AND kcu.table_schema = rc.constraint_schema
254
+ WHERE kcu.table_schema = DATABASE() AND kcu.table_name = ? AND kcu.referenced_table_name IS NOT NULL
255
+ ORDER BY kcu.constraint_name, kcu.ordinal_position`, [table]));
256
+ const fkRows = (Array.isArray(fkRes) ? fkRes[0] : fkRes);
257
+ const fkMap = new Map();
258
+ for (const r of fkRows) {
259
+ let fk = fkMap.get(r.constraint_name);
260
+ if (!fk) {
261
+ fk = {
262
+ name: r.constraint_name,
263
+ columns: [],
264
+ refTable: r.referenced_table_name,
265
+ refColumns: [],
266
+ onDelete: r.delete_rule || undefined,
267
+ onUpdate: r.update_rule || undefined,
268
+ };
269
+ fkMap.set(r.constraint_name, fk);
270
+ }
271
+ fk.columns.push(r.column_name);
272
+ fk.refColumns.push(r.referenced_column_name);
273
+ }
274
+ // 引擎/字符集/表注释
275
+ const tblRes = (await k.raw(`SELECT engine AS engine, table_collation AS table_collation, table_comment AS table_comment
276
+ FROM information_schema.tables
277
+ WHERE table_schema = DATABASE() AND table_name = ?`, [table]));
278
+ const tblRows = (Array.isArray(tblRes) ? tblRes[0] : tblRes);
279
+ const tbl = tblRows[0];
280
+ // 原始 DDL
281
+ const ddl = await this.getTableDDL(handle, table);
282
+ const columnSchemas = columns.map((c, i) => ({
283
+ name: c.Field,
284
+ type: c.Type,
285
+ nullable: c.Null !== 'NO',
286
+ default: c.Default,
287
+ comment: c.Comment,
288
+ primaryKey: String(c.Key || '').toUpperCase() === 'PRI',
289
+ autoIncrement: /auto_increment/i.test(c.Extra || ''),
290
+ ordinal: i + 1,
291
+ }));
292
+ return {
293
+ name: table,
294
+ schema: handle.config.database,
295
+ kind: 'table',
296
+ comment: tbl?.table_comment || undefined,
297
+ columns: columnSchemas,
298
+ indexes: [...indexMap.values()],
299
+ foreignKeys: [...fkMap.values()],
300
+ engine: tbl?.engine,
301
+ charset: tbl?.table_collation,
302
+ ddl,
303
+ raw: {},
304
+ };
305
+ }
306
+ getAllTableSchemas(pool, opts) {
307
+ const handle = pool;
308
+ const self = this;
309
+ return createTask(async (ctx) => {
310
+ const tables = await self.getTableList(handle);
311
+ const total = tables.length;
312
+ const schemas = [];
313
+ for (let i = 0; i < tables.length; i++) {
314
+ if (ctx.isCancelled())
315
+ break;
316
+ ctx.report({ stage: 'introspecting', processed: i, total, message: tables[i] });
317
+ try {
318
+ schemas.push(await self.getTableSchema(handle, tables[i]));
319
+ }
320
+ catch {
321
+ // 单表失败不中断整体导出
322
+ }
323
+ }
324
+ void opts;
325
+ return schemas;
326
+ });
327
+ }
328
+ }
329
+ /** 从 INSERT 语句提取目标表名(returning 回读用) */
330
+ function extractInsertTable(sql) {
331
+ const m = sql.match(/\bINSERT\s+INTO\s+([`"\[]?[^\s`"\[(]+[`"\]]?)/i);
332
+ if (!m)
333
+ return null;
334
+ return String(m[1]).replace(/[`"[\]]/g, '');
335
+ }
336
+ export const mysqlDriver = new MysqlDriver('mysql');
337
+ export const mariadbDriver = new MysqlDriver('mariadb');
338
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/driver/mysql/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * MySQL 连接池句柄(Knex/mysql2)
3
+ * 懒创建:首次操作才建立连接池;版本能力探测缓存
4
+ */
5
+ import { type Knex } from 'knex';
6
+ import type { PoolHandle } from '../interface.js';
7
+ import type { MysqlConfig } from '../../types/config.js';
8
+ import type { MysqlCapabilities } from './version.js';
9
+ /** 构建 MySQL SSL 配置 */
10
+ export declare function buildSslConfig(config: MysqlConfig): {
11
+ ca: string | undefined;
12
+ cert: string | undefined;
13
+ key: string | undefined;
14
+ rejectUnauthorized: boolean;
15
+ minVersion: string;
16
+ } | undefined;
17
+ export declare class MysqlPoolHandle implements PoolHandle {
18
+ readonly fingerprint: string;
19
+ readonly config: MysqlConfig;
20
+ readonly isMariaDb: boolean;
21
+ private knexInstance;
22
+ private caps;
23
+ private destroyedFlag;
24
+ /** 表主键列缓存(INSERT returning 回读用) */
25
+ private readonly pkCache;
26
+ constructor(config: MysqlConfig, options?: {
27
+ isMariaDb?: boolean;
28
+ });
29
+ get destroyed(): boolean;
30
+ /** 获取 Knex 实例(懒创建) */
31
+ getKnex(): Promise<Knex>;
32
+ /** 版本能力(config.version 强制时跳过探测;MariaDB 走独立解析) */
33
+ getCapabilities(): Promise<MysqlCapabilities>;
34
+ /** 主键列(返回空字符串表示无/多列主键) */
35
+ getPrimaryKeyColumn(table: string): Promise<string>;
36
+ get stats(): {
37
+ active: number;
38
+ idle: number;
39
+ waiting: number;
40
+ createdTotal: number;
41
+ destroyedTotal: number;
42
+ };
43
+ ping(): Promise<void>;
44
+ destroy(): Promise<void>;
45
+ }
46
+ //# sourceMappingURL=pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../src/driver/mysql/pool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAa,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,sBAAsB;AACtB,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW;;;;;;cASjD;AAED,qBAAa,eAAgB,YAAW,UAAU;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,aAAa,CAAS;IAC9B,mCAAmC;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;gBAEzC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO;IAOtE,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,sBAAsB;IAChB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC9B,iDAAiD;IAC3C,eAAe,IAAI,OAAO,CAAC,iBAAiB,CAAC;IASnD,0BAA0B;IACpB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBzD,IAAI,KAAK;;;;;;MAsBR;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAY/B"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * MySQL 连接池句柄(Knex/mysql2)
3
+ * 懒创建:首次操作才建立连接池;版本能力探测缓存
4
+ */
5
+ import knex, {} from 'knex';
6
+ import { resolveRuntime } from '../../runtime.js';
7
+ import { configKey } from '../../core/config.js';
8
+ import { resolveMysqlCapabilities } from './version.js';
9
+ /** 构建 MySQL SSL 配置 */
10
+ export function buildSslConfig(config) {
11
+ if (!config.ssl?.enabled)
12
+ return undefined;
13
+ return {
14
+ ca: config.ssl.ca || undefined,
15
+ cert: config.ssl.cert || undefined,
16
+ key: config.ssl.key || undefined,
17
+ rejectUnauthorized: config.ssl.rejectUnauthorized ?? false,
18
+ minVersion: 'TLSv1.2',
19
+ };
20
+ }
21
+ export class MysqlPoolHandle {
22
+ fingerprint;
23
+ config;
24
+ isMariaDb;
25
+ knexInstance = null;
26
+ caps = null;
27
+ destroyedFlag = false;
28
+ /** 表主键列缓存(INSERT returning 回读用) */
29
+ pkCache = new Map();
30
+ constructor(config, options = {}) {
31
+ this.config = { ...config };
32
+ this.fingerprint = configKey(config);
33
+ this.isMariaDb = options.isMariaDb ?? config.type === 'mariadb';
34
+ void resolveRuntime; // runtime 兼容占位(mysql 驱动不依赖 runtime 差异)
35
+ }
36
+ get destroyed() {
37
+ return this.destroyedFlag;
38
+ }
39
+ /** 获取 Knex 实例(懒创建) */
40
+ async getKnex() {
41
+ if (!this.knexInstance) {
42
+ const cfg = this.config;
43
+ this.knexInstance = knex({
44
+ client: 'mysql2',
45
+ connection: {
46
+ host: cfg.host,
47
+ port: Number(cfg.port ?? 3306),
48
+ user: cfg.user || cfg.username,
49
+ password: cfg.password,
50
+ database: cfg.database,
51
+ ssl: buildSslConfig(cfg),
52
+ enableKeepAlive: true,
53
+ keepAliveInitialDelay: 10000,
54
+ connectTimeout: 10000,
55
+ },
56
+ pool: {
57
+ min: 0,
58
+ max: 20,
59
+ acquireTimeoutMillis: 20000,
60
+ createTimeoutMillis: 15000,
61
+ idleTimeoutMillis: 30000,
62
+ reapIntervalMillis: 1000,
63
+ createRetryIntervalMillis: 100,
64
+ propagateCreateError: false,
65
+ // 每条连接建立后设置慢查询兜底:MySQL 用 max_execution_time(ms),MariaDB 用 max_statement_time(s)
66
+ afterCreate: (conn, done) => {
67
+ const setVar = this.isMariaDb
68
+ ? 'SET SESSION max_statement_time = 30'
69
+ : 'SET SESSION max_execution_time = 30000';
70
+ conn.query(setVar, (err) => {
71
+ done(err, conn);
72
+ });
73
+ },
74
+ },
75
+ });
76
+ }
77
+ return this.knexInstance;
78
+ }
79
+ /** 版本能力(config.version 强制时跳过探测;MariaDB 走独立解析) */
80
+ async getCapabilities() {
81
+ this.caps ??= await resolveMysqlCapabilities(await this.getKnex(), this.config.version, this.isMariaDb);
82
+ return this.caps;
83
+ }
84
+ /** 主键列(返回空字符串表示无/多列主键) */
85
+ async getPrimaryKeyColumn(table) {
86
+ const cached = this.pkCache.get(table);
87
+ if (cached !== undefined)
88
+ return cached;
89
+ const k = await this.getKnex();
90
+ const res = (await k.raw(`SELECT column_name AS column_name FROM information_schema.key_column_usage
91
+ WHERE table_schema = DATABASE() AND table_name = ? AND constraint_name = 'PRIMARY'
92
+ ORDER BY ordinal_position`, [table]));
93
+ const rows = (Array.isArray(res) ? res[0] : res);
94
+ const pk = rows?.length === 1 ? String(rows[0].column_name ?? '') : '';
95
+ this.pkCache.set(table, pk);
96
+ return pk;
97
+ }
98
+ get stats() {
99
+ // tarn 连接池统计(knex 3)
100
+ let active = 0;
101
+ let idle = 0;
102
+ let waiting = 0;
103
+ try {
104
+ const pool = this.knexInstance?.client?.pool;
105
+ if (pool && typeof pool.numUsed === 'function') {
106
+ active = pool.numUsed();
107
+ idle = pool.numFree();
108
+ waiting = pool.numPendingAcquires();
109
+ }
110
+ }
111
+ catch {
112
+ // 统计失败不影响主流程
113
+ }
114
+ return {
115
+ active,
116
+ idle,
117
+ waiting,
118
+ createdTotal: this.knexInstance ? 1 : 0,
119
+ destroyedTotal: this.destroyedFlag ? 1 : 0,
120
+ };
121
+ }
122
+ async ping() {
123
+ const k = await this.getKnex();
124
+ await k.raw('SELECT 1');
125
+ }
126
+ async destroy() {
127
+ if (this.destroyedFlag)
128
+ return;
129
+ this.destroyedFlag = true;
130
+ if (this.knexInstance) {
131
+ try {
132
+ await this.knexInstance.destroy();
133
+ }
134
+ catch {
135
+ // 销毁失败不阻塞
136
+ }
137
+ this.knexInstance = null;
138
+ }
139
+ }
140
+ }
141
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../src/driver/mysql/pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * MySQL 版本探测与能力矩阵(5.7 / 8.x 双模式路由)
3
+ */
4
+ import type { Knex } from 'knex';
5
+ export interface MysqlCapabilities {
6
+ /** 主版本号(5 / 8 / 0=未知) */
7
+ major: number;
8
+ /** CTE(WITH ... AS),MySQL 8+ */
9
+ supportsCTE: boolean;
10
+ /** 窗口函数,MySQL 8+ */
11
+ supportsWindowFunctions: boolean;
12
+ /** JSON 类型,5.7.8+ */
13
+ supportsJson: boolean;
14
+ }
15
+ export declare const MYSQL5_CAPS: MysqlCapabilities;
16
+ export declare const MYSQL8_CAPS: MysqlCapabilities;
17
+ /** 解析 VERSION() 字符串 → 能力矩阵 */
18
+ export declare function parseMysqlVersion(version: string): MysqlCapabilities;
19
+ /** 通过 SELECT VERSION() 探测(knex raw 对 mysql2 返回 [rows, fields]) */
20
+ export declare function detectMysqlVersion(k: Knex): Promise<MysqlCapabilities>;
21
+ /** 解析 MariaDB VERSION() → 能力矩阵(10.2+ CTE / 10.3+ 窗口函数 / 10.2+ JSON) */
22
+ export declare function parseMariaDbVersion(version: string): MysqlCapabilities;
23
+ /** 探测 VERSION() 原始字符串 */
24
+ export declare function detectVersionString(k: Knex): Promise<string>;
25
+ /** 按 config.version 解析能力(强制模式 / auto 探测;isMariaDb 决定解析器) */
26
+ export declare function resolveMysqlCapabilities(k: Knex, versionChoice: '5' | '8' | 'auto' | '10' | '11' | undefined, isMariaDb?: boolean): Promise<MysqlCapabilities>;
27
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/driver/mysql/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,WAAW,iBAAiB;IAChC,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,oBAAoB;IACpB,uBAAuB,EAAE,OAAO,CAAC;IACjC,qBAAqB;IACrB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,WAAW,EAAE,iBAKzB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,iBAKzB,CAAC;AAEF,8BAA8B;AAC9B,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAYpE;AAED,kEAAkE;AAClE,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAK5E;AAED,uEAAuE;AACvE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAYtE;AAED,yBAAyB;AACzB,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAIlE;AAED,4DAA4D;AAC5D,wBAAsB,wBAAwB,CAC5C,CAAC,EAAE,IAAI,EACP,aAAa,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,EAC3D,SAAS,UAAQ,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAiB5B"}