/** * 达梦数据库适配器 * 达梦数据库高度兼容 Oracle,使用类似的 API 和系统视图 * * dmdb 驱动会作为可选依赖自动安装 * * 性能优化:使用批量查询获取 Schema 信息,避免 N+1 查询问题 * * 连接管理:使用心跳保活 + 断线自动重连 + 操作自动重试,确保长连接稳定性 */ import { BaseAdapter, ExecuteScriptOptions, ExecuteBatchOptions, TransactionContext, BatchResult } from './base.js'; import type { QueryResult, SchemaInfo, TableInfo } from '../types/adapter.js'; export declare class DMAdapter extends BaseAdapter { private connection; private pool; private heartbeatTimer; private connectionConfig; private config; constructor(config: { host: string; port: number; user?: string; password?: string; database?: string; poolConfig?: { max?: number; min?: number; idleTimeoutMs?: number; }; }); private reconnect; private startHeartbeat; private stopHeartbeat; private withRetry; /** * 连接到达梦数据库 * * 注意:dmdb 驱动的 getConnection() 方法不支持 connectString 参数, * 只能通过 createPool + pool.getConnection() 的方式连接。 * 同时需要通过 URL 参数 loginEncrypt=false 禁用消息加密, * 避免 Node.js 22 的 OpenSSL 3.0 与达梦加密算法不兼容的问题。 */ connect(): Promise; /** * 断开数据库连接 */ disconnect(): Promise; /** * 执行 SQL 查询 */ executeQuery(query: string, params?: unknown[]): Promise; /** * 获取数据库结构信息(批量查询优化版本) * * 达梦数据库中: * - database 是数据库实例名(如 DAMENG) * - schema 是用户的命名空间(通常与用户名相同,如 SHOP) * - 表存储在 schema 下,不是 database 下 * * 注意:dmdb 驱动返回的列名是数字索引("0", "1", ...),不是列名! * 因此需要按索引位置访问数据。 */ /** * v4.0.3: Fast-path single-table metadata. Issues 4 targeted queries * filtered by table name/owner, avoiding full schema scan. */ getTableInfo(tableName: string): Promise; getSchema(): Promise; private _getSchemaImpl; /** * 按索引获取对象的值(dmdb 驱动返回的列名是数字索引) */ private getValueByIndex; private makeTableKey; /** * 组装 Schema 信息(处理 dmdb 驱动返回的数字索引列名) */ private assembleSchemaFromIndexedRows; /** * 格式化达梦数据类型 */ private formatDMType; /** * P0-3 + Bug #44: Override withTransaction to pin all statements to a single physical connection. * * v3.2.8 设计:用 BEGIN/COMMIT 包,期望 atomic。但 dmdb npm driver 发 BEGIN/COMMIT 时 * 协议层异常(connection drop / [-2007] 语法错误 第 10 列[]),实测独立 SELECT/INSERT 都 OK, * 一旦 BEGIN/COMMIT 包就 ECONNRESET。原因推测 dmdb driver 在 autoCommit:false 模式下 * 没正确发送 BEGIN,DM 把它当普通 SQL 解析 → "BEGIN" 5 字符 第 10 列 不存在。 * * v3.2.8 妥协方案:去掉 BEGIN/COMMIT,只保单连接。每条 statement autoCommit:true * 独立提交。代价:execute_script 不再 atomic(部分失败部分成功)。 * 文档化为 DM adapter limitation;真 atomic 需用 PL/SQL BEGIN...END;...;END; 单 block, * dmdb 协议层正常,但 splitStatements 对 PL/SQL BEGIN/END 的处理需后续验证。 */ withTransaction(fn: (tx: TransactionContext) => Promise): Promise; /** * P0-3 + Bug #44 fix: Override executeScript. * 使用 withTransaction(单连接 + 每句 autoCommit),multi-statement 可跑但非 atomic。 */ executeScript(query: string, options?: ExecuteScriptOptions): Promise; /** * Bug #44 fix follow-up: Override executeBatch. * BaseAdapter.executeBatch 默认发 `BEGIN`/`COMMIT`/`ROLLBACK`(见 src/adapters/base.ts:215), * dmdb driver 在 DM 上发 BEGIN 立即 [-2007]/ECONNRESET(协议层 bug,跟 withTransaction 同根)。 * 复用 withTransaction 的 skip-BEGIN 思路:每行 autoCommit:true 独立提交,非 atomic。 */ executeBatch(sql: string, paramsList: unknown[][], options?: ExecuteBatchOptions): Promise; /** * 检查是否为写操作 */ isWriteOperation(query: string): boolean; protected getDialect(): import('../utils/adapter-factory.js').DbType; } //# sourceMappingURL=dm.d.ts.map