@h-ai/reldb 1.0.0-beta.22 → 1.0.0-beta.23
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.en.md +5 -6
- package/README.ja.md +5 -6
- package/README.md +5 -6
- package/dist/index.d.ts +3 -46
- package/dist/index.js +19 -107
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../messages/en-US.json","../messages/ja-JP.json","../messages/zh-CN.json","../src/reldb-i18n.ts","../src/reldb-types.ts","../src/reldb-crud-repository.ts","../src/reldb-json.ts","../src/reldb-pagination.ts","../src/reldb-security.ts","../src/reldb-crud-kernel.ts","../src/providers/reldb-tx-assembler.ts","../src/providers/reldb-provider-base.ts","../src/providers/reldb-ddl-builder.ts","../src/providers/reldb-provider-mysql.ts","../src/providers/reldb-provider-postgres.ts","../src/providers/sqlite/reldb-sqlite-engine.ts","../src/providers/reldb-provider-sqlite.ts","../src/reldb-migration.ts","../src/reldb-main.ts"],"names":["core","sql","pagination","ok","err","key","logger","currentConfig","performance","resolve","createRequire","delay","require"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"reldb_notInitialized\": \"Database not initialized, please call db.init() first\",\n \"reldb_initFailed\": \"Failed to initialize database\",\n \"reldb_closeFailed\": \"Failed to close database\",\n \"reldb_ddlFailed\": \"DDL operation failed\",\n \"reldb_queryFailed\": \"Query failed\",\n \"reldb_duplicateEntry\": \"Record already exists\",\n \"reldb_batchFailed\": \"Batch execute failed\",\n \"reldb_postgresTxFailed\": \"Transaction failed\",\n \"reldb_postgresOnlyPostgresql\": \"PostgreSQL Provider only supports postgresql type\",\n \"reldb_postgresConnectionFailed\": \"Failed to connect to PostgreSQL\",\n \"reldb_sqliteOnlySqlite\": \"SQLite Provider only supports sqlite type\",\n \"reldb_sqliteNeedPath\": \"SQLite requires database path (database field)\",\n \"reldb_sqliteConnectionFailed\": \"Failed to connect to SQLite\",\n \"reldb_sqliteTxFailed\": \"Transaction failed\",\n \"reldb_sqliteBatchFailed\": \"Batch execute failed\",\n \"reldb_mysqlOnlyMysql\": \"MySQL Provider only supports mysql type\",\n \"reldb_mysqlConnectionFailed\": \"Failed to connect to MySQL\",\n \"reldb_mysqlTxFailed\": \"Transaction failed\",\n \"reldb_mysqlPoolQueueFull\": \"MySQL connection acquisition queue is full\",\n \"reldb_mysqlPoolAcquireTimeout\": \"MySQL connection acquisition deadline exceeded\",\n \"reldb_mysqlPoolReleaseFailed\": \"MySQL connection release failed; close the database before retrying\",\n \"reldb_mysqlTlsDnsRequired\": \"MySQL hostname verification requires a DNS hostname matching the certificate; the current driver cannot verify an IP address identity\",\n \"reldb_crudEmptyPayload\": \"CRUD payload is empty, please provide data\",\n \"reldb_crudNoValidColumns\": \"CRUD payload has no valid columns\",\n \"reldb_crudRecordNotFound\": \"Record not found: {id}\",\n \"reldb_invalidIdentifier\": \"Invalid SQL identifier: {name} (only letters, digits and underscores allowed)\",\n \"reldb_configError\": \"Database config validation failed\",\n \"reldb_txFailed\": \"Transaction failed\",\n \"reldb_sharedBackendRequired\": \"Production mode requires a shared backend; local files and memory backends are for development or explicit end-to-end tests.\",\n \"reldb_jsonPatchObjectRequired\": \"JSON merge patch must be an object\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"reldb_notInitialized\": \"データベースが初期化されていません。先にdb.init()を呼び出してください\",\n \"reldb_initFailed\": \"データベースの初期化に失敗しました\",\n \"reldb_closeFailed\": \"データベースの終了に失敗しました\",\n \"reldb_ddlFailed\": \"DDL操作に失敗しました\",\n \"reldb_queryFailed\": \"クエリに失敗しました\",\n \"reldb_duplicateEntry\": \"レコードは既に存在します\",\n \"reldb_batchFailed\": \"バッチ実行に失敗しました\",\n \"reldb_postgresTxFailed\": \"トランザクションに失敗しました\",\n \"reldb_postgresOnlyPostgresql\": \"PostgreSQLプロバイダーはpostgresql型のみに対応しています\",\n \"reldb_postgresConnectionFailed\": \"PostgreSQLへの接続に失敗しました\",\n \"reldb_sqliteOnlySqlite\": \"SQLiteプロバイダーはsqlite型のみに対応しています\",\n \"reldb_sqliteNeedPath\": \"SQLiteにはデータベースのパス(databaseフィールド)が必要です\",\n \"reldb_sqliteConnectionFailed\": \"SQLiteへの接続に失敗しました\",\n \"reldb_sqliteTxFailed\": \"トランザクションに失敗しました\",\n \"reldb_sqliteBatchFailed\": \"バッチ実行に失敗しました\",\n \"reldb_mysqlOnlyMysql\": \"MySQLプロバイダーはmysql型のみに対応しています\",\n \"reldb_mysqlConnectionFailed\": \"MySQLへの接続に失敗しました\",\n \"reldb_mysqlTxFailed\": \"トランザクションに失敗しました\",\n \"reldb_mysqlPoolQueueFull\": \"MySQL 接続取得キューが満杯です\",\n \"reldb_mysqlPoolAcquireTimeout\": \"MySQL 接続取得の待機期限を超過しました\",\n \"reldb_mysqlPoolReleaseFailed\": \"MySQL 接続の解放に失敗しました。再試行する前にデータベースを終了してください\",\n \"reldb_mysqlTlsDnsRequired\": \"MySQL のホスト名検証には証明書と一致する DNS ホスト名が必要です。現在のドライバーでは IP アドレスの識別情報を検証できません\",\n \"reldb_crudEmptyPayload\": \"CRUDペイロードが空です。データを指定してください\",\n \"reldb_crudNoValidColumns\": \"CRUDペイロードに有効な列がありません\",\n \"reldb_crudRecordNotFound\": \"レコードが見つかりません: {id}\",\n \"reldb_invalidIdentifier\": \"SQL識別子が無効です: {name}(英数字とアンダースコアのみ使用できます)\",\n \"reldb_configError\": \"データベース設定の検証に失敗しました\",\n \"reldb_txFailed\": \"トランザクションに失敗しました\",\n \"reldb_sharedBackendRequired\": \"本番環境には共有バックエンドが必要です。ローカルファイルとメモリーバックエンドは開発環境または明示的な E2E テストでのみ使用できます。\",\n \"reldb_jsonPatchObjectRequired\": \"JSON マージパッチはオブジェクトで指定してください\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"reldb_notInitialized\": \"数据库未初始化,请先调用 db.init()\",\n \"reldb_initFailed\": \"初始化数据库失败\",\n \"reldb_closeFailed\": \"关闭数据库失败\",\n \"reldb_ddlFailed\": \"DDL 操作失败\",\n \"reldb_queryFailed\": \"查询失败\",\n \"reldb_duplicateEntry\": \"记录已存在\",\n \"reldb_batchFailed\": \"批量执行失败\",\n \"reldb_postgresTxFailed\": \"事务执行失败\",\n \"reldb_postgresOnlyPostgresql\": \"PostgreSQL Provider 仅支持 postgresql 类型\",\n \"reldb_postgresConnectionFailed\": \"连接 PostgreSQL 失败\",\n \"reldb_sqliteOnlySqlite\": \"SQLite Provider 仅支持 sqlite 类型\",\n \"reldb_sqliteNeedPath\": \"SQLite 需要提供数据库路径(database 字段)\",\n \"reldb_sqliteConnectionFailed\": \"连接 SQLite 失败\",\n \"reldb_sqliteTxFailed\": \"事务执行失败\",\n \"reldb_sqliteBatchFailed\": \"批量执行失败\",\n \"reldb_mysqlOnlyMysql\": \"MySQL Provider 仅支持 mysql 类型\",\n \"reldb_mysqlConnectionFailed\": \"连接 MySQL 失败\",\n \"reldb_mysqlTxFailed\": \"事务执行失败\",\n \"reldb_mysqlPoolQueueFull\": \"MySQL 连接获取等待队列已满\",\n \"reldb_mysqlPoolAcquireTimeout\": \"MySQL 连接获取已超过截止期限\",\n \"reldb_mysqlPoolReleaseFailed\": \"MySQL 连接归还失败,请关闭数据库后重试\",\n \"reldb_mysqlTlsDnsRequired\": \"MySQL 当前驱动的主机身份验证要求使用与证书匹配的 DNS 主机名,不能验证 IP 地址身份\",\n \"reldb_crudEmptyPayload\": \"CRUD 数据为空,请提供数据\",\n \"reldb_crudNoValidColumns\": \"CRUD 数据没有有效列\",\n \"reldb_crudRecordNotFound\": \"记录不存在: {id}\",\n \"reldb_invalidIdentifier\": \"非法的 SQL 标识符: {name}(仅允许字母、数字和下划线)\",\n \"reldb_configError\": \"数据库配置校验失败\",\n \"reldb_txFailed\": \"事务执行失败\",\n \"reldb_sharedBackendRequired\": \"生产模式需要跨节点共享后端;本机文件或内存后端仅用于开发和显式端到端测试。\",\n \"reldb_jsonPatchObjectRequired\": \"JSON 合并补丁必须是对象\"\n}\n","/**\n * @h-ai/reldb — i18n\n *\n * 本文件提供数据库模块的 i18n 文案访问入口。\n * @module reldb-i18n\n */\n\nimport { core } from '@h-ai/core'\nimport messagesEnUS from '../messages/en-US.json'\nimport messagesJaJP from '../messages/ja-JP.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\n// ─── i18n ───\n\n/**\n * 数据库模块文案 Key 类型\n * @example 模块内部上下文\n * ```ts\n * const key: ReldbMessageKey = 'reldb_notInitialized'\n * void reldbM(key)\n * ```\n */\ntype ReldbMessageKey = keyof typeof messagesZhCN\n\n/**\n * 获取数据库模块文案。\n * @param key - 文案 Key\n * @param options - 插值参数与格式化选项\n * @returns 本地化后的文案字符串\n * @remarks 具体参数结构与 core.i18n.createMessageGetter 保持一致。\n * @example 模块内部上下文\n * ```ts\n * void reldbM('reldb_notInitialized', { locale: 'en-US' })\n * ```\n */\nexport const reldbM = core.i18n.createMessageGetter<ReldbMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n 'ja-JP': messagesJaJP,\n})\n","/**\n * @h-ai/reldb — 类型定义\n *\n * 本文件定义数据库模块的核心接口和类型(非配置相关)。 配置相关类型请从 reldb-config.ts 导入。\n * @module reldb-types\n */\n\nimport type { ErrorInfo, HaiResult, PaginatedResult, PaginationOptions, PaginationOptionsInput } from '@h-ai/core'\nimport type { DbType, ReldbConfig, ReldbConfigInput } from './reldb-config.js'\nimport type { JsonSqlExpr, ReldbJsonOps } from './reldb-json.js'\nimport type { SchemaMigration, SchemaMigrationPlan } from './reldb-migration.js'\nimport { core } from '@h-ai/core'\n\nexport type { JsonSqlExpr, ReldbJsonOps }\n\n// ─── 错误类型 ───\n\nconst ReldbErrorInfo = {\n // ─── 通用 001-009 ───\n CONNECTION_FAILED: '001:500',\n QUERY_FAILED: '002:500',\n CONSTRAINT_VIOLATION: '003:409',\n TRANSACTION_FAILED: '004:500',\n MIGRATION_FAILED: '005:500',\n RECORD_NOT_FOUND: '006:404',\n DUPLICATE_ENTRY: '007:409',\n DEADLOCK: '008:500',\n TIMEOUT: '009:504',\n // ─── 初始化 010-019 ───\n NOT_INITIALIZED: '010:500',\n POOL_EXHAUSTED: '011:503',\n UNSUPPORTED_TYPE: '012:400',\n CONFIG_ERROR: '013:500',\n // ─── 业务操作 020+ ───\n DDL_FAILED: '020:500',\n} satisfies ErrorInfo\n\n/**\n * HaiReldbError 的数据约束与操作契约。\n * @example\n * ```ts\n * import { HaiReldbError } from '@h-ai/reldb'\n * import { err } from '@h-ai/core'\n *\n * const result = err(HaiReldbError.QUERY_FAILED, 'Query failed')\n * if (!result.success) void result.error.code\n * ```\n */\nexport const HaiReldbError = core.error.buildHaiErrorsDef('reldb', ReldbErrorInfo)\n\n// ─── 列定义 ───\n\n/**\n * 列数据类型\n *\n * 统一的列类型定义,会根据不同数据库自动映射:\n *\n * | 类型 | SQLite | PostgreSQL | MySQL |\n * |------------|---------|------------------|--------------|\n * | TEXT | TEXT | TEXT | VARCHAR(255) |\n * | INTEGER | INTEGER | INTEGER/BIGSERIAL | INT/BIGINT |\n * | BIGINT | INTEGER | BIGINT | BIGINT |\n * | REAL | REAL | DOUBLE PRECISION | DOUBLE |\n * | BLOB | BLOB | BYTEA | BLOB |\n * | BOOLEAN | INTEGER | BOOLEAN | TINYINT(1) |\n * | TIMESTAMP | INTEGER | TIMESTAMP | DATETIME |\n * | JSON | TEXT | JSONB | JSON |\n *\n * 注:MySQL 将 TEXT 映射为 VARCHAR(255) 以支持索引和 UNIQUE 约束。\n * INTEGER 在 MySQL autoIncrement 时映射为 BIGINT,在 PostgreSQL 映射为 BIGSERIAL,否则为 32 位 INT/INTEGER。\n * Unix 毫秒应声明为 BIGINT;原始 SQL/CRUD 的 BIGINT 返回形态取决于驱动,可能为 number/string/bigint。\n * 使用 number 的业务仓库须校验 Number.isSafeInteger,超出范围不能直接强转而丢失精度。\n * @example\n * ```ts\n * import type { ColumnType } from '@h-ai/reldb'\n *\n * const value: ColumnType = 'TEXT'\n * void value\n * ```\n */\nexport type ColumnType\n = | 'TEXT'\n | 'INTEGER'\n | 'BIGINT'\n | 'REAL'\n | 'BLOB'\n | 'BOOLEAN'\n | 'TIMESTAMP'\n | 'JSON'\n\n/**\n * 列定义接口\n *\n * 用于定义表的列结构。\n * @example\n * ```ts\n * import type { ReldbColumnDef } from '@h-ai/reldb'\n *\n * const value: ReldbColumnDef = { type: 'INTEGER', primaryKey: true, autoIncrement: true }\n * void value\n * ```\n */\nexport interface ReldbColumnDef {\n /** 列数据类型 */\n type: ColumnType\n /** 是否为主键 */\n primaryKey?: boolean\n /** 是否自增(仅主键有效) */\n autoIncrement?: boolean\n /** 是否非空 */\n notNull?: boolean\n /** 默认值(支持字符串、数字、布尔、null) */\n defaultValue?: string | number | boolean | null\n /** 是否唯一 */\n unique?: boolean\n /** 外键引用 */\n references?: {\n /** 引用的表名 */\n table: string\n /** 引用的列名 */\n column: string\n /** 删除时的行为 */\n onDelete?: 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION'\n /** 更新时的行为 */\n onUpdate?: 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION'\n }\n}\n\n/**\n * 表定义(列名到列定义的映射)\n * @example\n * ```ts\n * import type { ReldbTableDef } from '@h-ai/reldb'\n *\n * const value: ReldbTableDef = { id: { type: 'TEXT', primaryKey: true }, name: { type: 'TEXT', notNull: true } }\n * void value\n * ```\n */\nexport interface ReldbTableDef {\n [columnName: string]: ReldbColumnDef\n}\n\n/**\n * 索引定义\n * @example\n * ```ts\n * import type { ReldbIndexDef } from '@h-ai/reldb'\n *\n * const value: ReldbIndexDef = { columns: ['email'], unique: true }\n * void value\n * ```\n */\nexport interface ReldbIndexDef {\n /** 索引包含的列 */\n columns: string[]\n /** 是否为唯一索引 */\n unique?: boolean\n /**\n * 索引条件(WHERE 子句,用于部分索引)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,不会经过参数化处理,\n * **禁止**将用户输入直接拼接。仅用于开发者编写的静态条件。\n * @example\n * ```ts\n * import type { CrudQueryOptions } from '@h-ai/reldb'\n *\n * const options: CrudQueryOptions = { where: 'name = ?', params: ['Alice'] }\n * void options // 值走绑定参数;SQL 结构由开发者静态编写。\n * ```\n */\n where?: string\n}\n\n// ─── DDL 操作接口 ───\n\n/**\n * DDL(数据定义语言)操作接口\n *\n * 提供表结构管理功能,包括创建/删除表、添加/删除列、创建索引等。\n * 结构修改返回 `HaiResult<void>`;hasTable 返回 `HaiResult<boolean>`,以实际签名为准。\n * @example\n * ```ts\n * import type { DdlOperations } from '@h-ai/reldb'\n *\n * async function use(operations: DdlOperations) {\n * const result = await operations.createTable('users', { id: { type: 'TEXT', primaryKey: true } })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * }\n * ```\n */\nexport interface DdlOperations {\n /**\n * 创建表\n * @param tableName - 表名\n * @param columns - 列定义\n * @param ifNotExists - 是否使用 IF NOT EXISTS(默认 true)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.createTable('users', { id: { type: 'TEXT', primaryKey: true }, name: { type: 'TEXT' } })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n createTable: (tableName: string, columns: ReldbTableDef, ifNotExists?: boolean) => Promise<HaiResult<void>>\n\n /**\n * 删除表\n * @param tableName - 表名\n * @param ifExists - 是否使用 IF EXISTS(默认 true)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.dropTable('users_backup')\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n dropTable: (tableName: string, ifExists?: boolean) => Promise<HaiResult<void>>\n\n /**\n * 添加列\n * @param tableName - 表名\n * @param columnName - 列名\n * @param columnDef - 列定义\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.addColumn('users', 'age', { type: 'INTEGER' })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n addColumn: (tableName: string, columnName: string, columnDef: ReldbColumnDef) => Promise<HaiResult<void>>\n\n /**\n * 删除列\n * @param tableName - 表名\n * @param columnName - 列名\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.dropColumn('users', 'legacy_field')\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n dropColumn: (tableName: string, columnName: string) => Promise<HaiResult<void>>\n\n /**\n * 重命名表\n * @param oldName - 原表名\n * @param newName - 新表名\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.renameTable('users_old', 'users')\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n renameTable: (oldName: string, newName: string) => Promise<HaiResult<void>>\n\n /**\n * 创建索引\n * @param tableName - 表名\n * @param indexName - 索引名\n * @param indexDef - 索引定义\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.createIndex('users', 'users_name_idx', { columns: ['name'] })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n createIndex: (tableName: string, indexName: string, indexDef: ReldbIndexDef) => Promise<HaiResult<void>>\n\n /**\n * 删除索引\n * @param indexName - 索引名\n * @param ifExists - 是否使用 IF EXISTS(默认 true)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.dropIndex('users_name_idx')\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n dropIndex: (indexName: string, ifExists?: boolean) => Promise<HaiResult<void>>\n\n /**\n * 执行原始 DDL SQL\n *\n * **⚠️ 安全警告:** `sql` 参数不会经过标识符校验或参数化处理,\n * **禁止**将用户输入直接拼接到 SQL 中,否则会导致 SQL 注入风险。\n * 仅用于开发者编写的静态 DDL 语句(如 ALTER TABLE)。\n *\n * @param sql - DDL SQL 语句(必须为开发者静态构造,禁止包含用户输入)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.raw('ALTER TABLE users ADD COLUMN status TEXT')\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n raw: (sql: string) => Promise<HaiResult<void>>\n}\n\n// ─── SQL 操作接口 ───\n\n/**\n * 查询结果行类型\n *\n * 约定为键值对象,字段名与 SQL 返回列一致。\n * @example\n * ```ts\n * import type { QueryRow } from '@h-ai/reldb'\n *\n * const value: QueryRow = { id: 'u1', name: 'Alice' }\n * void value\n * ```\n */\nexport type QueryRow = Record<string, unknown>\n\n/**\n * 执行结果\n *\n * INSERT/UPDATE/DELETE 操作返回的结果。\n * @example\n * ```ts\n * import type { ExecuteResult } from '@h-ai/reldb'\n *\n * const value: ExecuteResult = { changes: 1 }\n * void value\n * ```\n */\nexport interface ExecuteResult {\n /** 影响的行数 */\n changes: number\n /** 最后插入的行 ID(仅 INSERT 时有效) */\n lastInsertRowid?: number | bigint\n}\n\n// ─── 分页类型 ───\n\n/**\n * 规范化后的分页参数\n * @example\n * ```ts\n * import type { NormalizedPagination } from '@h-ai/reldb'\n *\n * const value: NormalizedPagination = { page: 2, pageSize: 10, offset: 10, limit: 10 }\n * void value\n * ```\n */\nexport interface NormalizedPagination extends PaginationOptions {\n /** SQL offset */\n offset: number\n /** SQL limit */\n limit: number\n}\n\n/**\n * 分页参数覆盖\n * @example\n * ```ts\n * import type { PaginationOverrides } from '@h-ai/reldb'\n *\n * const value: PaginationOverrides = { defaultPageSize: 20, maxPageSize: 100 }\n * void value\n * ```\n */\nexport interface PaginationOverrides {\n /** 默认页码 */\n defaultPage?: number\n /** 默认每页数量 */\n defaultPageSize?: number\n /** 最大每页数量 */\n maxPageSize?: number\n}\n\n/**\n * 分页查询参数\n * @example\n * ```ts\n * import type { PaginationQueryOptions } from '@h-ai/reldb'\n *\n * const value: PaginationQueryOptions = { sql: 'SELECT id, name FROM users WHERE active = ?', params: [true], pagination: { page: 2, pageSize: 10 } }\n * void value\n * ```\n */\nexport interface PaginationQueryOptions {\n /** 数据查询 SQL(不含 LIMIT/OFFSET) */\n sql: string\n /** 参数列表 */\n params?: unknown[]\n /** 分页参数 */\n pagination?: PaginationOptionsInput\n /** 覆盖默认分页参数 */\n overrides?: PaginationOverrides\n}\n\n/**\n * 数据读写操作接口(SQL / 事务共享)\n * @example\n * ```ts\n * import type { DmlOperations } from '@h-ai/reldb'\n *\n * async function use(operations: DmlOperations) {\n * const result = await operations.query<{ id: string }>('SELECT id FROM users WHERE name = ?', ['Alice'])\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport interface DmlOperations {\n /**\n * 查询多行\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.sql.query<{ id: string }>('SELECT id FROM users WHERE name = ?', ['Alice'])\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n query: <T = QueryRow>(sql: string, params?: unknown[]) => Promise<HaiResult<T[]>>\n /**\n * 查询单行\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.sql.get<{ id: string }>('SELECT id FROM users WHERE name = ?', ['Alice'])\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n get: <T = QueryRow>(sql: string, params?: unknown[]) => Promise<HaiResult<T | null>>\n /**\n * 执行修改语句(INSERT/UPDATE/DELETE)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.sql.execute('UPDATE users SET name = ? WHERE id = ?', ['Alice', 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n execute: (sql: string, params?: unknown[]) => Promise<HaiResult<ExecuteResult>>\n /**\n * 批量执行多条语句(在同一事务上下文中)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.sql.batch([{ sql: 'UPDATE users SET name = ? WHERE id = ?', params: ['Alice', 'u1'] }])\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n batch: (statements: Array<{ sql: string, params?: unknown[] }>) => Promise<HaiResult<void>>\n /**\n * 分页查询\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.sql.queryPage<{ id: string }>({ sql: 'SELECT id FROM users', pagination: { page: 1, pageSize: 10 } })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n queryPage: <T = QueryRow>(options: PaginationQueryOptions) => Promise<HaiResult<PaginatedResult<T>>>\n}\n\n// ─── CRUD 抽象类型 ───\n\n/**\n * CRUD 查询条件\n * @example\n * ```ts\n * import type { CrudQueryOptions } from '@h-ai/reldb'\n *\n * const value: CrudQueryOptions = { where: 'name = ?', params: ['Alice'], orderBy: 'id ASC', limit: 10 }\n * void value\n * ```\n */\nexport interface CrudQueryOptions {\n /**\n * WHERE 子句(不包含 WHERE 关键字)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,**禁止**将用户输入直接拼接。\n * 动态值必须通过 `params` 占位符(`?`)传入。\n * @example\n * ```ts\n * import type { CrudQueryOptions } from '@h-ai/reldb'\n *\n * const options: CrudQueryOptions = { where: 'name = ?', params: ['Alice'] }\n * void options // 值走绑定参数;SQL 结构由开发者静态编写。\n * ```\n */\n where?: string\n /** 参数列表 */\n params?: unknown[]\n /** ORDER BY 子句(不包含 ORDER BY 关键字) */\n orderBy?: string\n /** LIMIT */\n limit?: number\n /** OFFSET */\n offset?: number\n}\n\n/**\n * CRUD 分页查询条件\n * @example\n * ```ts\n * import type { CrudPageOptions } from '@h-ai/reldb'\n *\n * const value: CrudPageOptions = { where: 'active = ?', params: [true], pagination: { page: 1, pageSize: 20 } }\n * void value\n * ```\n */\nexport interface CrudPageOptions {\n /**\n * WHERE 子句(不包含 WHERE 关键字)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,**禁止**将用户输入直接拼接。\n * 动态值必须通过 `params` 占位符(`?`)传入。\n * @example\n * ```ts\n * import type { CrudQueryOptions } from '@h-ai/reldb'\n *\n * const options: CrudQueryOptions = { where: 'name = ?', params: ['Alice'] }\n * void options // 值走绑定参数;SQL 结构由开发者静态编写。\n * ```\n */\n where?: string\n /** 参数列表 */\n params?: unknown[]\n /** ORDER BY 子句(不包含 ORDER BY 关键字) */\n orderBy?: string\n /** 分页参数 */\n pagination?: PaginationOptionsInput\n /** 分页参数覆盖 */\n overrides?: PaginationOverrides\n}\n\n/**\n * CRUD 统计条件\n * @example\n * ```ts\n * import type { ReldbCrudCountOptions } from '@h-ai/reldb'\n *\n * const value: ReldbCrudCountOptions = { where: 'active = ?', params: [true] }\n * void value\n * ```\n */\nexport interface ReldbCrudCountOptions {\n /**\n * WHERE 子句(不包含 WHERE 关键字)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,**禁止**将用户输入直接拼接。\n * 动态值必须通过 `params` 占位符(`?`)传入。\n * @example\n * ```ts\n * import type { CrudQueryOptions } from '@h-ai/reldb'\n *\n * const options: CrudQueryOptions = { where: 'name = ?', params: ['Alice'] }\n * void options // 值走绑定参数;SQL 结构由开发者静态编写。\n * ```\n */\n where?: string\n /** 参数列表 */\n params?: unknown[]\n}\n\n/**\n * CRUD 配置\n * @example\n * ```ts\n * import type { CrudConfig } from '@h-ai/reldb'\n *\n * const config: CrudConfig<{ id: string }> = { table: 'users', dbType: 'postgresql', select: ['id'], createColumns: ['id'], updateColumns: [] }\n * void config\n * ```\n */\nexport interface CrudConfig<TItem> {\n /** 表名 */\n table: string\n /** 主键列名(默认 id) */\n idColumn?: string\n /** 查询列(默认 *) */\n select?: string[]\n /** 允许插入的列(不填则使用数据本身列) */\n createColumns?: string[]\n /** 允许更新的列(不填则使用数据本身列) */\n updateColumns?: string[]\n /** 行映射函数(可选) */\n mapRow?: (row: QueryRow) => TItem\n /** 数据库类型 */\n dbType: DbType\n}\n\n/**\n * CRUD 字段定义\n * @example\n * ```ts\n * import type { ReldbCrudFieldDefinition } from '@h-ai/reldb'\n *\n * const value: ReldbCrudFieldDefinition = { fieldName: 'name', columnName: 'name', def: { type: 'TEXT', notNull: true }, select: true, create: true, update: true }\n * void value\n * ```\n */\nexport interface ReldbCrudFieldDefinition {\n /** 对象字段名 */\n fieldName: string\n /** 数据库列名 */\n columnName: string\n /** 列定义 */\n def: ReldbColumnDef\n /** 是否用于查询 */\n select: boolean\n /** 是否允许插入 */\n create: boolean\n /** 是否允许更新 */\n update: boolean\n}\n\n/**\n * BaseReldbCrudRepository 配置\n * @example\n * ```ts\n * import type { BaseReldbCrudRepositoryConfig } from '@h-ai/reldb'\n *\n * const config: BaseReldbCrudRepositoryConfig<{ id: string }> = {\n * table: 'users', idField: 'id', fields: [\n * { fieldName: 'id', columnName: 'id', def: { type: 'TEXT', primaryKey: true }, select: true, create: true, update: false },\n * ],\n * }\n * void config\n * ```\n */\nexport interface BaseReldbCrudRepositoryConfig<TItem> {\n /** 表名 */\n table: string\n /** 字段定义 */\n fields: ReldbCrudFieldDefinition[]\n /** 主键列名(默认 id) */\n idColumn?: string\n /** 主键字段名(默认与 idColumn 相同) */\n idField?: keyof TItem & string\n /** 是否自动创建表(默认 true) */\n createTableIfNotExists?: boolean\n /** 主键生成策略(未提供则尝试使用 crypto.randomUUID) */\n generateId?: () => string | number\n /** 当前时间提供者(默认 Date.now) */\n nowProvider?: () => number\n}\n\n/**\n * CRUD 仓库接口\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(operations: ReldbCrudRepository<{ id: string }>) {\n * const result = await operations.findById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport interface ReldbCrudRepository<TItem> {\n create: (data: Record<string, unknown>, tx?: DmlWithTxOperations) => Promise<HaiResult<ExecuteResult>>\n createMany: (items: Array<Record<string, unknown>>, tx?: DmlWithTxOperations) => Promise<HaiResult<void>>\n createOrUpdate: (data: Record<string, unknown>, tx?: DmlWithTxOperations) => Promise<HaiResult<ExecuteResult>>\n findById: (id: unknown, tx?: DmlWithTxOperations) => Promise<HaiResult<TItem | null>>\n getById: (id: unknown, tx?: DmlWithTxOperations) => Promise<HaiResult<TItem>>\n findAll: (options?: CrudQueryOptions, tx?: DmlWithTxOperations) => Promise<HaiResult<TItem[]>>\n findPage: (options: CrudPageOptions, tx?: DmlWithTxOperations) => Promise<HaiResult<PaginatedResult<TItem>>>\n updateById: (id: unknown, data: Record<string, unknown>, tx?: DmlWithTxOperations) => Promise<HaiResult<ExecuteResult>>\n deleteById: (id: unknown, tx?: DmlWithTxOperations) => Promise<HaiResult<ExecuteResult>>\n count: (options?: ReldbCrudCountOptions, tx?: DmlWithTxOperations) => Promise<HaiResult<number>>\n exists: (options?: ReldbCrudCountOptions, tx?: DmlWithTxOperations) => Promise<HaiResult<boolean>>\n existsById: (id: unknown, tx?: DmlWithTxOperations) => Promise<HaiResult<boolean>>\n}\n\n/**\n * CRUD 管理器(统一入口)\n * @example\n * ```ts\n * import type { CrudManager } from '@h-ai/reldb'\n *\n * async function use(operations: CrudManager) {\n * const result = await operations.table<{ id: string }>({ table: 'users', dbType: 'postgresql' }).findById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport interface CrudManager {\n /** 获取单表 CRUD 仓库 */\n table: <TItem>(config: CrudConfig<TItem>) => ReldbCrudRepository<TItem>\n}\n\n// ─── 事务接口 ───\n\n/**\n * 事务句柄接口(分步事务)\n * @example\n * ```ts\n * import type { DmlWithTxOperations } from '@h-ai/reldb'\n *\n * async function use(operations: DmlWithTxOperations) {\n * const result = await operations.execute('UPDATE users SET name = ? WHERE id = ?', ['Alice', 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * const committed = await operations.commit()\n * if (!committed.success) throw new Error(committed.error.message)\n * return result.data.changes\n * }\n * ```\n */\nexport interface DmlWithTxOperations extends DmlOperations {\n /** CRUD 管理器 */\n crud: CrudManager\n /** 提交事务 */\n commit: () => Promise<HaiResult<void>>\n /** 回滚事务 */\n rollback: () => Promise<HaiResult<void>>\n}\n\n/**\n * 事务回调函数类型\n *\n * @param tx - 事务内操作对象\n * @returns 业务返回值(将被包装为 HaiResult);callback 抛错才回滚,返回失败 HaiResult 不会被自动展开。\n * @example\n * ```ts\n * import type { TxWrapCallback } from '@h-ai/reldb'\n *\n * const insert: TxWrapCallback<number> = async (tx) => {\n * const result = await tx.execute('INSERT INTO users (id, name) VALUES (?, ?)', ['u1', 'Alice'])\n * if (!result.success) throw new Error(result.error.message) // 显式抛错触发 wrap 回滚。\n * return result.data.changes\n * }\n * void insert\n * ```\n */\nexport type TxWrapCallback<T> = (tx: DmlWithTxOperations) => Promise<T>\n\n/**\n * 事务管理器\n * @example\n * ```ts\n * import type { TxManager } from '@h-ai/reldb'\n *\n * async function use(operations: TxManager) {\n * const result = await operations.wrap(async (tx) => {\n * const changed = await tx.execute('UPDATE users SET name = ? WHERE id = ?', ['Alice', 'u1'])\n * if (!changed.success) throw new Error(changed.error.message)\n * return changed.data.changes\n * })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport interface TxManager {\n /** 开启事务(分步事务) */\n begin: () => Promise<HaiResult<DmlWithTxOperations>>\n /** 包裹事务(自动提交/回滚) */\n wrap: <T>(fn: TxWrapCallback<T>) => Promise<HaiResult<T>>\n}\n\n// ─── 数据库函数接口 ───\n\n/**\n * 数据库函数接口\n *\n * 统一的数据库访问入口,通过 `reldb` 对象提供所有数据库操作。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const initialized = await reldb.init({ type: 'sqlite', database: ':memory:' }) // 仅示例/测试。\n * if (!initialized.success) throw new Error(initialized.error.message)\n * try {\n * const created = await reldb.ddl.createTable('users', { id: { type: 'TEXT', primaryKey: true }, name: { type: 'TEXT' } })\n * if (!created.success) throw new Error(created.error.message)\n * const inserted = await reldb.sql.execute('INSERT INTO users (id, name) VALUES (?, ?)', ['u1', 'Alice'])\n * if (!inserted.success) throw new Error(inserted.error.message)\n * } finally {\n * const closed = await reldb.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * }\n * ```\n */\nexport interface ReldbFunctions {\n /**\n * 初始化数据库连接\n *\n * @param config - 数据库配置\n * @returns 初始化结果\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.init({ type: 'sqlite', database: ':memory:' })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n init: (config: ReldbConfigInput) => Promise<HaiResult<void>>\n\n /** DDL 操作(表结构管理) */\n readonly ddl: DdlOperations\n\n /** SQL 操作(数据查询和修改) */\n readonly sql: DmlOperations\n\n /** CRUD 管理器 */\n readonly crud: CrudManager\n\n /** 事务管理器 */\n readonly tx: TxManager\n\n /**\n * 预检或执行模块维护的版本迁移;绑定当前数据库,不接受其它模块实例。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n * const plan = await reldb.migrateSchema('example', [], { dryRun: true })\n * if (!plan.success) throw new Error(plan.error.message)\n * ```\n */\n migrateSchema: (module: string, steps: readonly SchemaMigration[], options?: { dryRun?: boolean }) => Promise<HaiResult<SchemaMigrationPlan>>\n\n /**\n * 只读查询当前数据库真实列名;sql 可指定当前事务,不创建表。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n * const columns = await reldb.schemaColumns('hai_iam_users')\n * if (!columns.success) throw new Error(columns.error.message)\n * ```\n */\n schemaColumns: (table: string, sql?: DmlOperations) => Promise<HaiResult<string[]>>\n\n /** 当前数据库脱敏配置快照(未初始化时为 null) */\n readonly config: ReldbConfig | null\n\n /** 是否已初始化 */\n readonly isInitialized: boolean\n\n /** 分页工具 */\n readonly pagination: {\n /** 规范化分页参数 */\n normalize: (options?: PaginationOptionsInput, overrides?: PaginationOverrides) => NormalizedPagination\n /** 构建分页结果 */\n build: <T>(items: T[], total: number, pagination: PaginationOptions) => PaginatedResult<T>\n }\n\n /**\n * JSON 操作 SQL 构建器\n *\n * 提供跨数据库统一的 JSON 路径操作(提取、设置、插入、删除、合并)。\n * 返回的 SQL 片段可嵌入 `reldb.sql.query` / `reldb.sql.execute` 等调用。\n *\n * 未初始化时默认返回 SQLite 格式的构建器;初始化后自动匹配当前数据库类型。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.set('settings', '$.theme', 'dark')\n * const result = await reldb.sql.execute(`UPDATE users SET settings = ${expression.sql} WHERE id = ?`, [...expression.params, 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\n readonly json: ReldbJsonOps\n\n /**\n * 等待初始化/在途事务并关闭连接;清理失败后操作不可用,资源保留供重试。\n * @returns 资源全部释放时成功;未初始化时同样成功。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.close()\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n close: () => Promise<HaiResult<void>>\n}\n","/**\n * @h-ai/reldb — CRUD 仓库基类\n *\n * 提供 `BaseReldbCrudRepository` 抽象基类,供业务仓库继承复用。\n * @module reldb-crud-repository\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type { ReldbConfig } from './reldb-config.js'\nimport type {\n BaseReldbCrudRepositoryConfig,\n CrudPageOptions,\n CrudQueryOptions,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n QueryRow,\n ReldbCrudCountOptions,\n ReldbCrudFieldDefinition,\n ReldbCrudRepository,\n ReldbFunctions,\n ReldbTableDef,\n} from './reldb-types.js'\n\nimport { err, ok } from '@h-ai/core'\nimport { reldbM } from './reldb-i18n.js'\nimport { HaiReldbError } from './reldb-types.js'\n\n/**\n * CRUD 仓库基类\n *\n * 提供通用的单表 CRUD 操作封装,业务仓库可继承该类实现自定义逻辑。\n *\n * 核心能力:\n * - 自动建表(默认开启,可通过 `createTableIfNotExists: false` 关闭)\n * - 字段级别的权限控制(select / create / update 分别配置)\n * - 自动填充主键、createdAt、updatedAt\n * - 跨数据库类型值转换(BOOLEAN / TIMESTAMP / JSON)\n * - 支持事务上下文(所有方法均接受可选 tx 参数)\n * @example\n * ```ts\n * import { BaseReldbCrudRepository, type ReldbFunctions } from '@h-ai/reldb'\n *\n * type User = { id: string, name: string }\n * class Users extends BaseReldbCrudRepository<User> {\n * constructor(db: ReldbFunctions) {\n * super(db, { table: 'users', fields: [\n * { fieldName: 'id', columnName: 'id', def: { type: 'TEXT', primaryKey: true }, select: true, create: true, update: false },\n * { fieldName: 'name', columnName: 'name', def: { type: 'TEXT' }, select: true, create: true, update: true },\n * ] })\n * }\n * }\n * async function create(db: ReldbFunctions) { // db 已初始化。\n * const result = await new Users(db).create({ name: 'Alice' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport abstract class BaseReldbCrudRepository<TItem> implements ReldbCrudRepository<TItem> {\n /** 底层 CRUD 仓库实例(基于 reldb-crud-kernel 创建) */\n protected readonly crud: ReldbCrudRepository<TItem>\n /** 数据库服务对象 */\n protected readonly db: ReldbFunctions\n /** 字段定义列表 */\n private readonly fields: ReldbCrudFieldDefinition[]\n /** 主键字段名(对象侧) */\n private readonly idField?: string\n /** 主键列名(数据库侧) */\n private readonly idColumn: string\n /** 主键生成器 */\n private readonly generateId?: () => string | number\n /** 当前时间提供者(默认 Date.now) */\n private readonly nowProvider: () => number\n /** 初始化 Promise(自动建表等) */\n private readonly initPromise: Promise<HaiResult<void>>\n /** 可查询列 */\n private readonly selectColumns: string[]\n /** 可插入列 */\n private readonly createColumns: string[]\n /** 可更新列 */\n private readonly updateColumns: string[]\n /** 表名 */\n private readonly table: string\n /** 当前数据库类型(延迟读取,确保获取初始化后的值) */\n private get dbType(): ReldbConfig['type'] {\n return this.db.config!.type\n }\n\n /**\n * 创建 BaseReldbCrudRepository\n *\n * 初始化字段映射、构建表结构(默认自动建表)并配置底层 CRUD 仓库。\n *\n * @param db - 数据库服务对象\n * @param config - BaseReldbCrudRepository 配置(表名、字段定义、主键策略等)\n */\n protected constructor(db: ReldbFunctions, config: BaseReldbCrudRepositoryConfig<TItem>) {\n this.db = db\n this.table = config.table\n this.fields = config.fields\n this.idColumn = config.idColumn ?? 'id'\n this.idField = config.idField ?? this.resolveIdField(config.fields, this.idColumn)\n this.generateId = config.generateId ?? this.defaultIdGenerator()\n this.nowProvider = config.nowProvider ?? (() => Date.now())\n\n // 构建表结构定义并按需创建表(默认开启)\n const tableDef = this.buildReldbTableDef(config.fields)\n const createTable = config.createTableIfNotExists !== false\n ? this.db.ddl.createTable(config.table, tableDef, true)\n : Promise.resolve(ok(undefined))\n\n this.initPromise = createTable\n\n // 选择、创建、更新字段的列集合\n this.selectColumns = this.fields.filter(field => field.select).map(field => field.columnName)\n this.createColumns = this.fields.filter(field => field.create).map(field => field.columnName)\n const updateColumns = this.fields.filter(field => field.update).map(field => field.columnName)\n const updatedAtField = this.fields.find(field => this.isUpdatedAtField(field))\n this.updateColumns = updatedAtField && !updateColumns.includes(updatedAtField.columnName)\n ? [...updateColumns, updatedAtField.columnName]\n : updateColumns\n\n this.crud = this.db.crud.table<TItem>({\n table: config.table,\n idColumn: this.idColumn,\n select: this.selectColumns,\n createColumns: this.createColumns,\n updateColumns: this.updateColumns,\n mapRow: (row: Record<string, unknown>) => this.mapRow(row),\n get dbType() { return db.config!.type },\n })\n }\n\n /**\n * 获取 SQL 操作对象(自动选择 reldb.sql 或 tx)\n *\n * 当传入事务句柄时,自动使用事务内 DataOperations;否则使用 reldb.sql。\n *\n * @param tx - 可选事务句柄\n * @returns DataOperations 实例\n */\n protected sql(tx?: DmlWithTxOperations): DmlOperations {\n return tx ?? this.db.sql\n }\n\n /**\n * 解析主键字段\n *\n * 优先使用声明为主键的字段;如果未声明主键,则回退到列名匹配。\n *\n * @param fields - 字段定义列表\n * @param idColumn - 主键列名\n * @returns 主键字段名(可能为空)\n */\n private resolveIdField(fields: ReldbCrudFieldDefinition[], idColumn: string): string | undefined {\n const primary = fields.find(field => field.def.primaryKey)\n if (primary) {\n // 显式主键优先\n return primary.fieldName\n }\n // 回退到列名匹配\n const byColumn = fields.find(field => field.columnName === idColumn)\n return byColumn?.fieldName\n }\n\n /**\n * 生成默认主键生成器\n *\n * 在运行环境支持 `crypto.randomUUID` 时返回 UUID 生成函数,否则返回 undefined。\n */\n private defaultIdGenerator(): (() => string | number) | undefined {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n // 浏览器或 Node 环境支持 UUID\n return () => crypto.randomUUID()\n }\n // 无可用生成器时交由上层提供或数据库自增\n return undefined\n }\n\n /**\n * 构建表结构定义\n *\n * @param fields - 字段定义列表\n * @returns 表结构定义\n */\n private buildReldbTableDef(fields: ReldbCrudFieldDefinition[]): ReldbTableDef {\n const entries = fields.map(field => [\n field.columnName,\n this.normalizeReldbColumnDef(field.def),\n ] as const)\n return Object.fromEntries(entries)\n }\n\n /**\n * 归一化列定义\n *\n * 用于处理不同数据库对默认值的兼容差异(例如 BOOLEAN)。\n */\n private normalizeReldbColumnDef(def: ReldbCrudFieldDefinition['def']): ReldbCrudFieldDefinition['def'] {\n if (def.defaultValue === undefined || def.defaultValue === null) {\n // 无默认值时直接返回\n return def\n }\n if (def.type !== 'BOOLEAN' || typeof def.defaultValue === 'string') {\n // 仅处理布尔且非字符串的默认值\n return def\n }\n\n const normalized: ReldbCrudFieldDefinition['def'] = { ...def }\n if (this.dbType === 'postgresql') {\n // PostgreSQL 支持 true/false\n normalized.defaultValue = Boolean(def.defaultValue)\n return normalized\n }\n // SQLite/MySQL 使用 1/0\n normalized.defaultValue = def.defaultValue ? 1 : 0\n return normalized\n }\n\n /**\n * 判断是否为创建时间字段\n */\n private isCreatedAtField(field: ReldbCrudFieldDefinition): boolean {\n return field.fieldName === 'createdAt' || field.columnName === 'created_at'\n }\n\n /**\n * 判断是否为更新时间字段\n */\n private isUpdatedAtField(field: ReldbCrudFieldDefinition): boolean {\n return field.fieldName === 'updatedAt' || field.columnName === 'updated_at'\n }\n\n /**\n * 将数据库值转换为业务值\n *\n * @param value - 数据库原始值\n * @param def - 字段定义\n * @returns 业务侧值(可能为 undefined)\n */\n private fromDbValue(value: unknown, def: ReldbCrudFieldDefinition['def']): unknown {\n if (value === null || value === undefined) {\n // DB 空值统一映射为 undefined\n return undefined\n }\n if (def.type === 'BOOLEAN') {\n // 兼容 0/1、true/false\n return Boolean(value)\n }\n if (def.type === 'TIMESTAMP') {\n if (value instanceof Date) {\n return value\n }\n if (typeof value === 'number') {\n return new Date(value)\n }\n // 尝试解析字符串时间\n const parsed = Date.parse(String(value))\n return Number.isNaN(parsed)\n ? undefined\n : new Date(parsed)\n }\n if (def.type === 'JSON') {\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as unknown\n }\n catch {\n // JSON 解析失败时返回 undefined\n return undefined\n }\n }\n return value\n }\n return value\n }\n\n /**\n * 将业务值转换为数据库值\n *\n * @param value - 业务侧值\n * @param def - 字段定义\n * @returns 适配数据库的值\n */\n private toDbValue(value: unknown, def: ReldbCrudFieldDefinition['def']): unknown {\n if (value === undefined) {\n // undefined 表示不写入\n return undefined\n }\n if (value === null) {\n // null 保持为数据库 NULL\n return null\n }\n if (def.type === 'BOOLEAN') {\n if (this.dbType === 'postgresql') {\n // PostgreSQL 直接使用 boolean\n return Boolean(value)\n }\n // SQLite/MySQL 使用 1/0\n return value ? 1 : 0\n }\n if (def.type === 'TIMESTAMP') {\n if (this.dbType === 'sqlite') {\n if (value instanceof Date) {\n return value.getTime()\n }\n if (typeof value === 'number') {\n return value\n }\n // SQLite 以毫秒时间戳存储\n const parsed = Date.parse(String(value))\n return Number.isNaN(parsed)\n ? value\n : parsed\n }\n if (value instanceof Date) {\n return value\n }\n if (typeof value === 'number') {\n return new Date(value)\n }\n return value\n }\n if (def.type === 'JSON') {\n if (typeof value === 'string') {\n // 已是 JSON 字符串\n return value\n }\n // 统一序列化为字符串\n return JSON.stringify(value)\n }\n return value\n }\n\n /**\n * 将查询行映射为业务模型\n */\n private mapRow(row: QueryRow): TItem {\n const result = {} as TItem\n const resultRecord = result as Record<string, unknown>\n for (const field of this.fields) {\n if (!field.select) {\n // 不可查询字段直接跳过\n continue\n }\n const value = this.fromDbValue(row[field.columnName], field.def)\n resultRecord[field.fieldName] = value\n }\n // 行映射结果为动态构建的对象,无法通过 TS 静态推导,需在最终返回时做单次对象断言\n return result\n }\n\n /**\n * 构建创建数据的列值映射\n *\n * 处理主键生成、默认值、createdAt/updatedAt 填充等规则。\n */\n private buildCreatePayload(data: Record<string, unknown>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n const now = this.nowProvider()\n\n let generatedId: string | number | undefined\n const idFieldDef = this.fields.find(field => field.fieldName === this.idField)\n if (this.idField && !idFieldDef?.def.autoIncrement) {\n const currentId = data[this.idField]\n if (currentId !== undefined) {\n // 已提供主键,直接使用\n }\n else if (this.generateId) {\n // 未提供主键,使用生成器\n generatedId = this.generateId()\n }\n }\n\n for (const field of this.fields) {\n if (!field.create) {\n // 不允许写入的字段跳过\n continue\n }\n\n let value = data[field.fieldName]\n\n if (value === undefined && field.def.autoIncrement) {\n // 自增字段留给数据库生成\n continue\n }\n\n if (field.fieldName === this.idField && value === undefined && generatedId !== undefined) {\n // 使用自动生成的主键\n value = generatedId\n }\n\n if (value === undefined) {\n if (this.isCreatedAtField(field) || this.isUpdatedAtField(field)) {\n // 默认填充创建/更新时间\n value = now\n }\n else if (field.def.defaultValue !== undefined && typeof field.def.defaultValue !== 'string') {\n // 非字符串默认值直接写入\n value = field.def.defaultValue\n }\n }\n\n if (value === undefined) {\n // 仍为空则跳过该列\n continue\n }\n\n payload[field.columnName] = this.toDbValue(value, field.def)\n }\n\n return payload\n }\n\n /**\n * 构建更新数据的列值映射\n *\n * 当没有任何可更新字段时返回 null。\n */\n private buildUpdatePayload(data: Record<string, unknown>): Record<string, unknown> | null {\n const payload: Record<string, unknown> = {}\n const now = this.nowProvider()\n\n for (const field of this.fields) {\n if (!field.update) {\n // 不允许更新的字段跳过\n continue\n }\n const value = data[field.fieldName]\n if (value === undefined) {\n // 未提供更新值则跳过\n continue\n }\n payload[field.columnName] = this.toDbValue(value, field.def)\n }\n\n if (Object.keys(payload).length === 0) {\n // 无可更新字段\n return null\n }\n\n const updatedAtField = this.fields.find(field => this.isUpdatedAtField(field))\n if (updatedAtField) {\n // 统一补写更新时间\n payload[updatedAtField.columnName] = this.toDbValue(now, updatedAtField.def)\n }\n\n return payload\n }\n\n /**\n * 等待初始化完成(自动建表等)\n *\n * 内置 CRUD 方法均已在执行前调用;自定义方法若通过 `this.sql()` 直接执行原始\n * SQL(尤其是写操作或在事务中),应先 `await this.ensureReady()` 以避免表尚未\n * 建好时(例如刚 dropTable 后、或后端建表较慢时)产生「表不存在」的竞态失败。\n *\n * @returns 初始化结果\n */\n protected async ensureReady(): Promise<HaiResult<void>> {\n const result = await this.initPromise\n if (!result.success) {\n // 透传初始化失败结果\n return result\n }\n return ok(undefined)\n }\n\n /**\n * 创建单条记录\n *\n * 自动处理主键生成、createdAt/updatedAt 填充、字段类型转换。\n *\n * @param data - 业务字段与值的映射\n * @param tx - 可选事务句柄\n * @returns 插入结果(含 changes、lastInsertRowid)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.create({ name: 'Alice' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async create(data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<ExecuteResult>\n }\n const payload = this.buildCreatePayload(data)\n if (Object.keys(payload).length === 0) {\n // 无可写入字段时返回配置错误\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudEmptyPayload'))\n }\n return this.crud.create(payload, tx)\n }\n\n /**\n * 批量创建记录\n *\n * 每条记录均通过 buildCreatePayload 处理,然后以 batch 方式写入。\n *\n * @param items - 待插入的业务数据数组\n * @param tx - 可选事务句柄\n * @returns 批量插入结果\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.createMany([{ name: 'Alice' }, { name: 'Bob' }])\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async createMany(items: Array<Record<string, unknown>>, tx?: DmlWithTxOperations): Promise<HaiResult<void>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<void>\n }\n const payloads = items.map(item => this.buildCreatePayload(item))\n return this.crud.createMany(payloads, tx)\n }\n\n /**\n * 创建或更新单条记录(upsert)\n *\n * 主键存在时更新可更新字段,否则插入新记录。\n * 自动处理主键生成、createdAt/updatedAt 填充、字段类型转换。\n * 更新时仅写入用户显式提供的可更新字段,不会用默认值覆盖已有数据。\n *\n * ### 为什么不复用 this.crud.createOrUpdate(kernel)\n *\n * Kernel 的 createOrUpdate 使用 `excluded.col` / `VALUES(col)` 引用 INSERT 值作为\n * UPDATE 值,即 INSERT 和 UPDATE 共享同一组数据。但 Repository 层的 INSERT 负载和\n * UPDATE 负载语义不同:\n *\n * - **INSERT 负载**(buildCreatePayload):包含自动生成的主键、createdAt、updatedAt、\n * 字段默认值(如 `status: 'active'`)等应用层填充值。\n * - **UPDATE 负载**(buildUpdatePayload):仅包含用户显式传入的可更新字段 + updatedAt,\n * 不包含 createdAt(避免覆盖原始创建时间)、不包含应用默认值(避免覆盖已有数据)。\n *\n * 若复用 kernel,冲突更新时会将 INSERT 的 createdAt、默认值等一并写入,破坏已有记录。\n * 因此 Repository 自行构建两份独立负载,使用 `col = ?` 参数化占位分别传入 INSERT 值\n * 和 UPDATE 值,通过 this.sql(tx).execute() 直接执行。\n *\n * @param data - 业务字段与值的映射\n * @param tx - 可选事务句柄\n * @returns 执行结果(含 changes)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.createOrUpdate({ id: 'u1', name: 'Alice' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async createOrUpdate(data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<ExecuteResult>\n }\n\n const dbType = this.dbType\n\n // INSERT 负载:含 createdAt、默认值、生成的主键等应用层填充值\n const createPayload = this.buildCreatePayload(data)\n\n // 确保主键包含在插入负载中(upsert 需要主键来触发冲突检测)\n // 当主键为 autoIncrement 且 create: false 时,buildCreatePayload 不会包含它\n if (this.idField && data[this.idField] !== undefined) {\n const idFieldDef = this.fields.find(f => f.fieldName === this.idField)\n if (idFieldDef && !(idFieldDef.columnName in createPayload)) {\n createPayload[idFieldDef.columnName] = this.toDbValue(data[this.idField], idFieldDef.def)\n }\n }\n\n if (Object.keys(createPayload).length === 0) {\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudEmptyPayload'))\n }\n\n const insertColumns = Object.keys(createPayload)\n const insertValues = Object.values(createPayload)\n const placeholders = insertColumns.map(() => '?').join(', ')\n\n // UPDATE 负载:仅用户显式传入的可更新字段 + updatedAt\n // 与 INSERT 负载独立,不含 createdAt / 应用默认值,避免冲突更新时覆盖已有数据\n const updatePayload = this.buildUpdatePayload(data)\n\n if (!updatePayload || Object.keys(updatePayload).length === 0) {\n // 无可更新列,退化为普通 INSERT\n const sql = `INSERT INTO ${this.table} (${insertColumns.join(', ')}) VALUES (${placeholders})`\n return this.sql(tx).execute(sql, insertValues)\n }\n\n const updateColumns = Object.keys(updatePayload)\n const updateValues = Object.values(updatePayload)\n // 使用 col = ? 参数化占位(而非 kernel 的 excluded.col / VALUES(col)),\n // 使 UPDATE 值独立于 INSERT 值\n const updateSet = updateColumns.map(col => `${col} = ?`).join(', ')\n\n let sql: string\n if (dbType === 'mysql') {\n sql = `INSERT INTO ${this.table} (${insertColumns.join(', ')}) VALUES (${placeholders}) ON DUPLICATE KEY UPDATE ${updateSet}`\n }\n else {\n // SQLite / PostgreSQL\n sql = `INSERT INTO ${this.table} (${insertColumns.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${this.idColumn}) DO UPDATE SET ${updateSet}`\n }\n\n // 参数顺序:先 INSERT 值,再 UPDATE 值(两组独立)\n return this.sql(tx).execute(sql, [\n ...insertValues,\n ...updateValues,\n ])\n }\n\n /**\n * 根据主键查找单条记录\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 业务模型对象或 null(未找到)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.findById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async findById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<TItem | null>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<TItem | null>\n }\n return this.crud.findById(id, tx)\n }\n\n /**\n * 根据主键获取单条记录(必须存在)\n *\n * 与 findById 不同,当记录不存在时返回 RECORD_NOT_FOUND 错误。\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 业务模型对象(不存在时返回错误)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.getById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async getById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<TItem>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<TItem>\n }\n return this.crud.getById(id, tx)\n }\n\n /**\n * 条件查询多条记录\n *\n * @param options - 查询条件(where、orderBy、limit、offset)\n * @param tx - 可选事务句柄\n * @returns 业务模型数组\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.findAll({ where: 'name = ?', params: ['Alice'] })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async findAll(options?: CrudQueryOptions, tx?: DmlWithTxOperations): Promise<HaiResult<TItem[]>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<TItem[]>\n }\n return this.crud.findAll(options, tx)\n }\n\n /**\n * 分页查询记录\n *\n * @param options - 分页查询条件(where、orderBy、pagination、overrides)\n * @param tx - 可选事务句柄\n * @returns 分页结果(含 items、total、page、pageSize)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.findPage({ pagination: { page: 1, pageSize: 10 }, orderBy: 'id ASC' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async findPage(options: CrudPageOptions, tx?: DmlWithTxOperations): Promise<HaiResult<PaginatedResult<TItem>>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<PaginatedResult<TItem>>\n }\n return this.crud.findPage(options, tx)\n }\n\n /**\n * 根据主键更新记录\n *\n * 自动填充 updatedAt 字段。无可更新字段时返回 CONFIG_ERROR。\n *\n * @param id - 主键值\n * @param data - 待更新的业务字段\n * @param tx - 可选事务句柄\n * @returns 更新结果(含 changes)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.updateById('u1', { name: 'Bob' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async updateById(id: unknown, data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<ExecuteResult>\n }\n const payload = this.buildUpdatePayload(data)\n if (!payload) {\n // 无可更新字段时返回配置错误\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudEmptyPayload'))\n }\n return this.crud.updateById(id, payload, tx)\n }\n\n /**\n * 根据主键删除记录\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 删除结果(含 changes)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.deleteById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async deleteById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<ExecuteResult>\n }\n return this.crud.deleteById(id, tx)\n }\n\n /**\n * 统计符合条件的记录数\n *\n * @param options - 查询条件(where、params)\n * @param tx - 可选事务句柄\n * @returns 记录数\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.count({ where: 'name = ?', params: ['Alice'] })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async count(options?: ReldbCrudCountOptions, tx?: DmlWithTxOperations): Promise<HaiResult<number>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<number>\n }\n return this.crud.count(options, tx)\n }\n\n /**\n * 检查是否存在符合条件的记录\n *\n * @param options - 查询条件(where、params)\n * @param tx - 可选事务句柄\n * @returns 是否存在\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.exists({ where: 'name = ?', params: ['Alice'] })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async exists(options?: ReldbCrudCountOptions, tx?: DmlWithTxOperations): Promise<HaiResult<boolean>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<boolean>\n }\n return this.crud.exists(options, tx)\n }\n\n /**\n * 根据主键检查记录是否存在\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 是否存在\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.existsById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async existsById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<boolean>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<boolean>\n }\n return this.crud.existsById(id, tx)\n }\n}\n","/**\n * @h-ai/reldb — JSON 操作 SQL 构建器\n *\n * 为不同数据库后端提供统一的 JSON 路径操作 SQL 表达式构建能力。\n * 路径支持简单点号与方括号路径(`$.key` / `$.key.subkey` / `$[0]`),不是完整 SQL/JSON Path 校验器。\n *\n * 各数据库后端映射:\n *\n * | 操作 | SQLite | PostgreSQL | MySQL |\n * |---------|----------------------|-------------------------------|-----------------------------|\n * | extract | json_extract | #> (text[]) | JSON_EXTRACT |\n * | set | json_set + json() | jsonb_set + ::jsonb | JSON_SET + CAST AS JSON |\n * | insert | json_insert + json() | jsonb_insert + ::jsonb | JSON_INSERT + CAST AS JSON |\n * | remove | json_remove | #- (text[]) | JSON_REMOVE |\n * | merge | json_patch | 参数化递归 CTE | JSON_MERGE_PATCH + CAST |\n *\n * @module reldb-json\n */\n\nimport { reldbM } from './reldb-i18n.js'\n\n// ─── 类型定义 ───\n\n/**\n * JSON SQL 表达式结果\n *\n * 包含可嵌入 SQL 语句的表达式片段与对应参数列表。\n * 参数占位符统一使用 `?`,各 Provider 会在执行前自动转换。\n * @example\n * ```ts\n * import { createJsonOps, type JsonSqlExpr } from '@h-ai/reldb'\n *\n * const expression: JsonSqlExpr = createJsonOps('postgresql').set('settings', '$.theme', 'dark')\n * void [expression.sql, expression.params]\n * ```\n */\nexport interface JsonSqlExpr {\n /** SQL 表达式片段(含 ? 占位符) */\n sql: string\n /** 参数列表(对应 ? 占位符,顺序与 sql 中出现顺序一致) */\n params: unknown[]\n}\n\n/**\n * JSON 操作接口\n *\n * 提供跨数据库统一的 JSON 路径操作 SQL 构建能力。\n * 所有方法返回 `JsonSqlExpr`,可嵌入 `reldb.sql.query` / `reldb.sql.execute` 等调用。\n *\n * 路径使用以下简单形式,建议以 `$` 开头:\n * - 对象字段:`$.key`、`$.key.subkey`\n * - 数组元素:`$[0]`、`$.items[1]`\n * @example\n * ```ts\n * import { createJsonOps, type ReldbJsonOps } from '@h-ai/reldb'\n *\n * const json: ReldbJsonOps = createJsonOps('postgresql')\n * const patch = json.merge('settings', { theme: 'dark', obsolete: null })\n * void patch // 作为同一次 UPDATE 的 SQL 表达式执行,值在 params。\n * ```\n */\nexport interface ReldbJsonOps {\n /**\n * JSON 路径提取表达式\n *\n * 提取 JSON 列中指定路径的值,返回 JSON 类型的值。\n * 可用于 SELECT 列表、WHERE 条件或 ORDER BY。\n *\n * @param column - 列名(或 SQL 列表达式,开发者负责安全性,禁止传入用户输入)\n * @param path - JSON 路径(如 `$.status`、`$.user.name`、`$[0]`)\n * @returns SQL 表达式与参数\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.extract('settings', '$.theme')\n * void [expression.sql, expression.params]\n * ```\n */\n extract: (column: string, path: string) => JsonSqlExpr\n\n /**\n * JSON 路径设置表达式(创建或替换)\n *\n * 设置指定路径的值;PostgreSQL 要求父路径存在,其他后端按原生 JSON 函数处理缺失父路径。\n * 返回修改后的完整 JSON 值,通常用于 `UPDATE SET col = ...`。\n *\n * @param column - 列名(开发者负责安全性,禁止传入用户输入)\n * @param path - JSON 路径\n * @param value - 要设置的值(支持任意 JSON 兼容类型)\n * @returns SQL 表达式与参数\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.set('settings', '$.theme', 'dark')\n * const result = await reldb.sql.execute(`UPDATE users SET settings = ${expression.sql} WHERE id = ?`, [...expression.params, 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\n set: (column: string, path: string, value: unknown) => JsonSqlExpr\n\n /**\n * JSON 路径插入表达式(仅当路径不存在时)\n *\n * 使用后端原生插入语义:SQLite/MySQL 不覆盖已有值;PostgreSQL 对已有对象键报错,数组路径按 jsonb_insert 插入。\n * 返回修改后的完整 JSON 值。\n *\n * @param column - 列名(开发者负责安全性,禁止传入用户输入)\n * @param path - JSON 路径\n * @param value - 要插入的值\n * @returns SQL 表达式与参数\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.insert('settings', '$.newField', 'value')\n * const result = await reldb.sql.execute(`UPDATE users SET settings = ${expression.sql} WHERE id = ?`, [...expression.params, 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\n insert: (column: string, path: string, value: unknown) => JsonSqlExpr\n\n /**\n * JSON 路径删除表达式\n *\n * 从 JSON 列中移除指定路径对应的键或数组元素。\n * 返回删除后的完整 JSON 值。\n *\n * @param column - 列名(开发者负责安全性,禁止传入用户输入)\n * @param path - JSON 路径\n * @returns SQL 表达式与参数\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.remove('settings', '$.obsolete')\n * const result = await reldb.sql.execute(`UPDATE users SET settings = ${expression.sql} WHERE id = ?`, [...expression.params, 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\n remove: (column: string, path: string) => JsonSqlExpr\n\n /**\n * JSON 合并/补丁表达式(RFC 7396 Merge Patch)\n *\n * 将 patch 对象合并到 JSON 列:\n * - patch 中存在的键:覆盖原值\n * - patch 中值为 null 的键:删除原键\n * - patch 中不存在的键:保持不变\n *\n * 返回合并后的完整 JSON 值,通常用于 `UPDATE SET col = ...`。\n *\n * @param column - 列名(开发者负责安全性,禁止传入用户输入)\n * @param patch - 要合并的 JSON 对象\n * @returns SQL 表达式与参数\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.merge('settings', { theme: 'dark', obsolete: null })\n * const result = await reldb.sql.execute(`UPDATE users SET settings = ${expression.sql} WHERE id = ?`, [...expression.params, 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\n merge: (column: string, patch: Record<string, unknown>) => JsonSqlExpr\n}\n\nconst JSON_PATH_OBJECT_SEGMENT_REGEX = /^([^.[]+)/\n\n// ─── 路径解析工具 ───\n\n/**\n * 解析 JSON Path 为路径段数组\n *\n * 将 `$.key.subkey[0]` 格式的路径解析为 `['key', 'subkey', '0']`。\n *\n * @param path - JSON 路径(以 `$` 开头)\n * @returns 路径段数组\n * @example\n * ```ts\n * import { parseJsonPath } from '@h-ai/reldb'\n *\n * void parseJsonPath('$.items[0].name') // ['items', '0', 'name']\n * ```\n */\nexport function parseJsonPath(path: string): string[] {\n // 移除前缀 $\n let remaining = path.startsWith('$')\n ? path.slice(1)\n : path\n const segments: string[] = []\n\n while (remaining.length > 0) {\n if (remaining.startsWith('[')) {\n // 数组索引:[0] 或 ['key'] 或 [\"key\"]\n const end = remaining.indexOf(']')\n if (end === -1)\n break\n let segment = remaining.slice(1, end)\n // 去除首尾引号\n if (\n (segment.startsWith('\"') && segment.endsWith('\"'))\n || (segment.startsWith('\\'') && segment.endsWith('\\''))\n ) {\n segment = segment.slice(1, -1)\n }\n segments.push(segment)\n remaining = remaining.slice(end + 1)\n }\n else if (remaining.startsWith('.')) {\n remaining = remaining.slice(1)\n // 若下一段是 [ 则继续循环处理数组索引\n if (remaining.startsWith('['))\n continue\n // 对象字段名(截取到下一个 . 或 [ 为止)\n const match = remaining.match(JSON_PATH_OBJECT_SEGMENT_REGEX)\n if (match) {\n segments.push(match[1])\n remaining = remaining.slice(match[1].length)\n }\n }\n else {\n break\n }\n }\n\n return segments\n}\n\n// ─── 各数据库 JSON 操作实现 ───\n\n/**\n * 创建 SQLite 的 JSON 操作实现\n *\n * 使用 SQLite 内置的 JSON 函数(需 SQLite 3.38+ 或 json1 扩展)。\n * 路径格式遵循 JSON Path 标准(`$.key`)。\n */\nfunction createSqliteJsonOps(): ReldbJsonOps {\n return {\n extract(column, path) {\n return {\n sql: `json_extract(${column}, ?)`,\n params: [path],\n }\n },\n\n set(column, path, value) {\n return {\n sql: `json_set(${column}, ?, json(?))`,\n params: [\n path,\n JSON.stringify(value),\n ],\n }\n },\n\n insert(column, path, value) {\n return {\n sql: `json_insert(${column}, ?, json(?))`,\n params: [\n path,\n JSON.stringify(value),\n ],\n }\n },\n\n remove(column, path) {\n return {\n sql: `json_remove(${column}, ?)`,\n params: [path],\n }\n },\n\n merge(column, patch) {\n return {\n sql: `json_patch(${column}, ?)`,\n params: [\n JSON.stringify(patch),\n ],\n }\n },\n }\n}\n\n/**\n * 将对象 Merge Patch 编译为一次 PostgreSQL 表达式,逐步修改同一行版本。\n *\n * 不能先在应用读取再合并写回,否则跨节点并发更新会丢失。PostgreSQL 的 || 仅浅拼接,\n * 不删除 null,也不能保留未修改的嵌套兄弟字段;这里以参数化路径执行 RFC 7396 对象补丁。\n * 对象节点先建立或保留对象,随后应用子项;数组整体替换,null 只删除补丁所指向的键。\n * @param column - 开发者提供的静态 JSONB 列表达式,不接受外部输入。\n * @param patch - 可 JSON 序列化的对象补丁;与其他后端一致,undefined 字段被序列化忽略。\n * @returns SQL 片段及单个参数;无连接与初始化需求。\n * @throws 非 JSON 对象、循环引用或 BigInt 等无法序列化的输入。\n * @example 模块内部上下文\n * ```ts\n * const expression = buildPostgresMergePatch('profile', { settings: { theme: 'dark', obsolete: null } })\n * void expression.params // 值与路径均不拼接进 SQL。\n * ```\n */\nfunction buildPostgresMergePatch(column: string, patch: Record<string, unknown>): JsonSqlExpr {\n const normalized: unknown = JSON.parse(JSON.stringify(patch))\n if (!normalized || typeof normalized !== 'object' || Array.isArray(normalized))\n throw new TypeError(reldbM('reldb_jsonPatchObjectRequired'))\n\n const steps: Array<{ path: string[], value: unknown, object: boolean }> = []\n const pending: Array<{ path: string[], value: unknown }> = Object.entries(normalized).reverse().map(([key, value]) => ({\n path: [key],\n value,\n }))\n while (pending.length > 0) {\n const entry = pending.pop()!\n const object = entry.value !== null && typeof entry.value === 'object' && !Array.isArray(entry.value)\n steps.push({\n path: entry.path,\n value: object\n ? {}\n : entry.value,\n object,\n })\n if (object) {\n for (const [key, value] of Object.entries(entry.value as Record<string, unknown>).reverse()) {\n pending.push({\n path: [...entry.path, key],\n value,\n })\n }\n }\n }\n\n return {\n sql: `(WITH RECURSIVE\n patch_steps AS (\n SELECT ordinality AS step,\n ARRAY(SELECT jsonb_array_elements_text(item->'path')) AS path,\n item->'value' AS value, (item->>'object')::boolean AS object\n FROM jsonb_array_elements(?::jsonb) WITH ORDINALITY AS input(item, ordinality)\n ),\n merged(step, document) AS (\n SELECT 0::bigint, CASE WHEN jsonb_typeof(${column}) = 'object' THEN ${column} ELSE '{}'::jsonb END\n UNION ALL\n SELECT patch_steps.step,\n CASE\n WHEN patch_steps.object THEN jsonb_set(merged.document, patch_steps.path,\n CASE WHEN jsonb_typeof(merged.document #> patch_steps.path) = 'object'\n THEN merged.document #> patch_steps.path ELSE '{}'::jsonb END, true)\n WHEN patch_steps.value = 'null'::jsonb THEN merged.document #- patch_steps.path\n ELSE jsonb_set(merged.document, patch_steps.path, patch_steps.value, true)\n END\n FROM merged JOIN patch_steps ON patch_steps.step = merged.step + 1\n )\n SELECT document FROM merged ORDER BY step DESC LIMIT 1)`,\n params: [\n JSON.stringify(steps),\n ],\n }\n}\n\n/**\n * 创建 PostgreSQL 的 JSON 操作实现\n *\n * 使用 PostgreSQL JSONB 操作符和函数。\n * 路径以 `text[]` 形式传递(由 `parseJsonPath` 解析后发送)。\n */\nfunction createPostgresJsonOps(): ReldbJsonOps {\n return {\n extract(column, path) {\n const segments = parseJsonPath(path)\n return {\n sql: `${column} #> ?::text[]`,\n params: [segments],\n }\n },\n\n set(column, path, value) {\n const segments = parseJsonPath(path)\n return {\n sql: `jsonb_set(${column}, ?::text[], ?::jsonb)`,\n params: [\n segments,\n JSON.stringify(value),\n ],\n }\n },\n\n insert(column, path, value) {\n const segments = parseJsonPath(path)\n return {\n sql: `jsonb_insert(${column}, ?::text[], ?::jsonb)`,\n params: [\n segments,\n JSON.stringify(value),\n ],\n }\n },\n\n remove(column, path) {\n const segments = parseJsonPath(path)\n return {\n sql: `${column} #- ?::text[]`,\n params: [segments],\n }\n },\n\n merge(column, patch) {\n return buildPostgresMergePatch(column, patch)\n },\n }\n}\n\n/**\n * 创建 MySQL 的 JSON 操作实现\n *\n * 使用 MySQL 内置 JSON 函数;本仓库使用真实 MySQL 8.4 验证,不声明 MariaDB 兼容。\n * 路径使用 JSON Path 标准格式(`$.key`)。\n */\nfunction createMysqlJsonOps(): ReldbJsonOps {\n return {\n extract(column, path) {\n return {\n sql: `JSON_EXTRACT(${column}, ?)`,\n params: [path],\n }\n },\n\n set(column, path, value) {\n return {\n sql: `JSON_SET(${column}, ?, CAST(? AS JSON))`,\n params: [\n path,\n JSON.stringify(value),\n ],\n }\n },\n\n insert(column, path, value) {\n return {\n sql: `JSON_INSERT(${column}, ?, CAST(? AS JSON))`,\n params: [\n path,\n JSON.stringify(value),\n ],\n }\n },\n\n remove(column, path) {\n return {\n sql: `JSON_REMOVE(${column}, ?)`,\n params: [path],\n }\n },\n\n merge(column, patch) {\n return {\n sql: `JSON_MERGE_PATCH(${column}, CAST(? AS JSON))`,\n params: [\n JSON.stringify(patch),\n ],\n }\n },\n }\n}\n\n// ─── 工厂函数 ───\n\n/**\n * 创建指定数据库类型的 JSON 操作实例\n *\n * @param dbType - 数据库类型(来自 `reldb.config?.type`)\n * @returns JSON 操作实例\n * @example\n * ```ts\n * import { createJsonOps } from '@h-ai/reldb'\n *\n * const sqlite = createJsonOps('sqlite')\n * const expression = sqlite.extract('settings', '$.theme')\n * void expression\n * ```\n */\nexport function createJsonOps(dbType: 'sqlite' | 'postgresql' | 'mysql'): ReldbJsonOps {\n switch (dbType) {\n case 'sqlite':\n return createSqliteJsonOps()\n case 'postgresql':\n return createPostgresJsonOps()\n case 'mysql':\n return createMysqlJsonOps()\n }\n}\n","/**\n * @h-ai/reldb — 分页工具\n *\n * 数据库无关的分页参数规范化与结果构建工具。\n * @module reldb-pagination\n */\n\nimport type { PaginatedResult, PaginationOptions, PaginationOptionsInput } from '@h-ai/core'\nimport type { NormalizedPagination, PaginationOverrides } from './reldb-types.js'\n\n/** 默认起始页码 */\nconst DEFAULT_PAGE = 1\n\n/** 默认每页数量 */\nconst DEFAULT_PAGE_SIZE = 20\n\n/** 每页最大允许数量(防止过大分页导致性能问题) */\nconst MAX_PAGE_SIZE = 200\n\n/**\n * 规范化页码\n *\n * @param value - 原始页码\n * @param fallback - 默认页码\n * @returns 规范化后的页码\n */\nfunction normalizePage(value: number | undefined, fallback: number): number {\n if (!value || value < 1) {\n // 无值或非法时回退到默认页\n return fallback\n }\n return Math.floor(value)\n}\n\n/**\n * 规范化每页大小\n *\n * @param value - 原始页大小\n * @param fallback - 默认页大小\n * @param maxSize - 最大页大小\n * @returns 规范化后的页大小\n */\nfunction normalizePageSize(value: number | undefined, fallback: number, maxSize: number): number {\n if (!value || value < 1) {\n // 无值或非法时回退到默认值\n return fallback\n }\n // 限制最大值,避免过大分页\n return Math.min(Math.floor(value), maxSize)\n}\n\n/**\n * 规范化分页参数\n *\n * 将用户输入的可选分页参数转换为带有默认值的完整分页对象,\n * 同时计算 SQL 所需的 offset 和 limit。\n *\n * 处理规则:\n * - page < 1 或未提供 → 使用 defaultPage(默认 1)\n * - pageSize < 1 或未提供 → 使用 defaultPageSize(默认 20)\n * - pageSize > maxPageSize → 截断为 maxPageSize(默认 200)\n * - offset = (page - 1) * pageSize\n *\n * @param options - 用户传入的分页参数(可选)\n * @param overrides - 覆盖默认分页参数(可选)\n * @returns 规范化后的分页参数(含 offset、limit)\n * @example 模块内部上下文\n * ```ts\n * const page = normalizePagination({ page: 2, pageSize: 10 })\n * void page.offset // 10\n * ```\n */\nexport function normalizePagination(\n options?: PaginationOptionsInput,\n overrides?: PaginationOverrides,\n): NormalizedPagination {\n const defaultPage = overrides?.defaultPage ?? DEFAULT_PAGE\n const defaultPageSize = overrides?.defaultPageSize ?? DEFAULT_PAGE_SIZE\n const maxPageSize = overrides?.maxPageSize ?? MAX_PAGE_SIZE\n\n // 计算页码与大小,并推导 offset/limit\n const page = normalizePage(options?.page, defaultPage)\n const pageSize = normalizePageSize(options?.pageSize, defaultPageSize, maxPageSize)\n const offset = (page - 1) * pageSize\n\n return {\n page,\n pageSize,\n offset,\n limit: pageSize,\n }\n}\n\n/**\n * 构建分页结果\n *\n * 将查询结果和分页元数据组装为统一的分页响应结构。\n *\n * @param items - 当前页数据\n * @param total - 总记录数\n * @param pagination - 当前分页参数\n * @returns 标准分页结果对象\n * @example 模块内部上下文\n * ```ts\n * const result = buildPaginatedResult([{ id: 'u1' }], 1, { page: 1, pageSize: 20 })\n * void result.items\n * ```\n */\nexport function buildPaginatedResult<T>(\n items: T[],\n total: number,\n pagination: PaginationOptions,\n): PaginatedResult<T> {\n // 直接透传分页元信息\n return {\n items,\n total,\n page: pagination.page,\n pageSize: pagination.pageSize,\n }\n}\n\n/**\n * 分页工具集合\n *\n * 提供分页参数规范化与结果构建能力,通过 `reldb.pagination` 访问。\n * @example 模块内部上下文\n * ```ts\n * const page = pagination.normalize({ page: 2, pageSize: 10 })\n * const result = pagination.build([{ id: 'u1' }], 1, page)\n * void result\n * ```\n */\nexport const pagination = {\n normalize: normalizePagination,\n build: buildPaginatedResult,\n}\n\n// ─── 计数解析 ───\n\n/**\n * 解析 COUNT 查询返回值\n *\n * 兼容不同驱动/SQL 的列别名与返回类型(`total` / `__total__` / `cnt` / 首列值)。\n * 支持 bigint 类型的安全转换。\n *\n * @param row - 查询返回行(可能为 null/undefined)\n * @returns 解析后的数值,无数据时返回 0\n * @example 模块内部上下文\n * ```ts\n * const count = parseCount({ cnt: '42' })\n * void count\n * ```\n */\nexport function parseCount(row: Record<string, unknown> | null | undefined): number {\n if (!row) {\n // 无数据默认 0\n return 0\n }\n if ('total' in row) {\n // 常见别名 total\n return Number(row.total ?? 0)\n }\n if ('__total__' in row) {\n // 某些驱动使用 __total__\n return Number(row.__total__ ?? 0)\n }\n if ('cnt' in row) {\n // 默认别名 cnt\n return Number(row.cnt ?? 0)\n }\n const value = Object.values(row)[0]\n if (typeof value === 'bigint') {\n // SQLite/PG bigint 处理\n return Number(value)\n }\n return Number(value ?? 0)\n}\n","/**\n * @h-ai/reldb — 安全工具\n *\n * 提供 SQL 标识符校验与字符串值转义功能,防止注入风险。\n * @module reldb-security\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { } from './reldb-types.js'\nimport { err, ok } from '@h-ai/core'\nimport { reldbM } from './reldb-i18n.js'\nimport { HaiReldbError } from './reldb-types.js'\n\n// ─── 标识符校验 ───\n\n/**\n * 合法 SQL 标识符正则\n *\n * 仅允许字母、数字、下划线,且必须以字母或下划线开头。\n * 本层限制 128 字符;具体数据库可能有更短上限,仍需遵守其标识符规则。\n */\nconst VALID_IDENTIFIER_RE = /^[a-z_]\\w{0,127}$/i\n\n/**\n * 校验 SQL 标识符合法性\n *\n * 防止因动态拼接表名/列名/索引名而产生 SQL 注入风险。\n * 仅允许 `[a-zA-Z_][a-zA-Z0-9_]*`,最长 128 字符。\n *\n * @param name - 待校验的标识符\n * @returns 校验通过时返回 ok(name);不合法时返回错误 HaiResult\n * @example\n * ```ts\n * import { validateIdentifier } from '@h-ai/reldb'\n *\n * const checked = validateIdentifier('users')\n * if (!checked.success) throw new Error(checked.error.message)\n * void checked.data\n * ```\n */\nexport function validateIdentifier(name: string): HaiResult<string> {\n if (VALID_IDENTIFIER_RE.test(name)) {\n return ok(name)\n }\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_invalidIdentifier', {\n params: { name },\n }))\n}\n\n/**\n * 批量校验多个 SQL 标识符\n *\n * 逐个校验,遇到第一个不合法的立即返回错误。\n *\n * @param names - 待校验的标识符数组\n * @returns 全部合法时返回 ok(undefined);否则返回第一个不合法项的错误\n * @example\n * ```ts\n * import { validateIdentifiers } from '@h-ai/reldb'\n *\n * const checked = validateIdentifiers(['users', 'id'])\n * if (!checked.success) throw new Error(checked.error.message)\n * ```\n */\nexport function validateIdentifiers(names: string[]): HaiResult<void> {\n for (const name of names) {\n const result = validateIdentifier(name)\n if (!result.success) {\n return err(result.error)\n }\n }\n return ok(undefined)\n}\n\n// ─── 字符串值转义 ───\n\n/**\n * 用双引号包裹 SQL 标识符(适用于 PostgreSQL / SQLite / 标准 SQL)\n *\n * 标识符内的双引号会被转义为两个双引号。\n * 使用场景:DDL 中的表名、列名、索引名。\n * 调用前应先通过 `validateIdentifier` 校验合法性。\n *\n * @param name - 已校验的标识符\n * @returns 双引号包裹的安全标识符\n * @example\n * ```ts\n * import { quoteIdentifier, validateIdentifier } from '@h-ai/reldb'\n *\n * const checked = validateIdentifier('order')\n * if (!checked.success) throw new Error(checked.error.message)\n * void quoteIdentifier(checked.data)\n * ```\n */\nexport function quoteIdentifier(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`\n}\n\n/**\n * 转义 SQL 字符串字面量中的单引号\n *\n * 将 `'` 转义为 `''`,用于 DDL 中 DEFAULT 值等需要直接拼接的场景。\n * 注意:仅用于标识符/DDL 场景,数据操作应始终使用参数化查询。\n *\n * @param value - 原始字符串\n * @returns 转义后的安全字符串\n * @example\n * ```ts\n * import { escapeSqlString } from '@h-ai/reldb'\n *\n * void escapeSqlString(\"it's\") // it''s;仅用于可信 DDL 字面量,业务值使用占位符。\n * ```\n */\nexport function escapeSqlString(value: string): string {\n return value.replace(/'/g, '\\'\\'')\n}\n","/**\n * @h-ai/reldb — CRUD 抽象\n *\n * 提供基于单表的通用 CRUD 操作封装,支持在 reldb.sql 与事务 tx 中复用。\n * @module reldb-crud-kernel\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type {\n CrudConfig,\n CrudPageOptions,\n CrudQueryOptions,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n QueryRow,\n ReldbCrudCountOptions,\n ReldbCrudRepository,\n} from './reldb-types.js'\nimport { core, err, ok } from '@h-ai/core'\nimport { reldbM } from './reldb-i18n.js'\nimport { parseCount } from './reldb-pagination.js'\nimport { validateIdentifier, validateIdentifiers } from './reldb-security.js'\nimport { HaiReldbError } from './reldb-types.js'\n\nconst logger = core.logger.child({ module: 'reldb', scope: 'crud-kernel' })\nconst ORDER_BY_SEGMENT_REGEX = /^(\\w+)(?:\\s+(ASC|DESC))?$/i\n\n// ─── CRUD 工具方法 ───\n\n/**\n * 构建查询列字符串\n *\n * @param select - 列名数组(空或未提供时返回 '*')\n * @returns SQL SELECT 列片段\n */\nfunction buildSelectColumns(select?: string[]): string {\n if (!select || select.length === 0) {\n // 未指定字段时默认全部列\n return '*'\n }\n return select.join(', ')\n}\n\n/**\n * 从数据对象中挑选允许的列和值\n *\n * @param data - 原始数据\n * @param allowList - 允许列清单(为空时不过滤)\n * @returns 列名与参数值数组\n */\nfunction pickColumns(\n data: Record<string, unknown>,\n allowList?: string[],\n): { columns: string[], values: unknown[] } {\n const keys = Object.keys(data)\n // 若提供 allowList,则仅保留白名单列\n const columns = allowList\n ? keys.filter(key => allowList.includes(key))\n : keys\n const values = columns.map(key => data[key])\n return { columns, values }\n}\n\n// ─── CRUD 工厂 ───\n\n/**\n * 创建一个所有方法均返回同一错误的 ReldbCrudRepository,用于配置校验失败时短路返回\n *\n * @param failedResult - 校验失败产生的\n * @returns 所有操作均返回 configError 的 ReldbCrudRepository\n */\nfunction createFailReldbCrudRepository<TItem>(failedResult: HaiResult<never>): ReldbCrudRepository<TItem> {\n const failResult = <T>(): Promise<HaiResult<T>> => Promise.resolve(failedResult as HaiResult<T>)\n return {\n create: () => failResult(),\n createMany: () => failResult(),\n createOrUpdate: () => failResult(),\n findById: () => failResult(),\n getById: () => failResult(),\n findAll: () => failResult(),\n findPage: () => failResult(),\n updateById: () => failResult(),\n deleteById: () => failResult(),\n count: () => failResult(),\n exists: () => failResult(),\n existsById: () => failResult(),\n }\n}\n\n/**\n * 创建 CRUD 仓库\n *\n * @param ops - 数据操作接口(reldb.sql 或 tx)\n * @param config - CRUD 配置\n * @returns CRUD 仓库\n * @example 模块内部上下文\n * ```ts\n * function users(ops: DmlOperations) {\n * return createCrud<{ id: string }>(ops, { table: 'users', dbType: 'postgresql', select: ['id'] })\n * }\n * ```\n */\nexport function createCrud<TItem>(\n ops: DmlOperations,\n config: CrudConfig<TItem>,\n): ReldbCrudRepository<TItem> {\n const table = config.table\n const idColumn = config.idColumn ?? 'id'\n const selectColumns = buildSelectColumns(config.select)\n const mapRow = config.mapRow ?? ((row: QueryRow) => row as TItem)\n const dbType = config.dbType\n\n // 校验表名与主键列名,防止标识符注入\n const tableValid = validateIdentifier(table)\n if (!tableValid.success) {\n return createFailReldbCrudRepository(tableValid)\n }\n const idColumnValid = validateIdentifier(idColumn)\n if (!idColumnValid.success) {\n return createFailReldbCrudRepository(idColumnValid)\n }\n // 校验 select / createColumns / updateColumns 列名\n if (config.select) {\n const selectValid = validateIdentifiers(config.select)\n if (!selectValid.success) {\n return createFailReldbCrudRepository(selectValid)\n }\n }\n if (config.createColumns) {\n const createColsValid = validateIdentifiers(config.createColumns)\n if (!createColsValid.success) {\n return createFailReldbCrudRepository(createColsValid)\n }\n }\n if (config.updateColumns) {\n const updateColsValid = validateIdentifiers(config.updateColumns)\n if (!updateColsValid.success) {\n return createFailReldbCrudRepository(updateColsValid)\n }\n }\n\n // SQL 片段拼接工具(仅在传入值时附加)\n\n /** 构建 WHERE 子句,无条件时返回空字符串 */\n const buildWhereClause = (where?: string): string => (where\n ? ` WHERE ${where}`\n : '')\n\n /**\n * 构建 ORDER BY 子句\n *\n * 对 orderBy 中的标识符逐一校验,防止 SQL 注入。\n * 仅允许 `column`、`column ASC`、`column DESC` 格式。\n * 校验失败时跳过非法排序字段并输出 debug 日志。\n */\n const buildOrderClause = (orderBy?: string): string => {\n if (!orderBy)\n return ''\n // 解析并校验每个排序字段\n const parts = orderBy.split(',').map(s => s.trim()).filter(Boolean)\n const safeParts: string[] = []\n for (const part of parts) {\n // 匹配 \"column\" 或 \"column ASC/DESC\" 格式\n const match = part.match(ORDER_BY_SEGMENT_REGEX)\n if (!match) {\n logger.debug('Skipped invalid orderBy segment', { table, segment: part })\n continue\n }\n const colName = match[1]\n const direction = match[2] ?? ''\n const colValid = validateIdentifier(colName)\n if (!colValid.success) {\n logger.debug('Skipped invalid orderBy identifier', { table, column: colName })\n continue\n }\n safeParts.push(direction\n ? `${colName} ${direction.toUpperCase()}`\n : colName)\n }\n if (safeParts.length === 0)\n return ''\n return ` ORDER BY ${safeParts.join(', ')}`\n }\n /** 构建 LIMIT/OFFSET 子句,仅在传入值时生效 */\n const buildLimitOffset = (limit?: number, offset?: number): string => {\n const parts: string[] = []\n if (typeof limit === 'number') {\n // limit 优先\n parts.push(` LIMIT ${limit}`)\n }\n if (typeof offset === 'number') {\n // offset 仅在传入时生效\n parts.push(` OFFSET ${offset}`)\n }\n return parts.join('')\n }\n\n /** 构建空负载错误结果(数据为空时报错) */\n const createPayloadError = (): HaiResult<ExecuteResult> => err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudEmptyPayload'))\n\n /** 构建无有效列错误结果(白名单过滤后无可写列时报错) */\n const createColumnsError = (): HaiResult<ExecuteResult> => err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudNoValidColumns'))\n\n /** 解析实际数据操作接口:传入事务时使用事务接口,否则使用 reldb.sql */\n const resolveOps = (tx?: DmlWithTxOperations): DmlOperations => tx ?? ops\n\n return {\n /**\n * 创建单条记录\n *\n * @param data - 列名与值的映射(会根据 createColumns 白名单过滤)\n * @param tx - 可选事务句柄\n * @returns 插入结果(含 changes、lastInsertRowid)\n */\n async create(data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n if (!data || Object.keys(data).length === 0) {\n // 空数据直接报错\n return createPayloadError()\n }\n\n const { columns, values } = pickColumns(data, config.createColumns)\n if (columns.length === 0) {\n // 白名单过滤后无可写列\n return createColumnsError()\n }\n\n // 校验列名合法性,防止通过 data key 注入\n const colValid = validateIdentifiers(columns)\n if (!colValid.success) {\n return err(colValid.error)\n }\n\n const placeholders = columns.map(() => '?').join(', ')\n const sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`\n return resolveOps(tx).execute(sql, values)\n },\n\n /**\n * 批量创建记录\n *\n * 所有记录在同一 batch 中执行,任意一条失败则整体失败。\n *\n * @param items - 待插入的数据数组\n * @param tx - 可选事务句柄\n * @returns 批量插入结果\n */\n async createMany(items: Array<Record<string, unknown>>, tx?: DmlWithTxOperations): Promise<HaiResult<void>> {\n if (!items || items.length === 0) {\n // 空数组视为成功\n return ok(undefined)\n }\n\n const statements: Array<{ sql: string, params?: unknown[] }> = []\n\n for (const item of items) {\n if (!item || Object.keys(item).length === 0) {\n // 任意项为空则整体失败\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudEmptyPayload'))\n }\n\n const { columns, values } = pickColumns(item, config.createColumns)\n if (columns.length === 0) {\n // 过滤后无可写列\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudNoValidColumns'))\n }\n\n // 校验列名合法性\n const colValid = validateIdentifiers(columns)\n if (!colValid.success) {\n return err(colValid.error)\n }\n\n const placeholders = columns.map(() => '?').join(', ')\n const sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`\n statements.push({ sql, params: values })\n }\n\n return resolveOps(tx).batch(statements)\n },\n\n /**\n * 创建或更新单条记录(upsert)\n *\n * 主键冲突时更新 updateColumns 中存在的列,否则插入新记录。\n *\n * @param data - 列名与值的映射\n * @param tx - 可选事务句柄\n * @returns 执行结果(含 changes)\n */\n async createOrUpdate(data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n if (!data || Object.keys(data).length === 0) {\n return createPayloadError()\n }\n\n const { columns, values } = pickColumns(data, config.createColumns)\n if (columns.length === 0) {\n return createColumnsError()\n }\n\n const colValid = validateIdentifiers(columns)\n if (!colValid.success) {\n return err(colValid.error)\n }\n\n const placeholders = columns.map(() => '?').join(', ')\n\n // 从 updateColumns 中筛选:排除主键,且仅保留当前 INSERT 数据中存在的列\n const updateCols = (config.updateColumns ?? columns)\n .filter(col => col !== idColumn && columns.includes(col))\n\n if (updateCols.length === 0) {\n // 无可更新列,退化为普通 INSERT\n const sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`\n return resolveOps(tx).execute(sql, values)\n }\n\n let sql: string\n if (dbType === 'mysql') {\n const updateSet = updateCols.map(col => `${col} = VALUES(${col})`).join(', ')\n sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders}) ON DUPLICATE KEY UPDATE ${updateSet}`\n }\n else {\n // SQLite / PostgreSQL\n const updateSet = updateCols.map(col => `${col} = excluded.${col}`).join(', ')\n sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${idColumn}) DO UPDATE SET ${updateSet}`\n }\n\n return resolveOps(tx).execute(sql, values)\n },\n\n /**\n * 根据主键查找单条记录\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 记录对象或 null(未找到)\n */\n async findById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<TItem | null>> {\n const sql = `SELECT ${selectColumns} FROM ${table} WHERE ${idColumn} = ?`\n const result = await resolveOps(tx).get<QueryRow>(sql, [id])\n if (!result.success) {\n // 透传查询错误\n return result\n }\n // 未命中时返回 null\n return ok(result.data\n ? mapRow(result.data)\n : null)\n },\n\n /**\n * 根据主键获取单条记录(必须存在)\n *\n * 与 findById 不同,当记录不存在时返回 RECORD_NOT_FOUND 错误。\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 记录对象(不存在时返回错误)\n */\n async getById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<TItem>> {\n const findResult = await this.findById(id, tx)\n if (!findResult.success) {\n return findResult\n }\n if (findResult.data === null) {\n return err(HaiReldbError.RECORD_NOT_FOUND, reldbM('reldb_crudRecordNotFound', {\n params: {\n id: String(id),\n },\n }))\n }\n return ok(findResult.data)\n },\n\n /**\n * 条件查询多条记录\n *\n * @param options - 查询条件(where、orderBy、limit、offset)\n * @param tx - 可选事务句柄\n * @returns 记录数组\n */\n async findAll(options: CrudQueryOptions = {}, tx?: DmlWithTxOperations): Promise<HaiResult<TItem[]>> {\n const whereClause = buildWhereClause(options.where)\n const orderClause = buildOrderClause(options.orderBy)\n const limitClause = buildLimitOffset(options.limit, options.offset)\n const sql = `SELECT ${selectColumns} FROM ${table}${whereClause}${orderClause}${limitClause}`\n const result = await resolveOps(tx).query<QueryRow>(sql, options.params)\n if (!result.success) {\n // 透传查询错误\n return result\n }\n return ok(result.data.map(row => mapRow(row)))\n },\n\n /**\n * 分页查询记录\n *\n * @param options - 分页查询条件(where、orderBy、pagination、overrides)\n * @param tx - 可选事务句柄\n * @returns 分页结果(含 items、total、page、pageSize)\n */\n async findPage(options: CrudPageOptions, tx?: DmlWithTxOperations): Promise<HaiResult<PaginatedResult<TItem>>> {\n const whereClause = buildWhereClause(options.where)\n const orderClause = buildOrderClause(options.orderBy)\n const sql = `SELECT ${selectColumns} FROM ${table}${whereClause}${orderClause}`\n const pageResult = await resolveOps(tx).queryPage<QueryRow>({\n sql,\n params: options.params,\n pagination: options.pagination,\n overrides: options.overrides,\n })\n if (!pageResult.success) {\n // 透传分页查询错误\n return pageResult\n }\n return ok({\n ...pageResult.data,\n items: pageResult.data.items.map(row => mapRow(row)),\n })\n },\n\n /**\n * 根据主键更新记录\n *\n * 主键列不可更新,会自动排除。\n *\n * @param id - 主键值\n * @param data - 待更新的列值映射(会根据 updateColumns 白名单过滤)\n * @param tx - 可选事务句柄\n * @returns 更新结果(含 changes)\n */\n async updateById(id: unknown, data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n if (!data || Object.keys(data).length === 0) {\n // 空数据不允许更新\n return createPayloadError()\n }\n\n const allowList = (config.updateColumns ?? []).filter(column => column !== idColumn)\n const { columns } = pickColumns(data, allowList.length > 0\n ? allowList\n : undefined)\n const filtered = columns.filter(column => column !== idColumn)\n\n if (filtered.length === 0) {\n // 过滤后无可更新列\n return createColumnsError()\n }\n\n // 校验列名合法性,防止通过 data key 注入\n const colValid = validateIdentifiers(filtered)\n if (!colValid.success) {\n return err(colValid.error)\n }\n\n const setClause = filtered.map(column => `${column} = ?`).join(', ')\n const sql = `UPDATE ${table} SET ${setClause} WHERE ${idColumn} = ?`\n const params = [\n ...filtered.map(column => data[column]),\n id,\n ]\n return resolveOps(tx).execute(sql, params)\n },\n\n /**\n * 根据主键删除记录\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 删除结果(含 changes)\n */\n async deleteById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n const sql = `DELETE FROM ${table} WHERE ${idColumn} = ?`\n return resolveOps(tx).execute(sql, [id])\n },\n\n /**\n * 统计符合条件的记录数\n *\n * @param options - 查询条件(where、params)\n * @param tx - 可选事务句柄\n * @returns 记录数\n */\n async count(options: ReldbCrudCountOptions = {}, tx?: DmlWithTxOperations): Promise<HaiResult<number>> {\n const whereClause = buildWhereClause(options.where)\n const sql = `SELECT COUNT(*) as cnt FROM ${table}${whereClause}`\n const result = await resolveOps(tx).get<QueryRow>(sql, options.params)\n if (!result.success) {\n // 透传查询错误\n return result\n }\n return ok(parseCount(result.data ?? null))\n },\n\n /**\n * 检查是否存在符合条件的记录\n *\n * @param options - 查询条件(where、params)\n * @param tx - 可选事务句柄\n * @returns 是否存在\n */\n async exists(options: ReldbCrudCountOptions = {}, tx?: DmlWithTxOperations): Promise<HaiResult<boolean>> {\n const whereClause = buildWhereClause(options.where)\n const sql = `SELECT 1 as exist_flag FROM ${table}${whereClause} LIMIT 1`\n const result = await resolveOps(tx).get<QueryRow>(sql, options.params)\n if (!result.success) {\n // 透传查询错误\n return result\n }\n // 只要命中一行即存在\n return ok(Boolean(result.data))\n },\n\n /**\n * 根据主键检查记录是否存在\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 是否存在\n */\n async existsById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<boolean>> {\n const sql = `SELECT 1 as exist_flag FROM ${table} WHERE ${idColumn} = ? LIMIT 1`\n const result = await resolveOps(tx).get<QueryRow>(sql, [id])\n if (!result.success) {\n // 透传查询错误\n return result\n }\n return ok(Boolean(result.data))\n },\n }\n}\n","/**\n * @h-ai/reldb — 事务句柄组装\n *\n * 将事务连接的 DML 操作 + commit/rollback 生命周期组装为完整的 DmlWithTxOperations。\n * 内部自动管理 ensureActive 守卫(commit/rollback 后拒绝操作)。\n * @module reldb-tx-assembler\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type {\n CrudManager,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n PaginationQueryOptions,\n TxManager,\n TxWrapCallback,\n} from '../reldb-types.js'\n\nimport { err, ok } from '@h-ai/core'\nimport { createCrud } from '../reldb-crud-kernel.js'\nimport { reldbM } from '../reldb-i18n.js'\nimport { HaiReldbError } from '../reldb-types.js'\n\n// ─── 事务回调接口 ───\n\n/**\n * 事务生命周期回调\n *\n * Provider 提供具体的 commit/rollback/release 操作。\n * @example 模块内部上下文\n * ```ts\n * function release(callbacks: TxCallbacks) {\n * callbacks.release() // commit/rollback 之后归还唯一事务资源。\n * }\n * ```\n */\nexport interface TxCallbacks {\n /** 提交事务 */\n commit: () => Promise<void>\n /** 回滚事务 */\n rollback: () => Promise<void>\n /** 释放资源(连接归还池等),commit/rollback 后调用 */\n release: () => void\n /** 事务错误消息生成 */\n errorMessage: (detail: string) => string\n}\n\n// ─── 事务句柄组装 ───\n\n/**\n * 组装完整的事务句柄\n *\n * 内部自动管理:\n * - ensureActive 守卫(commit/rollback 后拒绝操作)\n * - DmlOperations(带守卫)\n * - crud(基于 DmlOperations 创建)\n * - commit/rollback(调用回调 + 标记非活跃 + 释放资源)\n *\n * @param baseDmlOps - 事务连接上的 DML 操作\n * @param callbacks - 事务生命周期回调\n * @returns 完整的事务句柄\n * @example 模块内部上下文\n * ```ts\n * function wrap(ops: DmlOperations, callbacks: TxCallbacks) {\n * return createTxHandle(ops, callbacks)\n * }\n * ```\n */\nexport function createTxHandle(baseDmlOps: DmlOperations, callbacks: TxCallbacks): DmlWithTxOperations {\n let active = true\n\n const ensureActive = (): HaiResult<void> => {\n if (!active) {\n return err(HaiReldbError.TRANSACTION_FAILED, callbacks.errorMessage('transaction finished'))\n }\n return ok(undefined)\n }\n\n const guardedOps: DmlOperations = {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n const check = ensureActive()\n if (!check.success)\n return check\n return baseDmlOps.query<T>(sql, params)\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const check = ensureActive()\n if (!check.success)\n return check\n return baseDmlOps.get<T>(sql, params)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const check = ensureActive()\n if (!check.success)\n return check\n return baseDmlOps.execute(sql, params)\n },\n async batch(statements: Array<{ sql: string, params?: unknown[] }>): Promise<HaiResult<void>> {\n const check = ensureActive()\n if (!check.success)\n return check\n return baseDmlOps.batch(statements)\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const check = ensureActive()\n if (!check.success)\n return check\n return baseDmlOps.queryPage<T>(options)\n },\n }\n\n const crudManager: CrudManager = {\n table: config => createCrud(guardedOps, config),\n }\n\n return {\n ...guardedOps,\n crud: crudManager,\n\n async commit(): Promise<HaiResult<void>> {\n const check = ensureActive()\n if (!check.success)\n return check\n // 在等待驱动前独占结束权,阻止并发提交/回滚及结束期间的新操作。\n active = false\n try {\n await callbacks.commit()\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.TRANSACTION_FAILED, callbacks.errorMessage(String(error)), error)\n }\n finally {\n callbacks.release()\n }\n },\n\n async rollback(): Promise<HaiResult<void>> {\n const check = ensureActive()\n if (!check.success)\n return check\n active = false\n try {\n await callbacks.rollback()\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.TRANSACTION_FAILED, callbacks.errorMessage(String(error)), error)\n }\n finally {\n callbacks.release()\n }\n },\n }\n}\n\n// ─── tx.wrap 语法糖 ───\n\n/**\n * 创建统一的 tx.wrap 函数\n *\n * 自动管理事务生命周期:begin → callback → commit(成功)/ rollback(失败)。\n *\n * @param beginTx - 开启事务函数\n * @returns tx.wrap 函数\n * @example 模块内部上下文\n * ```ts\n * function wrap(begin: () => Promise<HaiResult<DmlWithTxOperations>>) {\n * return createTxWrap(begin)\n * }\n * ```\n */\nexport function createTxWrap(\n beginTx: () => Promise<HaiResult<DmlWithTxOperations>>,\n): TxManager['wrap'] {\n return async <T>(fn: TxWrapCallback<T>): Promise<HaiResult<T>> => {\n const txResult = await beginTx()\n if (!txResult.success)\n return txResult\n\n try {\n const result = await fn(txResult.data)\n const commitResult = await txResult.data.commit()\n if (!commitResult.success) {\n return commitResult as HaiResult<T>\n }\n return ok(result)\n }\n catch (error) {\n await txResult.data.rollback()\n return err(HaiReldbError.TRANSACTION_FAILED, reldbM('reldb_txFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n }\n}\n","/**\n * @h-ai/reldb — Provider 共享基础层\n *\n * Provider 共享基础层:Context + wrapOp → Factory 模式。\n *\n * 各 Provider 只需提供 raw DdlOperations / DmlOperations / beginTx,\n * base 层统一处理连接守卫、运行时异常捕获与 HaiResult 包装。\n * @module reldb-provider-base\n */\n\nimport type { HaiError, HaiErrorDef, HaiResult, PaginatedResult } from '@h-ai/core'\n\nimport type { ReldbOperationLogConfig } from '../reldb-config.js'\nimport type {\n CrudManager,\n DdlOperations,\n DmlOperations,\n PaginationQueryOptions,\n TxManager,\n} from '../reldb-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { createCrud } from '../reldb-crud-kernel.js'\nimport { reldbM } from '../reldb-i18n.js'\nimport { buildPaginatedResult, normalizePagination, parseCount } from '../reldb-pagination.js'\nimport { validateIdentifier, validateIdentifiers } from '../reldb-security.js'\nimport { HaiReldbError } from '../reldb-types.js'\nimport { createTxWrap } from './reldb-tx-assembler.js'\n\n// ─── 操作上下文 ───\n\n/**\n * 操作上下文:由 Provider 在创建 ops 时传入\n *\n * 对标 VecdbOpsContext:统一的连接状态检查 + 日志记录。\n * @example 模块内部上下文\n * ```ts\n * function connected(ctx: ReldbOpsContext) {\n * if (!ctx.isConnected()) return false\n * ctx.logger.debug('Database ready', {})\n * return true\n * }\n * ```\n */\nexport interface ReldbOpsContext {\n /** 连接状态检查 */\n isConnected: () => boolean\n /** Logger 实例(用于运行时异常的错误日志) */\n logger: {\n error: (msg: string, meta?: Record<string, unknown>) => void\n info: (msg: string, meta?: Record<string, unknown>) => void\n debug: (msg: string, meta?: Record<string, unknown>) => void\n trace: (msg: string, meta?: Record<string, unknown>) => void\n }\n /** 当前操作日志配置 */\n operationLog?: () => ReldbOperationLogConfig | undefined\n}\n\n/**\n * ReldbOperationCategory 的数据约束与操作契约。\n * @example 模块内部上下文\n * ```ts\n * const category: ReldbOperationCategory = 'read'\n * void category\n * ```\n */\ntype ReldbOperationCategory = 'read' | 'write'\n\n/** 仅提取固定的数量信息;SQL 字面量、参数、默认值及错误对象不进入日志。 */\nfunction summarizeOperationPayload(payload: unknown): Record<string, number> {\n try {\n if (!payload || typeof payload !== 'object')\n return {}\n const fields = payload as Record<string, unknown>\n return {\n ...(typeof fields.sql === 'string'\n ? { sqlLength: fields.sql.length }\n : {}),\n ...(Array.isArray(fields.params)\n ? { parameterCount: fields.params.length }\n : {}),\n ...(Array.isArray(fields.statements)\n ? { statementCount: fields.statements.length }\n : {}),\n ...(fields.columns && typeof fields.columns === 'object'\n ? { columnCount: Object.keys(fields.columns).length }\n : {}),\n }\n }\n catch {\n return {}\n }\n}\n\n/**\n * 记录不含 SQL 原文及绑定值的操作摘要。\n *\n * @param ctx - Provider 日志和配置上下文\n * @param category - 读取或写入类别\n * @param operation - 内部固定操作名\n * @param payload - 仅用于计算语句长度和参数数量,不序列化原值\n * @example 模块内部上下文\n * ```ts\n * function read(ctx: ReldbOpsContext) {\n * logReldbOperation(ctx, 'read', 'sql.get', { sql: 'SELECT id FROM users WHERE id = ?', params: ['u1'] })\n * } // 日志仅记录 SQL 长度和参数数量。\n * ```\n */\nexport function logReldbOperation(\n ctx: ReldbOpsContext,\n category: ReldbOperationCategory,\n operation: string,\n payload: unknown,\n): void {\n const config = ctx.operationLog?.()\n if (!config?.[category]) {\n return\n }\n\n ctx.logger[config.level]('RelDB operation executed', {\n category,\n operation,\n payload: config.maxLength <= 0\n ? ''\n : JSON.stringify(summarizeOperationPayload(payload)).slice(0, config.maxLength),\n })\n}\n\n// ─── 统一操作包装器 ───\n\n/**\n * 统一操作包装器:guard → delegate → catch-all\n *\n * 对标 vecdb wrapOp:\n * 1. 连接守卫:未初始化时直接返回 NOT_INITIALIZED\n * 2. 委托给 raw ops 执行(raw ops 内部用 HaiResult 表达业务错误)\n * 3. catch-all 安全网:捕获 raw ops 未预期的运行时异常\n */\nasync function wrapOp<T>(\n ctx: ReldbOpsContext,\n fn: () => Promise<HaiResult<T>>,\n errorDef: HaiErrorDef,\n errorLabel: string,\n errorMeta?: Record<string, unknown>,\n): Promise<HaiResult<T>> {\n if (!ctx.isConnected()) {\n return err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized'))\n }\n const failed = (error: unknown, original?: HaiError): HaiResult<T> => {\n let definition = original ?? errorDef\n const traceId = core.context.get().traceId ?? core.context.get().requestId ?? original?.traceId ?? core.id.uuid()\n const fields = error && typeof error === 'object'\n ? error as Record<string, unknown>\n : {}\n // 驱动差异在数据库层收敛;业务不解析本地化消息或依赖驱动类型。\n if (definition.code === HaiReldbError.QUERY_FAILED.code && ([\n '23505',\n 'ER_DUP_ENTRY',\n 'SQLITE_CONSTRAINT_UNIQUE',\n 'SQLITE_CONSTRAINT_PRIMARYKEY',\n ].includes(String(fields.code)) || fields.errno === 1062)) {\n definition = HaiReldbError.DUPLICATE_ENTRY\n }\n const secrets = new Set<string>()\n const seen = new WeakSet<object>()\n const collect = (value: unknown): void => {\n if (typeof value === 'string' && value) {\n secrets.add(value)\n }\n else if (typeof value === 'number' || typeof value === 'bigint') {\n secrets.add(String(value))\n }\n else if (value && typeof value === 'object' && !seen.has(value)) {\n seen.add(value)\n Object.values(value).forEach(collect)\n }\n }\n collect(errorMeta?.params)\n const payloads = [\n errorMeta,\n ...(Array.isArray(errorMeta?.statements)\n ? errorMeta.statements as Record<string, unknown>[]\n : []),\n ]\n for (const payload of payloads) {\n collect(payload?.params)\n for (const match of (typeof payload?.sql === 'string'\n ? payload.sql\n : '').matchAll(/'((?:''|[^'])*)'/g))\n secrets.add(match[1].replaceAll('\\'\\'', '\\''))\n }\n // 只复制驱动诊断白名单;完整 SQL、绑定参数和连接配置从不进入日志。\n const diagnostic: Record<string, unknown> = {}\n for (const key of [\n 'name',\n 'message',\n 'stack',\n 'code',\n 'errno',\n 'sqlState',\n 'detail',\n 'hint',\n 'constraint',\n 'schema',\n 'routine',\n 'severity',\n 'table',\n 'column',\n ]) {\n const value: unknown = error instanceof Error && key === 'message'\n ? error.message\n : error instanceof Error && key === 'stack'\n ? error.stack\n : fields[key]\n if (typeof value === 'string') {\n if ([\n 'code',\n 'sqlState',\n 'schema',\n 'routine',\n 'severity',\n 'constraint',\n 'table',\n 'column',\n ].includes(key)) {\n diagnostic[key] = core.sanitize.sanitizeText(value)\n }\n else {\n // 参数值只遮蔽诊断正文,不把数字参数误当成错误码或堆栈行号。\n const frames = key === 'stack'\n ? value.search(/^\\s+at\\s/m)\n : -1\n const body = frames < 0\n ? value\n : value.slice(0, frames)\n diagnostic[key] = core.sanitize.sanitizeText(body, [...secrets]).replace(/'(?:''|[^'])*'/g, '\\'[REDACTED]\\'') + (frames < 0\n ? ''\n : core.sanitize.sanitizeText(value.slice(frames)))\n }\n }\n else if (typeof value === 'number') {\n diagnostic[key] = value\n }\n }\n if (!Object.keys(diagnostic).length)\n diagnostic.message = core.sanitize.sanitizeText(String(error), [...secrets])\n ctx.logger.error(errorLabel, {\n ...summarizeOperationPayload(errorMeta),\n table: errorMeta?.tableName,\n column: errorMeta?.columnName,\n errorCode: definition.code,\n traceId,\n error: diagnostic,\n })\n const key = definition.code === HaiReldbError.DDL_FAILED.code\n ? 'reldb_ddlFailed'\n : definition.code === HaiReldbError.TRANSACTION_FAILED.code\n ? 'reldb_txFailed'\n : 'reldb_queryFailed'\n return err({\n ...definition,\n traceId,\n message: definition.code === HaiReldbError.DUPLICATE_ENTRY.code\n ? reldbM('reldb_duplicateEntry')\n : original\n ? core.sanitize.sanitizeText(original.message, [...secrets])\n : reldbM(key),\n cause: diagnostic,\n })\n }\n try {\n const result = await fn()\n return result.success\n ? result\n : failed(result.error.cause ?? result.error, result.error)\n }\n catch (error) {\n return failed(error)\n }\n}\n\n// ─── DDL 操作工厂 ───\n\n/**\n * 创建标准 DDL 操作\n *\n * 各 Provider 只需提供 raw DdlOperations,base 层统一处理标识符校验、连接守卫与运行时异常。\n * @param ctx - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param raw - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * function wrap(ctx: ReldbOpsContext, raw: DdlOperations) {\n * return createBaseDdlOps(ctx, raw)\n * }\n * ```\n */\nexport function createBaseDdlOps(ctx: ReldbOpsContext, raw: DdlOperations): DdlOperations {\n return {\n createTable(tableName, columns, ifNotExists = true) {\n const v1 = validateIdentifier(tableName)\n if (!v1.success)\n return Promise.resolve(v1)\n const v2 = validateIdentifiers(Object.keys(columns))\n if (!v2.success)\n return Promise.resolve(v2)\n logReldbOperation(ctx, 'write', 'ddl.createTable', { tableName, columns, ifNotExists })\n return wrapOp(ctx, () => raw.createTable(tableName, columns, ifNotExists), HaiReldbError.DDL_FAILED, 'DDL: createTable failed', { tableName })\n },\n\n dropTable(tableName, ifExists = true) {\n const v = validateIdentifier(tableName)\n if (!v.success)\n return Promise.resolve(v)\n logReldbOperation(ctx, 'write', 'ddl.dropTable', { tableName, ifExists })\n return wrapOp(ctx, () => raw.dropTable(tableName, ifExists), HaiReldbError.DDL_FAILED, 'DDL: dropTable failed', { tableName })\n },\n\n addColumn(tableName, columnName, columnDef) {\n const v1 = validateIdentifier(tableName)\n if (!v1.success)\n return Promise.resolve(v1)\n const v2 = validateIdentifier(columnName)\n if (!v2.success)\n return Promise.resolve(v2)\n logReldbOperation(ctx, 'write', 'ddl.addColumn', { tableName, columnName, columnDef })\n return wrapOp(ctx, () => raw.addColumn(tableName, columnName, columnDef), HaiReldbError.DDL_FAILED, 'DDL: addColumn failed', { tableName, columnName })\n },\n\n dropColumn(tableName, columnName) {\n const v1 = validateIdentifier(tableName)\n if (!v1.success)\n return Promise.resolve(v1)\n const v2 = validateIdentifier(columnName)\n if (!v2.success)\n return Promise.resolve(v2)\n logReldbOperation(ctx, 'write', 'ddl.dropColumn', { tableName, columnName })\n return wrapOp(ctx, () => raw.dropColumn(tableName, columnName), HaiReldbError.DDL_FAILED, 'DDL: dropColumn failed', { tableName, columnName })\n },\n\n renameTable(oldName, newName) {\n const v1 = validateIdentifier(oldName)\n if (!v1.success)\n return Promise.resolve(v1)\n const v2 = validateIdentifier(newName)\n if (!v2.success)\n return Promise.resolve(v2)\n logReldbOperation(ctx, 'write', 'ddl.renameTable', { oldName, newName })\n return wrapOp(ctx, () => raw.renameTable(oldName, newName), HaiReldbError.DDL_FAILED, 'DDL: renameTable failed', { oldName, newName })\n },\n\n createIndex(tableName, indexName, indexDef) {\n const v1 = validateIdentifier(tableName)\n if (!v1.success)\n return Promise.resolve(v1)\n const v2 = validateIdentifier(indexName)\n if (!v2.success)\n return Promise.resolve(v2)\n const v3 = validateIdentifiers(indexDef.columns)\n if (!v3.success)\n return Promise.resolve(v3)\n logReldbOperation(ctx, 'write', 'ddl.createIndex', { tableName, indexName, indexDef })\n return wrapOp(ctx, () => raw.createIndex(tableName, indexName, indexDef), HaiReldbError.DDL_FAILED, 'DDL: createIndex failed', { tableName, indexName })\n },\n\n dropIndex(indexName, ifExists = true) {\n const v = validateIdentifier(indexName)\n if (!v.success)\n return Promise.resolve(v)\n logReldbOperation(ctx, 'write', 'ddl.dropIndex', { indexName, ifExists })\n return wrapOp(ctx, () => raw.dropIndex(indexName, ifExists), HaiReldbError.DDL_FAILED, 'DDL: dropIndex failed', { indexName })\n },\n\n raw(sql) {\n logReldbOperation(ctx, 'write', 'ddl.raw', { sql })\n return wrapOp(ctx, () => raw.raw(sql), HaiReldbError.DDL_FAILED, 'DDL: raw failed', { sql })\n },\n }\n}\n\n// ─── DML 操作工厂 ───\n\n/**\n * 创建标准 DML 操作\n *\n * 各 Provider 只需提供 raw DmlOperations,base 层统一处理连接守卫与运行时异常。\n * @param ctx - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param raw - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * function wrap(ctx: ReldbOpsContext, raw: DmlOperations) {\n * return createBaseDmlOps(ctx, raw)\n * }\n * ```\n */\nexport function createBaseDmlOps(ctx: ReldbOpsContext, raw: DmlOperations): DmlOperations {\n return {\n query: (sql, params) => {\n logReldbOperation(ctx, 'read', 'query', { sql, params })\n return wrapOp(ctx, () => raw.query(sql, params), HaiReldbError.QUERY_FAILED, 'DML: query failed', { sql, params })\n },\n get: (sql, params) => {\n logReldbOperation(ctx, 'read', 'get', { sql, params })\n return wrapOp(ctx, () => raw.get(sql, params), HaiReldbError.QUERY_FAILED, 'DML: get failed', { sql, params })\n },\n execute: (sql, params) => {\n logReldbOperation(ctx, 'write', 'execute', { sql, params })\n return wrapOp(ctx, () => raw.execute(sql, params), HaiReldbError.QUERY_FAILED, 'DML: execute failed', { sql, params })\n },\n batch: (statements) => {\n logReldbOperation(ctx, 'write', 'batch', { count: statements.length, statements })\n return wrapOp(ctx, () => raw.batch(statements), HaiReldbError.QUERY_FAILED, 'DML: batch failed', { statements })\n },\n queryPage: (options) => {\n logReldbOperation(ctx, 'read', 'queryPage', options)\n return wrapOp(ctx, () => raw.queryPage(options), HaiReldbError.QUERY_FAILED, 'DML: queryPage failed', { ...options })\n },\n }\n}\n\n// ─── 事务管理器工厂 ───\n\n/**\n * 创建标准事务管理器\n *\n * 各 Provider 只需提供 beginTx 函数,base 层统一处理连接守卫 + tx.wrap 语法糖。\n * @param ctx - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param beginTx - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * function wrap(ctx: ReldbOpsContext, begin: () => Promise<HaiResult<import('../reldb-types.js').DmlWithTxOperations>>) {\n * return createBaseTxManager(ctx, begin)\n * }\n * ```\n */\nexport function createBaseTxManager(ctx: ReldbOpsContext, beginTx: TxManager['begin']): TxManager {\n const begin: TxManager['begin'] = async () => {\n logReldbOperation(ctx, 'write', 'tx.begin', {})\n const result = await wrapOp(ctx, beginTx, HaiReldbError.TRANSACTION_FAILED, 'TX: begin failed')\n if (!result.success) {\n return result\n }\n\n const tx = result.data\n return ok({\n ...tx,\n commit: async () => {\n logReldbOperation(ctx, 'write', 'tx.commit', {})\n return tx.commit()\n },\n rollback: async () => {\n logReldbOperation(ctx, 'write', 'tx.rollback', {})\n return tx.rollback()\n },\n })\n }\n return {\n begin,\n wrap: createTxWrap(begin),\n }\n}\n\n// ─── CRUD 管理器工厂 ───\n\n/**\n * 创建 CRUD 管理器\n *\n * @param ops - DML 操作接口\n * @returns CRUD 管理器\n * @example 模块内部上下文\n * ```ts\n * function users(ops: DmlOperations) {\n * return createBaseCrudManager(ops).table<{ id: string }>({ table: 'users', dbType: 'postgresql' })\n * }\n * ```\n */\nexport function createBaseCrudManager(ops: DmlOperations): CrudManager {\n return {\n table: config => createCrud(ops, config),\n }\n}\n\n// ─── 通用分页查询执行器 ───\n\n/**\n * 通用异步分页查询\n *\n * 使用独立的 COUNT(*) 查询获取总数,再执行 LIMIT/OFFSET 获取当前页数据。\n * 各 Provider 在实现 DmlOperations.queryPage 时使用此函数。\n *\n * @param queryRows - 查询多行的原始函数\n * @param options - 分页查询参数\n * @returns 分页结果\n * @example 模块内部上下文\n * ```ts\n * async function page(query: (sql: string, params?: unknown[]) => Promise<unknown[]>) {\n * return queryPageAsync<{ id: string }>(query, { sql: 'SELECT id FROM users', pagination: { page: 1, pageSize: 10 } })\n * }\n * ```\n */\nexport async function queryPageAsync<T>(\n queryRows: (sql: string, params?: unknown[]) => Promise<unknown[]>,\n options: PaginationQueryOptions,\n): Promise<PaginatedResult<T>> {\n const pagination = normalizePagination(options.pagination, options.overrides)\n\n // 独立 COUNT 查询\n const countSql = `SELECT COUNT(*) as cnt FROM (${options.sql}) AS t`\n const countRows = await queryRows(countSql, options.params)\n const total = (countRows as Record<string, unknown>[]).length > 0\n ? parseCount((countRows as Record<string, unknown>[])[0])\n : 0\n\n // 数据查询\n const dataSql = `${options.sql} LIMIT ? OFFSET ?`\n const dataParams = [\n ...(options.params ?? []),\n pagination.limit,\n pagination.offset,\n ]\n const rows = await queryRows(dataSql, dataParams)\n\n return buildPaginatedResult(rows as T[], total, pagination)\n}\n","/**\n * @h-ai/reldb — DDL SQL 构建辅助\n *\n * 纯函数集合:生成跨数据库通用的 DDL SQL 片段。\n * Provider 在 raw DdlOperations 实现中调用这些函数生成 SQL,再交由引擎执行。\n * @module reldb-ddl-builder\n */\n\nimport type { ReldbColumnDef, ReldbIndexDef, ReldbTableDef } from '../reldb-types.js'\n\nimport { escapeSqlString, quoteIdentifier } from '../reldb-security.js'\n\n// ─── 列定义构建 ───\n\n/**\n * 列定义 SQL 构建选项\n *\n * 各 Provider 通过不同选项控制方言差异(类型映射、主键内联方式等)。\n * @example 模块内部上下文\n * ```ts\n * const options: ColumnSqlOptions = { quoteId: quoteIdentifier, mapType: def => def.type, inlinePrimaryKey: true }\n * void options\n * ```\n */\nexport interface ColumnSqlOptions {\n /** 标识符引用函数 */\n quoteId: (n: string) => string\n /** ColumnType → SQL 类型字符串 */\n mapType: (def: ReldbColumnDef) => string\n /** 是否在列定义中内联 PRIMARY KEY(SQLite/PG true,MySQL false) */\n inlinePrimaryKey: boolean\n /** 自定义约束附加(返回额外 SQL 片段数组) */\n extraConstraints?: (def: ReldbColumnDef) => string[]\n /** 默认值格式化覆盖(返回 undefined 走通用逻辑,返回 null 跳过默认值) */\n formatDefault?: (def: ReldbColumnDef) => string | null | undefined\n}\n\n/**\n * 通用 buildColumnSql 骨架\n *\n * 各 Provider 仅提供 typeMap 和 overrides 即可。\n * @param name - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param def - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param options - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * const sql = buildColumnSqlBase('name', { type: 'TEXT', notNull: true }, { quoteId: quoteIdentifier, mapType: def => def.type, inlinePrimaryKey: true })\n * void sql\n * ```\n */\nexport function buildColumnSqlBase(\n name: string,\n def: ReldbColumnDef,\n options: ColumnSqlOptions,\n): string {\n const parts: string[] = [\n options.quoteId(name),\n ]\n\n parts.push(options.mapType(def))\n\n if (options.inlinePrimaryKey && def.primaryKey) {\n parts.push('PRIMARY KEY')\n }\n\n // 额外约束(如 AUTOINCREMENT、AUTO_INCREMENT、NOT NULL for PK 等)\n if (options.extraConstraints) {\n parts.push(...options.extraConstraints(def))\n }\n\n if (def.notNull && !def.primaryKey) {\n parts.push('NOT NULL')\n }\n\n if (def.unique && !def.primaryKey) {\n parts.push('UNIQUE')\n }\n\n // 默认值\n if (def.defaultValue !== undefined) {\n const custom = options.formatDefault?.(def)\n if (custom === null) {\n // null 表示跳过默认值(如 MySQL autoIncrement)\n }\n else if (custom !== undefined) {\n parts.push(custom)\n }\n else if (def.defaultValue === null) {\n parts.push('DEFAULT NULL')\n }\n else if (typeof def.defaultValue === 'string') {\n if (def.defaultValue.startsWith('(') && def.defaultValue.endsWith(')')) {\n parts.push(`DEFAULT ${def.defaultValue}`)\n }\n else {\n parts.push(`DEFAULT '${escapeSqlString(def.defaultValue)}'`)\n }\n }\n else {\n parts.push(`DEFAULT ${def.defaultValue}`)\n }\n }\n\n // 外键引用(内联模式)\n if (options.inlinePrimaryKey && def.references) {\n parts.push(`REFERENCES ${quoteIdentifier(def.references.table)}(${quoteIdentifier(def.references.column)})`)\n if (def.references.onDelete) {\n parts.push(`ON DELETE ${def.references.onDelete}`)\n }\n if (def.references.onUpdate) {\n parts.push(`ON UPDATE ${def.references.onUpdate}`)\n }\n }\n\n return parts.join(' ')\n}\n\n// ─── 表级 DDL SQL ───\n\n/**\n * 默认 CREATE TABLE SQL 生成(SQLite / PostgreSQL 通用)\n *\n * 列定义内联主键和外键,无额外子句。\n * @param buildColumnSql - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param quotedTable - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param columns - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param ifNotExists - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * const sql = buildDefaultCreateTableSql((name, def) => buildColumnSqlBase(name, def, { quoteId: quoteIdentifier, mapType: value => value.type, inlinePrimaryKey: true }), quoteIdentifier('users'), { id: { type: 'TEXT', primaryKey: true } }, true)\n * void sql\n * ```\n */\nexport function buildDefaultCreateTableSql(\n buildColumnSql: (name: string, def: ReldbColumnDef) => string,\n quotedTable: string,\n columns: ReldbTableDef,\n ifNotExists: boolean,\n): string {\n const columnDefs = Object.entries(columns)\n .map(([name, def]) => buildColumnSql(name, def))\n .join(', ')\n const ifNotExistsClause = ifNotExists ? 'IF NOT EXISTS ' : ''\n return `CREATE TABLE ${ifNotExistsClause}${quotedTable} (${columnDefs})`\n}\n\n/**\n * 默认 CREATE INDEX SQL 生成(SQLite / PostgreSQL 通用)\n *\n * 支持 IF NOT EXISTS 与 WHERE 子句。\n * @param quoteId - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param quotedTable - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param quotedIndex - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param indexDef - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * const sql = buildDefaultCreateIndexSql(quoteIdentifier, quoteIdentifier('users'), quoteIdentifier('users_name_idx'), { columns: ['name'] })\n * void sql\n * ```\n */\nexport function buildDefaultCreateIndexSql(\n quoteId: (name: string) => string,\n quotedTable: string,\n quotedIndex: string,\n indexDef: ReldbIndexDef,\n): string {\n const uniqueClause = indexDef.unique ? 'UNIQUE ' : ''\n const columns = indexDef.columns.map(c => quoteId(c)).join(', ')\n const whereClause = indexDef.where\n ? ` WHERE ${indexDef.where}`\n : ''\n return `CREATE ${uniqueClause}INDEX IF NOT EXISTS ${quotedIndex} ON ${quotedTable} (${columns})${whereClause}`\n}\n\n/**\n * 默认 RENAME TABLE SQL 生成(SQLite / PostgreSQL 通用)\n * @param quotedOld - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param quotedNew - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * void buildDefaultRenameTableSql(quoteIdentifier('users_old'), quoteIdentifier('users'))\n * ```\n */\nexport function buildDefaultRenameTableSql(quotedOld: string, quotedNew: string): string {\n return `ALTER TABLE ${quotedOld} RENAME TO ${quotedNew}`\n}\n\n/**\n * 默认 DROP INDEX SQL 生成(SQLite / PostgreSQL 通用)\n * @param quoteId - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param indexName - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param ifExists - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * void buildDefaultDropIndexSql(quoteIdentifier, 'users_name_idx', true)\n * ```\n */\nexport function buildDefaultDropIndexSql(\n quoteId: (name: string) => string,\n indexName: string,\n ifExists: boolean,\n): string {\n const ifExistsClause = ifExists ? 'IF EXISTS ' : ''\n return `DROP INDEX ${ifExistsClause}${quoteId(indexName)}`\n}\n","/**\n * @h-ai/reldb — MySQL Provider\n *\n * 基于 mysql2 的 MySQL 数据库实现。\n * 按 Context + wrapOp → Factory 模式实现。\n * @module reldb-provider-mysql\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type { PoolConnection as MysqlConnection, Pool as MysqlPool, ResultSetHeader } from 'mysql2/promise'\nimport type { MysqlPoolConfig, ReldbConfig } from '../reldb-config.js'\nimport type {\n DdlOperations,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n PaginationQueryOptions,\n ReldbColumnDef,\n} from '../reldb-types.js'\nimport type { ReldbOpsContext } from './reldb-provider-base.js'\nimport type { ReldbProvider } from './reldb-provider-types.js'\n\nimport { createRequire } from 'node:module'\nimport { isIP } from 'node:net'\nimport { performance } from 'node:perf_hooks'\nimport { core, err, ok } from '@h-ai/core'\nimport { MysqlPoolConfigSchema } from '../reldb-config.js'\nimport { reldbM } from '../reldb-i18n.js'\nimport { HaiReldbError } from '../reldb-types.js'\n\nimport {\n buildColumnSqlBase,\n} from './reldb-ddl-builder.js'\nimport { createBaseCrudManager, createBaseDdlOps, createBaseDmlOps, createBaseTxManager, queryPageAsync } from './reldb-provider-base.js'\nimport { createTxHandle } from './reldb-tx-assembler.js'\n\nconst logger = core.logger.child({ module: 'reldb', scope: 'mysql' })\n\n/**\n * 借用真实驱动连接及其容量槽位;超时只约束借用完成前,不中止已启动 SQL。\n * @example 模块内部上下文\n * ```ts\n * async function ready(lease: MysqlConnectionLease) {\n * try { return await lease.connection.query('SELECT 1') } finally { lease.release() }\n * }\n * ```\n */\ninterface MysqlConnectionLease {\n connection: MysqlConnection\n deadline: number\n release: () => void\n}\n\n/**\n * 可取消的 FIFO 排队项;进入驱动前可直接移除,绝不留在 mysql2 内部队列。\n * @example 模块内部上下文\n * ```ts\n * function cancel(waiter: MysqlConnectionWaiter) {\n * waiter.cancel() // 超时后不能再转交给 mysql2 排队。\n * }\n * ```\n */\ninterface MysqlConnectionWaiter {\n start: () => void\n cancel: () => void\n}\n\n// ─── MySQL Provider 实现 ───\n\n/**\n * 创建 MySQL Provider 实例\n *\n * @returns MySQL Provider\n * @example 模块内部上下文\n * ```ts\n * const provider = createMysqlProvider()\n * const closed = await provider.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * ```\n */\nexport function createMysqlProvider(): ReldbProvider {\n /** 连接池实例 */\n let pool: MysqlPool | null = null\n /** 只有健康检查完成的连接才可供业务使用;清理失败仍保留底层资源。 */\n let ready = false\n let closing: Promise<HaiResult<void>> | null = null\n let poolConfig: MysqlPoolConfig | null = null\n let activeSlots = 0\n let slotsDrained: Promise<void> = Promise.resolve()\n let resolveSlots: (() => void) | null = null\n const waiters: MysqlConnectionWaiter[] = []\n let currentConfig: ReldbConfig | null = null\n\n /** 归还槽位后只启动未取消的队首请求;在途建连即使已超时也须结算后才能腾出槽位。 */\n function releaseSlot(): void {\n activeSlots--\n if (ready && poolConfig) {\n const maximum = poolConfig.max\n while (waiters.length > 0) {\n if (activeSlots >= maximum)\n break\n waiters.shift()!.start()\n }\n }\n if (activeSlots === 0) {\n resolveSlots?.()\n resolveSlots = null\n }\n }\n\n /**\n * 在唯一截止期限内借用连接;SDK 不排队,超时排队项立即删除,迟到连接只释放而不执行 SQL。\n *\n * 已进入驱动的建连不能由 mysql2 Promise API 取消,因此保留槽位直到它完成/失败。\n * close 等待这些有限建连结算,驱动 connectTimeout 与 acquireTimeout 相同。\n */\n function acquireConnection(): Promise<HaiResult<MysqlConnectionLease>> {\n const owned = pool\n const limits = poolConfig\n if (!ready || !owned || !limits)\n return Promise.resolve(err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized')))\n if (activeSlots >= limits.max && waiters.length >= limits.queueLimit)\n return Promise.resolve(err(HaiReldbError.POOL_EXHAUSTED, reldbM('reldb_mysqlPoolQueueFull')))\n\n const deadline = performance.now() + limits.acquireTimeout\n return new Promise((resolve) => {\n let completed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeoutResult = () => err(HaiReldbError.TIMEOUT, reldbM('reldb_mysqlPoolAcquireTimeout'))\n const finish = (result: HaiResult<MysqlConnectionLease>) => {\n if (completed)\n return\n completed = true\n clearTimeout(timer)\n resolve(result)\n }\n const waiter: MysqlConnectionWaiter = {\n cancel: () => finish(err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized'))),\n start: () => {\n if (!ready || performance.now() >= deadline) {\n finish(ready\n ? timeoutResult()\n : err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized')))\n return\n }\n if (activeSlots++ === 0)\n slotsDrained = new Promise<void>((resolve) => { resolveSlots = resolve })\n // 独立处理失败分支,避免 Promise.race 遗留一个会在后台继续执行的连接借用。\n void Promise.resolve().then(() => owned.getConnection()).then((connection) => {\n if (completed || !ready || performance.now() >= deadline) {\n try {\n connection.release()\n }\n finally { releaseSlot() }\n finish(ready\n ? timeoutResult()\n : err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized')))\n return\n }\n let released = false\n finish(ok({\n connection,\n deadline,\n release: () => {\n if (released)\n return\n released = true\n try {\n connection.release()\n }\n finally { releaseSlot() }\n },\n }))\n }, (error) => {\n releaseSlot()\n finish(err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_mysqlConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error))\n }).catch((error) => {\n // 迟到连接清理异常时停止新业务,保留池供 close 重试,不泄露驱动错误。\n ready = false\n finish(err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_mysqlConnectionFailed', {\n params: {\n error: reldbM('reldb_mysqlPoolReleaseFailed'),\n },\n }), error))\n logger.warn('MySQL connection release failed; pool requires cleanup')\n })\n },\n }\n timer = setTimeout(() => {\n const index = waiters.indexOf(waiter)\n if (index >= 0)\n waiters.splice(index, 1)\n finish(timeoutResult())\n }, limits.acquireTimeout)\n if (activeSlots < limits.max)\n waiter.start()\n else\n waiters.push(waiter)\n })\n }\n\n /** 所有池级 SQL/DDL 都先借用并归还连接,不能绕过获取超时或容量限制。 */\n async function withConnection<T>(fn: (connection: MysqlConnection) => Promise<HaiResult<T>>): Promise<HaiResult<T>> {\n const acquired = await acquireConnection()\n if (!acquired.success)\n return acquired\n try {\n if (!ready)\n return err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized'))\n if (performance.now() >= acquired.data.deadline)\n return err(HaiReldbError.TIMEOUT, reldbM('reldb_mysqlPoolAcquireTimeout'))\n return await fn(acquired.data.connection)\n }\n finally { acquired.data.release() }\n }\n\n /** 保留所有权直到释放成功;合并并发关闭且立即阻止新操作。 */\n function closeResource(): Promise<HaiResult<void>> {\n ready = false\n currentConfig = null\n for (const waiter of waiters.splice(0))\n waiter.cancel()\n if (closing)\n return closing\n const owned = pool\n if (!owned)\n return Promise.resolve(ok(undefined))\n closing = (async (): Promise<HaiResult<void>> => {\n try {\n await slotsDrained\n await owned.end()\n pool = null\n poolConfig = null\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_mysqlConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n })().finally(() => { closing = null })\n return closing\n }\n\n // ─── 操作上下文 ───\n\n const ctx: ReldbOpsContext = {\n isConnected: () => ready && pool !== null,\n logger,\n operationLog: () => currentConfig?.operationLog,\n }\n\n // ─── 辅助函数 ───\n\n /** MySQL 标识符引用(反引号) */\n function mysqlQuoteId(name: string): string {\n return `\\`${name}\\``\n }\n\n /** 事务错误消息生成 */\n function mysqlTxErrorMessage(detail: string): string {\n return reldbM('reldb_mysqlTxFailed', {\n params: { error: detail },\n })\n }\n\n /**\n * 根据索引名解析所在表\n *\n * MySQL 的 `DROP INDEX` 语句需要表名,因此通过 INFORMATION_SCHEMA\n * 在当前数据库中查找索引所属表。\n */\n async function findIndexTableName(\n indexName: string,\n ): Promise<HaiResult<string | null>> {\n return withConnection(async (connection) => {\n const [rows] = await connection.query(\n 'SELECT TABLE_NAME as name FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND INDEX_NAME = ? LIMIT 1',\n [indexName],\n )\n const data = rows as Array<{ name: string }>\n return ok(data[0]?.name ?? null)\n })\n }\n\n // ─── MySQL 方言辅助 ───\n\n /** MySQL 列类型映射 */\n function mapMysqlType(def: ReldbColumnDef): string {\n switch (def.type) {\n case 'TEXT':\n return 'VARCHAR(255)'\n case 'INTEGER':\n return def.autoIncrement ? 'BIGINT' : 'INT'\n case 'BIGINT':\n return 'BIGINT'\n case 'REAL':\n return 'DOUBLE'\n case 'BLOB':\n return 'BLOB'\n case 'BOOLEAN':\n return 'TINYINT(1)'\n case 'TIMESTAMP':\n return 'DATETIME'\n case 'JSON':\n return 'JSON'\n default:\n return 'TEXT'\n }\n }\n\n /** MySQL buildColumnSql */\n function mysqlBuildColumnSql(name: string, def: ReldbColumnDef): string {\n return buildColumnSqlBase(name, def, {\n quoteId: mysqlQuoteId,\n mapType: mapMysqlType,\n inlinePrimaryKey: false,\n extraConstraints: (d) => {\n const extras: string[] = []\n // MySQL 主键需要显式 NOT NULL(base 的 notNull 检查排除了 primaryKey)\n if (d.primaryKey)\n extras.push('NOT NULL')\n if (d.autoIncrement)\n extras.push('AUTO_INCREMENT')\n return extras\n },\n formatDefault: (d) => {\n if (d.defaultValue === undefined)\n return undefined\n if (d.autoIncrement)\n return null // 跳过 autoIncrement 列的默认值\n if (typeof d.defaultValue === 'string'\n && (d.defaultValue === 'NOW()' || d.defaultValue === 'CURRENT_TIMESTAMP')) {\n return `DEFAULT ${d.defaultValue}`\n }\n if (typeof d.defaultValue === 'boolean') {\n return `DEFAULT ${d.defaultValue ? 1 : 0}`\n }\n return undefined // 走通用逻辑\n },\n })\n }\n\n /** MySQL CREATE TABLE(含 PRIMARY KEY、FOREIGN KEY、ENGINE) */\n function mysqlBuildCreateTableSql(quotedTable: string, columns: Record<string, ReldbColumnDef>, ifNotExists: boolean): string {\n const columnDefs: string[] = []\n let primaryKeyCol: string | null = null\n\n for (const [name, def] of Object.entries(columns)) {\n columnDefs.push(mysqlBuildColumnSql(name, def))\n if (def.primaryKey) {\n primaryKeyCol = name\n }\n }\n\n if (primaryKeyCol) {\n columnDefs.push(`PRIMARY KEY (${mysqlQuoteId(primaryKeyCol)})`)\n }\n\n // 外键约束\n for (const [name, def] of Object.entries(columns)) {\n if (def.references) {\n let fkSql = `FOREIGN KEY (${mysqlQuoteId(name)}) REFERENCES ${mysqlQuoteId(def.references.table)}(${mysqlQuoteId(def.references.column)})`\n if (def.references.onDelete) {\n fkSql += ` ON DELETE ${def.references.onDelete}`\n }\n if (def.references.onUpdate) {\n fkSql += ` ON UPDATE ${def.references.onUpdate}`\n }\n columnDefs.push(fkSql)\n }\n }\n\n const ifNotExistsClause = ifNotExists ? 'IF NOT EXISTS ' : ''\n return `CREATE TABLE ${ifNotExistsClause}${quotedTable} (${columnDefs.join(', ')}) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4`\n }\n\n // ─── DDL 操作 ───\n\n /** 单条 DDL 共享池借用边界,释放在 finally 内完成。 */\n function executeDdl(sql: string): Promise<HaiResult<void>> {\n return withConnection(async (connection) => {\n await connection.query(sql)\n return ok(undefined)\n })\n }\n\n const rawDdl: DdlOperations = {\n async createTable(name, columns, ifNotExists = true) {\n const quotedTable = mysqlQuoteId(name)\n const sql = mysqlBuildCreateTableSql(quotedTable, columns, ifNotExists)\n return executeDdl(sql)\n },\n async dropTable(name, ifExists) {\n const ifExistsClause = ifExists ? 'IF EXISTS ' : ''\n return executeDdl(`DROP TABLE ${ifExistsClause}${mysqlQuoteId(name)}`)\n },\n async addColumn(table, column, def) {\n const colSql = mysqlBuildColumnSql(column, def)\n return executeDdl(`ALTER TABLE ${mysqlQuoteId(table)} ADD COLUMN ${colSql}`)\n },\n async dropColumn(table, column) {\n return executeDdl(`ALTER TABLE ${mysqlQuoteId(table)} DROP COLUMN ${mysqlQuoteId(column)}`)\n },\n async renameTable(oldName, newName) {\n return executeDdl(`RENAME TABLE ${mysqlQuoteId(oldName)} TO ${mysqlQuoteId(newName)}`)\n },\n async createIndex(table, index, def) {\n const uniqueClause = def.unique ? 'UNIQUE ' : ''\n const columns = def.columns.map(c => mysqlQuoteId(c)).join(', ')\n return executeDdl(`CREATE ${uniqueClause}INDEX ${mysqlQuoteId(index)} ON ${mysqlQuoteId(table)} (${columns})`)\n },\n async dropIndex(index, ifExists) {\n const tableResult = await findIndexTableName(index)\n if (!tableResult.success)\n return tableResult\n\n if (!tableResult.data) {\n if (ifExists)\n return ok(undefined)\n return err(HaiReldbError.DDL_FAILED, reldbM('reldb_ddlFailed', {\n params: { error: `index not found: ${index}` },\n }))\n }\n\n return executeDdl(`DROP INDEX ${mysqlQuoteId(index)} ON ${mysqlQuoteId(tableResult.data)}`)\n },\n async raw(sql) {\n return executeDdl(sql)\n },\n }\n\n // ─── DML 操作 ───\n\n const rawDml: DmlOperations = {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n return withConnection(async (connection) => {\n const [rows]: [unknown, unknown] = await connection.query(sql, params)\n return ok(rows as T[])\n })\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n return withConnection(async (connection) => {\n const [rows]: [unknown, unknown] = await connection.query(sql, params)\n return ok(((rows as unknown[])[0] as T) ?? null)\n })\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n return withConnection(async (connection) => {\n const [result] = await connection.execute<ResultSetHeader>({ sql, values: params })\n return ok({ changes: result.affectedRows, lastInsertRowid: result.insertId })\n })\n },\n async batch(statements) {\n return withConnection(async (connection) => {\n try {\n await connection.beginTransaction()\n for (const { sql: s, params } of statements) {\n await connection.execute({ sql: s, values: params })\n }\n await connection.commit()\n return ok(undefined)\n }\n catch (error) {\n await connection.rollback().catch(() => { })\n return err(HaiReldbError.QUERY_FAILED, reldbM('reldb_batchFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n })\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n return withConnection(async (connection) => {\n const result = await queryPageAsync<T>(\n async (sql, params) => {\n const [rows] = await connection.query(sql, params)\n return rows as unknown[]\n },\n options,\n )\n return ok(result)\n })\n },\n }\n\n // ─── 事务 ───\n\n /** 创建事务连接上的 DML 操作 */\n function createMysqlTxDmlOps(conn: MysqlConnection): DmlOperations {\n return {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n const [rows]: [unknown, unknown] = await conn.query(sql, params)\n return ok(rows as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const [rows]: [unknown, unknown] = await conn.query(sql, params)\n return ok(((rows as unknown[])[0] as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const [result] = await conn.execute<ResultSetHeader>({ sql, values: params })\n return ok({ changes: result.affectedRows, lastInsertRowid: result.insertId })\n },\n async batch(statements) {\n for (const { sql: s, params } of statements) {\n await conn.execute({ sql: s, values: params })\n }\n return ok(undefined)\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const result = await queryPageAsync<T>(\n async (sql, params) => {\n const [rows] = await conn.query(sql, params)\n return rows as unknown[]\n },\n options,\n )\n return ok(result)\n },\n }\n }\n\n async function beginTx(): Promise<HaiResult<DmlWithTxOperations>> {\n const acquired = await acquireConnection()\n if (!acquired.success)\n return acquired\n let connection: MysqlConnection | null = acquired.data.connection\n try {\n if (!ready || performance.now() >= acquired.data.deadline) {\n acquired.data.release()\n return ready\n ? err(HaiReldbError.TIMEOUT, reldbM('reldb_mysqlPoolAcquireTimeout'))\n : err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized'))\n }\n await connection.beginTransaction()\n }\n catch (error) {\n acquired.data.release()\n return err(HaiReldbError.TRANSACTION_FAILED, mysqlTxErrorMessage(String(error)), error)\n }\n\n const txDmlOps = createMysqlTxDmlOps(connection)\n const guardedTxDmlOps = createBaseDmlOps({\n ...ctx,\n isConnected: () => connection !== null,\n }, txDmlOps)\n return ok(createTxHandle(guardedTxDmlOps, {\n commit: async () => { await connection!.commit() },\n rollback: async () => { await connection!.rollback() },\n release: () => {\n try {\n acquired.data.release()\n }\n finally {\n connection = null\n }\n },\n errorMessage: mysqlTxErrorMessage,\n }))\n }\n\n // ─── 组装 Provider ───\n\n const dmlOps = createBaseDmlOps(ctx, rawDml)\n\n return {\n async connect(config: ReldbConfig): Promise<HaiResult<void>> {\n if (config.type !== 'mysql') {\n return err(HaiReldbError.UNSUPPORTED_TYPE, reldbM('reldb_mysqlOnlyMysql'))\n }\n const previousCleanup = await closeResource()\n if (!previousCleanup.success)\n return previousCleanup\n const host = config.url\n ? new URL(config.url).hostname\n : config.host\n if (config.ssl && config.ssl.rejectUnauthorized && config.ssl.verifyIdentity && isIP(host.replace(/^\\[|\\]$/g, ''))) {\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_mysqlTlsDnsRequired'))\n }\n if (config.ssl && (!config.ssl.rejectUnauthorized || !config.ssl.verifyIdentity)) {\n logger.warn('MySQL TLS server verification is explicitly disabled', {\n certificateVerification: config.ssl.rejectUnauthorized,\n hostnameVerification: config.ssl.rejectUnauthorized && config.ssl.verifyIdentity,\n })\n }\n try {\n // Node ESM 按需加载驱动,避免构建器生成无法执行的动态 require。\n const mysql = createRequire(import.meta.url)('mysql2/promise')\n\n poolConfig = config.pool ?? MysqlPoolConfigSchema.parse({})\n pool = mysql.createPool({\n // mysql2 会用非空的分字段覆盖 URI;URL 模式不能传 schema 默认 host 或冲突字段。\n ...(config.url\n ? { uri: config.url }\n : {\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n }),\n ssl: config.ssl,\n connectionLimit: poolConfig.max,\n // 排队由本 Provider 管理,超时项可直接移除;驱动绝不保留取消后的等待者。\n waitForConnections: false,\n connectTimeout: poolConfig.acquireTimeout,\n charset: config.mysql?.charset ?? 'utf8mb4',\n }) as MysqlPool\n\n // 验证连接可用性\n await pool.query('SELECT 1')\n\n ready = true\n currentConfig = config\n logger.info('Connected to MySQL', config.url\n ? {\n target: core.sanitize.sanitizeUrl(config.url),\n }\n : { host: config.host, port: config.port, database: config.database })\n return ok(undefined)\n }\n catch (error) {\n const cleanup = await closeResource()\n const result = err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_mysqlConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n return cleanup.success || result.success\n ? result\n : err({\n ...result.error,\n ext: { cleanupPending: true, cleanupError: cleanup.error },\n })\n }\n },\n\n close: closeResource,\n\n isConnected: () => ctx.isConnected(),\n ddl: createBaseDdlOps(ctx, rawDdl),\n sql: dmlOps,\n crud: createBaseCrudManager(dmlOps),\n tx: createBaseTxManager(ctx, beginTx),\n }\n}\n","/**\n * @h-ai/reldb — PostgreSQL Provider\n *\n * 基于 pg 的 PostgreSQL 数据库实现。\n * 按 Context + wrapOp → Factory 模式实现。\n * @module reldb-provider-postgres\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type { ReldbConfig } from '../reldb-config.js'\nimport type {\n DdlOperations,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n PaginationQueryOptions,\n ReldbColumnDef,\n} from '../reldb-types.js'\nimport type { ReldbOpsContext } from './reldb-provider-base.js'\nimport type { ReldbProvider } from './reldb-provider-types.js'\n\nimport { createRequire } from 'node:module'\nimport { setTimeout as delay } from 'node:timers/promises'\nimport { core, err, ok } from '@h-ai/core'\nimport { reldbM } from '../reldb-i18n.js'\nimport { quoteIdentifier } from '../reldb-security.js'\nimport { HaiReldbError } from '../reldb-types.js'\nimport {\n buildColumnSqlBase,\n buildDefaultCreateIndexSql,\n buildDefaultCreateTableSql,\n buildDefaultDropIndexSql,\n buildDefaultRenameTableSql,\n} from './reldb-ddl-builder.js'\nimport { createBaseCrudManager, createBaseDdlOps, createBaseDmlOps, createBaseTxManager, queryPageAsync } from './reldb-provider-base.js'\nimport { createTxHandle } from './reldb-tx-assembler.js'\n\nconst logger = core.logger.child({ module: 'reldb', scope: 'postgres' })\n\n/** PostgreSQL 美元引号起始标记匹配(提至模块作用域避免每次调用重建) */\nconst PG_DOLLAR_TAG_REGEX = /^\\$([A-Z_]\\w*)?\\$/i\n\n// ─── pg 类型定义(避免强依赖) ───\n\n/**\n * PostgreSQL 连接池接口\n * @example 模块内部上下文\n * ```ts\n * async function ready(pool: PgPool) {\n * const client = await pool.connect()\n * try { return await client.query('SELECT 1') } finally { client.release() }\n * }\n * ```\n */\ninterface PgPool {\n query: (text: string, values?: unknown[]) => Promise<{ rows: unknown[], rowCount: number }>\n connect: () => Promise<PgClient>\n end: () => Promise<void>\n on: (event: 'error', listener: (error: unknown) => void) => void\n}\n\n/**\n * PostgreSQL 客户端接口\n * @example 模块内部上下文\n * ```ts\n * async function ready(client: PgClient) {\n * try { return await client.query('SELECT 1') } finally { client.release() }\n * }\n * ```\n */\ninterface PgClient {\n query: (text: string, values?: unknown[]) => Promise<{ rows: unknown[], rowCount: number }>\n release: () => void\n}\n\n// ─── PostgreSQL Provider 实现 ───\n\n/**\n * 创建 PostgreSQL Provider 实例\n *\n * @returns PostgreSQL Provider\n * @example 模块内部上下文\n * ```ts\n * const provider = createPostgresProvider()\n * const closed = await provider.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * ```\n */\nexport function createPostgresProvider(): ReldbProvider {\n /** 连接池实例 */\n let pool: PgPool | null = null\n /** 只有健康检查完成的连接才可供业务使用;清理失败仍保留底层资源。 */\n let ready = false\n let closing: Promise<HaiResult<void>> | null = null\n let activeTransactions = 0\n let transactionsDrained: Promise<void> = Promise.resolve()\n let resolveTransactions: (() => void) | null = null\n\n /** 在获取连接前登记事务,关闭时等待其提交/回滚并归还连接。 */\n function retainTransaction(): () => void {\n if (activeTransactions++ === 0)\n transactionsDrained = new Promise<void>((resolve) => { resolveTransactions = resolve })\n return () => {\n if (--activeTransactions === 0) {\n resolveTransactions?.()\n resolveTransactions = null\n }\n }\n }\n let currentConfig: ReldbConfig | null = null\n\n /** 保留所有权直到释放成功;合并并发关闭且立即阻止新操作。 */\n function closeResource(): Promise<HaiResult<void>> {\n ready = false\n currentConfig = null\n if (closing)\n return closing\n const owned = pool\n if (!owned)\n return Promise.resolve(ok(undefined))\n closing = (async (): Promise<HaiResult<void>> => {\n try {\n await transactionsDrained\n await owned.end()\n pool = null\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_postgresConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n })().finally(() => { closing = null })\n return closing\n }\n\n // ─── 操作上下文 ───\n\n const ctx: ReldbOpsContext = {\n isConnected: () => ready && pool !== null,\n logger,\n operationLog: () => currentConfig?.operationLog,\n }\n\n // ─── 辅助函数 ───\n\n /**\n * 将 ? 占位符转换为 PostgreSQL 的 $1, $2, ... 格式\n *\n * 需要跳过字符串字面量(单/双引号)、美元引号块($tag$...$tag$)以及行/块注释中的 `?`,\n * 避免 `SELECT 'a?b' WHERE x=?` 被错误重写为 `SELECT 'a$1' WHERE x=$2`。\n */\n function convertPlaceholders(sql: string): string {\n let out = ''\n let index = 0\n let i = 0\n const len = sql.length\n\n while (i < len) {\n const ch = sql[i]\n\n // 单引号字符串(含 SQL 标准 '' 转义)\n if (ch === '\\'') {\n out += ch\n i++\n while (i < len) {\n const c = sql[i]\n out += c\n i++\n if (c === '\\'') {\n if (sql[i] === '\\'') {\n out += sql[i]\n i++\n continue\n }\n break\n }\n }\n continue\n }\n\n // 双引号标识符(含 \"\" 转义)\n if (ch === '\"') {\n out += ch\n i++\n while (i < len) {\n const c = sql[i]\n out += c\n i++\n if (c === '\"') {\n if (sql[i] === '\"') {\n out += sql[i]\n i++\n continue\n }\n break\n }\n }\n continue\n }\n\n // PostgreSQL 美元引号:$tag$ ... $tag$ 或 $$ ... $$\n if (ch === '$') {\n const tagMatch = sql.slice(i).match(PG_DOLLAR_TAG_REGEX)\n if (tagMatch) {\n const tag = tagMatch[0]\n const end = sql.indexOf(tag, i + tag.length)\n if (end === -1) {\n out += sql.slice(i)\n i = len\n }\n else {\n out += sql.slice(i, end + tag.length)\n i = end + tag.length\n }\n continue\n }\n }\n\n // 单行注释 -- ... \\n\n if (ch === '-' && sql[i + 1] === '-') {\n const nl = sql.indexOf('\\n', i)\n if (nl === -1) {\n out += sql.slice(i)\n i = len\n }\n else {\n out += sql.slice(i, nl + 1)\n i = nl + 1\n }\n continue\n }\n\n // 块注释 /* ... */(支持简单嵌套处理:按首个结束标记终止)\n if (ch === '/' && sql[i + 1] === '*') {\n const endIdx = sql.indexOf('*/', i + 2)\n if (endIdx === -1) {\n out += sql.slice(i)\n i = len\n }\n else {\n out += sql.slice(i, endIdx + 2)\n i = endIdx + 2\n }\n continue\n }\n\n // 占位符替换\n if (ch === '?') {\n out += `$${++index}`\n i++\n continue\n }\n\n out += ch\n i++\n }\n\n return out\n }\n\n /** 事务错误消息生成 */\n function pgTxErrorMessage(detail: string): string {\n return reldbM('reldb_postgresTxFailed', {\n params: { error: detail },\n })\n }\n\n // ─── PostgreSQL 方言辅助 ───\n\n /** PostgreSQL 列类型映射 */\n function mapPgType(def: ReldbColumnDef): string {\n switch (def.type) {\n case 'TEXT':\n return 'TEXT'\n case 'INTEGER':\n return def.autoIncrement ? 'BIGSERIAL' : 'INTEGER'\n case 'BIGINT':\n return 'BIGINT'\n case 'REAL':\n return 'DOUBLE PRECISION'\n case 'BLOB':\n return 'BYTEA'\n case 'BOOLEAN':\n return 'BOOLEAN'\n case 'TIMESTAMP':\n return 'TIMESTAMP'\n case 'JSON':\n return 'JSONB'\n default:\n return 'TEXT'\n }\n }\n\n /** PostgreSQL buildColumnSql */\n function pgBuildColumnSql(name: string, def: ReldbColumnDef): string {\n return buildColumnSqlBase(name, def, {\n quoteId: quoteIdentifier,\n mapType: mapPgType,\n inlinePrimaryKey: true,\n formatDefault: (d) => {\n if (d.defaultValue === undefined)\n return undefined\n if (typeof d.defaultValue === 'string'\n && (d.defaultValue === 'NOW()' || d.defaultValue === 'CURRENT_TIMESTAMP')) {\n return `DEFAULT ${d.defaultValue}`\n }\n return undefined // 走通用逻辑\n },\n })\n }\n\n /** 通用 pg queryFn → rows 适配 */\n async function pgQueryRows(\n queryFn: (text: string, values?: unknown[]) => Promise<{ rows: unknown[], rowCount: number }>,\n sql: string,\n params?: unknown[],\n ): Promise<unknown[]> {\n const result = await queryFn(convertPlaceholders(sql), params)\n return result.rows\n }\n\n /** 仅重试自动提交、单条幂等建表/索引的 PostgreSQL 系统目录竞争。事务失败须由调用方回滚。 */\n async function executeStatement(sql: string, params?: unknown[]) {\n try {\n return await pool!.query(sql, params)\n }\n catch (error) {\n const kind = /^\\s*CREATE\\s+(TABLE|(?:UNIQUE\\s+)?INDEX)\\s+IF\\s+NOT\\s+EXISTS\\s+/i.exec(sql)?.[1]?.toUpperCase()\n const single = !sql.trim().replace(/;$/, '').includes(';')\n const catalogConflict = typeof error === 'object' && error !== null && 'code' in error && (\n (error.code === '23505' && 'schema' in error && error.schema === 'pg_catalog'\n && 'constraint' in error && (error.constraint === 'pg_class_relname_nsp_index' || (kind === 'TABLE' && error.constraint === 'pg_type_typname_nsp_index')))\n // 并发提交可能在系统目录检查之间触发重复关系或类型错误,此路径没有 schema/constraint。\n || (kind === 'TABLE' && 'routine' in error && (\n (error.routine === 'heap_create_with_catalog' && (error.code === '42P07' || error.code === '42710'))\n || (error.routine === 'TypeCreate' && error.code === '42710')\n ))\n )\n if (!kind || !single || !catalogConflict)\n throw error\n // 胜者已提交后原语句会命中 IF NOT EXISTS;第二次失败照常交由公共操作包装器返回。\n return pool!.query(sql, params)\n }\n }\n\n // ─── DDL 操作 ───\n\n const rawDdl: DdlOperations = {\n async createTable(name, columns, ifNotExists = true) {\n const quotedTable = quoteIdentifier(name)\n const sql = buildDefaultCreateTableSql(pgBuildColumnSql, quotedTable, columns, ifNotExists)\n await executeStatement(sql)\n return ok(undefined)\n },\n async dropTable(name, ifExists) {\n const ifExistsClause = ifExists ? 'IF EXISTS ' : ''\n await pool!.query(`DROP TABLE ${ifExistsClause}${quoteIdentifier(name)}`)\n return ok(undefined)\n },\n async addColumn(table, column, def) {\n const colSql = pgBuildColumnSql(column, def)\n await pool!.query(`ALTER TABLE ${quoteIdentifier(table)} ADD COLUMN ${colSql}`)\n return ok(undefined)\n },\n async dropColumn(table, column) {\n await pool!.query(`ALTER TABLE ${quoteIdentifier(table)} DROP COLUMN ${quoteIdentifier(column)}`)\n return ok(undefined)\n },\n async renameTable(oldName, newName) {\n await pool!.query(buildDefaultRenameTableSql(quoteIdentifier(oldName), quoteIdentifier(newName)))\n return ok(undefined)\n },\n async createIndex(table, index, def) {\n const sql = buildDefaultCreateIndexSql(quoteIdentifier, quoteIdentifier(table), quoteIdentifier(index), def)\n await executeStatement(sql)\n return ok(undefined)\n },\n async dropIndex(index, ifExists = true) {\n const sql = buildDefaultDropIndexSql(quoteIdentifier, index, ifExists)\n await pool!.query(sql)\n return ok(undefined)\n },\n async raw(sql) {\n await executeStatement(sql)\n return ok(undefined)\n },\n }\n\n // ─── DML 操作 ───\n\n const rawDml: DmlOperations = {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n const rows = await pgQueryRows((t, v) => pool!.query(t, v), sql, params)\n return ok(rows as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const rows = await pgQueryRows((t, v) => pool!.query(t, v), sql, params)\n return ok((rows[0] as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const result = await executeStatement(convertPlaceholders(sql), params)\n return ok({ changes: result.rowCount ?? 0 })\n },\n async batch(statements) {\n let client: PgClient | null = null\n try {\n client = await pool!.connect()\n await client.query('BEGIN')\n for (const { sql: s, params } of statements) {\n await client.query(convertPlaceholders(s), params)\n }\n await client.query('COMMIT')\n return ok(undefined)\n }\n catch (error) {\n if (client) {\n await client.query('ROLLBACK').catch(() => { })\n }\n return err(HaiReldbError.QUERY_FAILED, reldbM('reldb_batchFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n finally {\n if (client) {\n client.release()\n }\n }\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const result = await queryPageAsync<T>(\n async (sql, params) => {\n const r = await pool!.query(convertPlaceholders(sql), params)\n return r.rows\n },\n options,\n )\n return ok(result)\n },\n }\n\n // ─── 事务 ───\n\n /** 创建事务连接上的 DML 操作 */\n function createPgTxDmlOps(client: PgClient): DmlOperations {\n const queryFn = (text: string, values?: unknown[]) => client.query(text, values)\n return {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n const rows = await pgQueryRows(queryFn, sql, params)\n return ok(rows as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const rows = await pgQueryRows(queryFn, sql, params)\n return ok((rows[0] as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const result = await queryFn(convertPlaceholders(sql), params)\n return ok({ changes: result.rowCount ?? 0 })\n },\n async batch(statements) {\n for (const { sql: s, params } of statements) {\n await queryFn(convertPlaceholders(s), params)\n }\n return ok(undefined)\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const result = await queryPageAsync<T>(\n async (sql, params) => {\n const r = await queryFn(convertPlaceholders(sql), params)\n return r.rows\n },\n options,\n )\n return ok(result)\n },\n }\n }\n\n async function beginTx(): Promise<HaiResult<DmlWithTxOperations>> {\n let client: PgClient | null = null\n\n const releaseOwnership = retainTransaction()\n try {\n client = await pool!.connect()\n await client.query('BEGIN')\n }\n catch (error) {\n try {\n client?.release()\n }\n finally { releaseOwnership() }\n return err(HaiReldbError.TRANSACTION_FAILED, pgTxErrorMessage(String(error)), error)\n }\n\n const txDmlOps = createPgTxDmlOps(client)\n const guardedTxDmlOps = createBaseDmlOps({\n ...ctx,\n isConnected: () => client !== null,\n }, txDmlOps)\n return ok(createTxHandle(guardedTxDmlOps, {\n commit: async () => { await client!.query('COMMIT') },\n rollback: async () => { await client!.query('ROLLBACK') },\n release: () => {\n try {\n client!.release()\n }\n finally {\n client = null\n releaseOwnership()\n }\n },\n errorMessage: pgTxErrorMessage,\n }))\n }\n\n // ─── 组装 Provider ───\n\n const dmlOps = createBaseDmlOps(ctx, rawDml)\n\n return {\n async connect(config: ReldbConfig): Promise<HaiResult<void>> {\n if (config.type !== 'postgresql') {\n return err(HaiReldbError.UNSUPPORTED_TYPE, reldbM('reldb_postgresOnlyPostgresql'))\n }\n const previousCleanup = await closeResource()\n if (!previousCleanup.success)\n return previousCleanup\n try {\n // Node ESM 按需加载驱动,避免构建器生成无法执行的动态 require。\n const { Pool } = createRequire(import.meta.url)('pg')\n\n pool = new Pool({\n connectionString: config.url,\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n ssl: config.ssl,\n min: config.pool?.min,\n max: config.pool?.max ?? 10,\n idleTimeoutMillis: config.pool?.idleTimeout,\n connectionTimeoutMillis: config.pool?.acquireTimeout,\n }) as PgPool\n\n // pg-pool 会移除损坏的空闲连接;必须监听 error,避免 EventEmitter 使进程退出。\n // 不记录 error/message/client,驱动错误可能携带 SQL、连接串或服务端敏感细节。\n pool.on('error', (error) => {\n const code = error && typeof error === 'object' && 'code' in error\n && typeof error.code === 'string' && /^[A-Z0-9_]{1,32}$/.test(error.code)\n ? error.code\n : undefined\n logger.warn('PostgreSQL idle connection error; pool will replace connection', {\n code,\n name: error instanceof Error\n ? 'Error'\n : 'UnknownError',\n })\n })\n\n // 新容器网络的 DNS 可能短暂未就绪;仅启动探测的 EAI_AGAIN 有界重试,不重放业务 SQL。\n for (let attempt = 0; ; attempt++) {\n try {\n await pool.query('SELECT 1')\n break\n }\n catch (error) {\n if (attempt >= 2 || typeof error !== 'object' || error === null || !('code' in error) || error.code !== 'EAI_AGAIN')\n throw error\n await delay(250 * (attempt + 1))\n }\n }\n\n ready = true\n currentConfig = config\n logger.info('Connected to PostgreSQL', { host: config.host, port: config.port, database: config.database })\n return ok(undefined)\n }\n catch (error) {\n const cleanup = await closeResource()\n const result = err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_postgresConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n return cleanup.success || result.success\n ? result\n : err({\n ...result.error,\n ext: { cleanupPending: true, cleanupError: cleanup.error },\n })\n }\n },\n\n close: closeResource,\n\n isConnected: () => ctx.isConnected(),\n ddl: createBaseDdlOps(ctx, rawDdl),\n sql: dmlOps,\n crud: createBaseCrudManager(dmlOps),\n tx: createBaseTxManager(ctx, beginTx),\n }\n}\n","/**\n * @h-ai/reldb — SQLite 执行引擎\n *\n * 屏蔽两种执行方式的差异,供 SQLite Provider 统一调用:\n * - 同步引擎(默认):主线程直接持有 better-sqlite3 连接,行为与历史实现完全一致。\n * - worker 引擎:把唯一连接放进专用 worker 线程,主线程通过消息驱动,避免 better-sqlite3\n * 的同步查询阻塞主线程事件循环。WAL 只能改善数据库锁并发,无法避免同步调用占用调用线程,\n * 因此把阻塞移出主线程才是关键。\n *\n * 说明:worker 引擎只使用单个连接(单 worker),配合 Provider 主线程事务串行锁与 worker 的\n * FIFO 消息顺序保证事务正确性;不做只读连接池,避免事务/写路径复杂化。\n *\n * @module reldb-sqlite-engine\n */\n\nimport type BetterSqlite3 from 'better-sqlite3'\nimport type { ExecuteResult } from '../../reldb-types.js'\nimport { existsSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { setTimeout as delay } from 'node:timers/promises'\nimport { Worker } from 'node:worker_threads'\n\nconst require = createRequire(import.meta.url)\n\n/**\n * 一条待执行的语句(批量 / 事务内使用)。\n * @example 模块内部上下文\n * ```ts\n * const statement: SqliteStatement = { sql: 'INSERT INTO users (id) VALUES (?)', params: ['u1'] }\n * void statement\n * ```\n */\nexport interface SqliteStatement {\n sql: string\n params?: unknown[]\n}\n\n/**\n * SQLite 执行引擎接口。\n *\n * 所有方法均为异步:同步引擎内部仍是阻塞调用(签名异步保持一致),worker 引擎为真正的跨线程异步。\n * @example 模块内部上下文\n * ```ts\n * async function ready(engine: SqliteEngine) {\n * try {\n * await engine.initialize()\n * return await engine.get('SELECT 1 AS value')\n * } finally { await engine.close() }\n * }\n * ```\n */\nexport interface SqliteEngine {\n /**\n * 完成 WAL/worker 握手;必须先保存引擎引用,失败后仍通过 close 释放资源。\n * @example\n * try { await engine.initialize() } finally { await engine.close() }\n */\n initialize: () => Promise<void>\n /** 查询多行。 */\n all: (sql: string, params?: unknown[]) => Promise<unknown[]>\n /** 查询单行(无结果返回 null)。 */\n get: (sql: string, params?: unknown[]) => Promise<unknown>\n /** 执行修改语句,返回影响行数与自增主键。 */\n run: (sql: string, params?: unknown[]) => Promise<ExecuteResult>\n /** 执行无参数 SQL(DDL / BEGIN / COMMIT / ROLLBACK)。 */\n exec: (sql: string) => Promise<void>\n /** 在单个原子事务中批量执行语句。 */\n batch: (statements: SqliteStatement[]) => Promise<void>\n /** 关闭连接(worker 引擎同时终止线程)。 */\n close: () => Promise<void>\n /** 连接是否可用。 */\n isOpen: () => boolean\n}\n\n/**\n * 引擎打开选项。\n * @example 模块内部上下文\n * ```ts\n * const options: SqliteEngineOptions = { database: ':memory:', readonly: false, walMode: false }\n * void options\n * ```\n */\nexport interface SqliteEngineOptions {\n /** 数据库文件路径或 ':memory:'。 */\n database: string\n /** 是否只读。 */\n readonly: boolean\n /** 是否启用 WAL。 */\n walMode: boolean\n}\n\n/**\n * 创建同步引擎:主线程直接持有连接(默认执行方式)。\n *\n * @param options - 打开选项。\n * @returns 已拥有连接的引擎;调用 initialize 后才可执行 SQL。\n * @example 模块内部上下文\n * ```ts\n * const engine = createSyncSqliteEngine({ database: ':memory:', readonly: false, walMode: false })\n * try {\n * await engine.initialize()\n * void await engine.get('SELECT 1 AS value')\n * } finally { await engine.close() }\n * ```\n */\nexport function createSyncSqliteEngine(options: SqliteEngineOptions): SqliteEngine {\n const Database = require('better-sqlite3')\n const db = new Database(options.database, { readonly: options.readonly }) as BetterSqlite3.Database\n let initialized = false\n\n return {\n async initialize() {\n if (!initialized && options.walMode !== false) {\n // 首次切换 WAL 的锁升级可能跳过原生 busy handler;只重试初始化,不重放业务 SQL。\n // 与 worker 保持相同的单次 5 秒预算,原生等待和退避共同消耗该预算。\n const deadline = performance.now() + 5000\n let contention: unknown\n try {\n for (;;) {\n if (contention && performance.now() >= deadline)\n throw contention\n db.pragma(`busy_timeout = ${Math.max(1, Math.ceil(deadline - performance.now()))}`)\n try {\n db.pragma('journal_mode = WAL')\n break\n }\n catch (error) {\n if (!error || typeof error !== 'object' || !('code' in error)\n || typeof error.code !== 'string' || !/^SQLITE_BUSY(?:_|$)/.test(error.code)\n || performance.now() >= deadline) {\n throw error\n }\n contention = error\n await delay(Math.min(25, Math.max(1, deadline - performance.now())))\n }\n }\n }\n finally {\n db.pragma('busy_timeout = 5000')\n }\n }\n initialized = true\n },\n async all(sql, params) {\n const stmt = db.prepare(sql)\n return params\n ? stmt.all(...params)\n : stmt.all()\n },\n async get(sql, params) {\n const stmt = db.prepare(sql)\n return (params\n ? stmt.get(...params)\n : stmt.get()) ?? null\n },\n async run(sql, params) {\n const stmt = db.prepare(sql)\n const result = params\n ? stmt.run(...params)\n : stmt.run()\n return { changes: result.changes, lastInsertRowid: result.lastInsertRowid }\n },\n async exec(sql) {\n db.exec(sql)\n },\n async batch(statements) {\n const tx = db.transaction((items: SqliteStatement[]) => {\n for (const item of items) {\n const stmt = db.prepare(item.sql)\n if (item.params)\n stmt.run(...item.params)\n else stmt.run()\n }\n })\n tx(statements)\n },\n async close() {\n initialized = false\n if (db.open) {\n db.close()\n }\n },\n isOpen: () => initialized && db.open,\n }\n}\n\n/** 定位 worker 脚本;兼容源码(src 布局)与打包(dist 布局)两种运行位置。 */\nfunction resolveWorkerUrl(): URL {\n const candidates = [\n // 源码 / 测试:引擎与 worker 同目录。\n new URL('./reldb-sqlite-worker.mjs', import.meta.url),\n // 打包:引擎被并入 dist/index.js,worker 复制到 dist/providers/sqlite/。\n new URL('./providers/sqlite/reldb-sqlite-worker.mjs', import.meta.url),\n ]\n for (const candidate of candidates) {\n if (existsSync(candidate))\n return candidate\n }\n // 回退到源码布局,让 Worker 抛出可诊断的加载错误。\n return candidates[0]\n}\n\n/**\n * worker 响应消息。\n * @example 模块内部上下文\n * ```ts\n * function failed(response: WorkerResponse) {\n * return response.ok ? undefined : response.error?.message\n * }\n * ```\n */\ninterface WorkerResponse {\n id: number\n ok: boolean\n result?: unknown\n error?: { message: string }\n}\n\n/**\n * 创建 worker 引擎:把连接放进专用 worker 线程,卸载主线程阻塞。\n *\n * @param options - 打开选项。\n * @param connectTimeoutMs - 等待 worker 打开数据库的超时时间。\n * @returns 已拥有 worker 的引擎;initialize 在握手失败或超时时 reject。\n * @example 模块内部上下文\n * ```ts\n * const engine = createWorkerSqliteEngine({ database: ':memory:', readonly: false, walMode: false }, 10_000)\n * try {\n * await engine.initialize()\n * void await engine.get('SELECT 1 AS value')\n * } finally { await engine.close() }\n * ```\n */\nexport function createWorkerSqliteEngine(\n options: SqliteEngineOptions,\n connectTimeoutMs: number,\n): SqliteEngine {\n const worker = new Worker(resolveWorkerUrl(), {\n workerData: { database: options.database, readonly: options.readonly, walMode: options.walMode },\n })\n\n let seq = 0\n let open = false\n let exited = false\n let closing: Promise<void> | null = null\n const pending = new Map<number, { resolve: (value: unknown) => void, reject: (error: Error) => void }>()\n\n /** 连接失效时统一拒绝所有在途请求,避免 Promise 永久挂起。 */\n function rejectAll(error: Error): void {\n for (const entry of pending.values())\n entry.reject(error)\n pending.clear()\n }\n\n worker.on('message', (msg: WorkerResponse | { type: string }) => {\n // 初始化握手消息由 init Promise 处理,这里只处理带 id 的请求响应。\n if (!('id' in msg))\n return\n const entry = pending.get(msg.id)\n if (!entry)\n return\n pending.delete(msg.id)\n if (msg.ok)\n entry.resolve(msg.result)\n else entry.reject(new Error(msg.error?.message ?? 'sqlite worker error'))\n })\n worker.on('error', (error) => {\n open = false\n rejectAll(error instanceof Error\n ? error\n : new Error(String(error)))\n })\n worker.on('exit', (code) => {\n exited = true\n open = false\n if (pending.size > 0)\n rejectAll(new Error(`sqlite worker exited unexpectedly with code ${code}`))\n })\n\n /** 等待握手时同步处理 error/exit,并在所有完成路径释放定时器和临时监听器。 */\n function initialize(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n finish(new Error(`sqlite worker init timed out after ${connectTimeoutMs}ms`))\n }, connectTimeoutMs)\n\n function finish(error?: Error): void {\n clearTimeout(timer)\n worker.off('message', onHandshake)\n worker.off('error', onError)\n worker.off('exit', onExit)\n if (error) {\n reject(error)\n }\n else {\n open = true\n resolve()\n }\n }\n function onError(error: Error): void {\n finish(error)\n }\n function onExit(code: number): void {\n finish(new Error(`sqlite worker exited before ready with code ${code}`))\n }\n function onHandshake(msg: { type?: string }): void {\n if (msg?.type === 'ready') {\n finish()\n }\n else if (msg?.type === 'init-error') {\n finish(new Error((msg as { error?: { message: string } }).error?.message ?? 'sqlite worker init failed'))\n }\n }\n\n worker.on('message', onHandshake)\n worker.once('error', onError)\n worker.once('exit', onExit)\n if (exited)\n finish(new Error('sqlite worker exited before initialization'))\n })\n }\n\n /** 发送一条请求并等待响应。 */\n function post(op: string, payload: { sql?: string, params?: unknown[], statements?: SqliteStatement[] }): Promise<unknown> {\n if (!open)\n return Promise.reject(new Error('sqlite worker is not open'))\n const id = ++seq\n return new Promise<unknown>((resolve, reject) => {\n pending.set(id, { resolve, reject })\n worker.postMessage({ id, op, ...payload })\n })\n }\n\n return {\n initialize,\n // 边界反序列化:worker 通过结构化克隆回传,行/结果类型在此断言。\n async all(sql, params) {\n return (await post('all', { sql, params })) as unknown[]\n },\n async get(sql, params) {\n return await post('get', { sql, params })\n },\n async run(sql, params) {\n return (await post('run', { sql, params })) as ExecuteResult\n },\n async exec(sql) {\n await post('exec', { sql })\n },\n async batch(statements) {\n await post('batch', { statements })\n },\n close() {\n if (closing)\n return closing\n const wasOpen = open\n const gracefulClose = wasOpen\n ? post('close', {})\n : Promise.resolve()\n open = false\n closing = (async () => {\n // 握手失败时也必须终止线程;终止失败保留所有权,下一次 close 再试。\n await gracefulClose.catch(() => undefined)\n if (!exited)\n await worker.terminate()\n })().finally(() => { closing = null })\n return closing\n },\n isOpen: () => open,\n }\n}\n","/**\n * @h-ai/reldb — SQLite Provider\n *\n * 基于 better-sqlite3 的 SQLite 数据库实现。\n * 按 Context + wrapOp → Factory 模式实现。\n * @module reldb-provider-sqlite\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type { ReldbConfig } from '../reldb-config.js'\nimport type {\n DdlOperations,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n PaginationQueryOptions,\n ReldbColumnDef,\n} from '../reldb-types.js'\nimport type { ReldbOpsContext } from './reldb-provider-base.js'\nimport type { ReldbProvider } from './reldb-provider-types.js'\nimport type { SqliteEngine } from './sqlite/reldb-sqlite-engine.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { reldbM } from '../reldb-i18n.js'\nimport { quoteIdentifier } from '../reldb-security.js'\nimport { HaiReldbError } from '../reldb-types.js'\nimport {\n buildColumnSqlBase,\n buildDefaultCreateIndexSql,\n buildDefaultCreateTableSql,\n buildDefaultDropIndexSql,\n buildDefaultRenameTableSql,\n} from './reldb-ddl-builder.js'\nimport { createBaseCrudManager, createBaseDdlOps, createBaseDmlOps, createBaseTxManager, queryPageAsync } from './reldb-provider-base.js'\nimport { createTxHandle } from './reldb-tx-assembler.js'\nimport { createSyncSqliteEngine, createWorkerSqliteEngine } from './sqlite/reldb-sqlite-engine.js'\n\nconst logger = core.logger.child({ module: 'reldb', scope: 'sqlite' })\n\n// ─── SQLite Provider 实现 ───\n\n/**\n * 创建 SQLite Provider 实例\n *\n * @returns SQLite Provider\n * @example 模块内部上下文\n * ```ts\n * const provider = createSqliteProvider()\n * const closed = await provider.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * ```\n */\nexport function createSqliteProvider(): ReldbProvider {\n /** SQLite 执行引擎(同步或 worker) */\n let engine: SqliteEngine | null = null\n /** 只有健康检查完成的连接才可供业务使用;清理失败仍保留底层资源。 */\n let ready = false\n let closing: Promise<HaiResult<void>> | null = null\n /** 串行化 SQLite 事务,关闭前等待所有借出事务归还。 */\n let txChain: Promise<void> = Promise.resolve()\n let currentConfig: ReldbConfig | null = null\n\n /** 保留所有权直到释放成功;合并并发关闭且立即阻止新操作。 */\n function closeResource(): Promise<HaiResult<void>> {\n ready = false\n currentConfig = null\n if (closing)\n return closing\n const owned = engine\n if (!owned)\n return Promise.resolve(ok(undefined))\n closing = (async (): Promise<HaiResult<void>> => {\n try {\n // 在途事务拥有独立上下文;先等待释放,再关闭唯一引擎。\n await txChain.catch(() => undefined)\n await owned.close()\n engine = null\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_sqliteConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n })().finally(() => { closing = null })\n return closing\n }\n\n /** 事务锁获取超时(毫秒),防止永久阻塞 */\n const TX_LOCK_TIMEOUT_MS = 30_000\n\n /**\n * 获取事务锁,带超时保护\n *\n * 当锁等待超过 TX_LOCK_TIMEOUT_MS 时抛出超时错误,防止无限阻塞。\n */\n async function acquireTxLock(): Promise<() => void> {\n let release!: () => void\n const current = new Promise<void>((resolve) => {\n release = resolve\n })\n const prev = txChain\n txChain = txChain.then(() => current)\n\n // 带超时的等待\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n // 超时后释放锁链,避免后续事务也阻塞\n release()\n reject(new Error(`SQLite transaction lock acquisition timed out after ${TX_LOCK_TIMEOUT_MS}ms`))\n }, TX_LOCK_TIMEOUT_MS)\n })\n\n try {\n await Promise.race([prev, timeoutPromise])\n }\n finally {\n if (timer !== undefined) {\n clearTimeout(timer)\n }\n }\n\n return release\n }\n\n // ─── 操作上下文 ───\n\n const ctx: ReldbOpsContext = {\n isConnected: () => ready && engine !== null && engine.isOpen(),\n logger,\n operationLog: () => currentConfig?.operationLog,\n }\n\n // ─── SQLite 方言辅助 ───\n\n /** SQLite 列类型映射 */\n function mapSqliteType(def: ReldbColumnDef): string {\n switch (def.type) {\n case 'TEXT':\n case 'JSON':\n return 'TEXT'\n case 'INTEGER':\n case 'BIGINT':\n case 'BOOLEAN':\n return 'INTEGER'\n case 'REAL':\n return 'REAL'\n case 'BLOB':\n return 'BLOB'\n case 'TIMESTAMP':\n return 'INTEGER' // Unix timestamp\n default:\n return 'TEXT'\n }\n }\n\n /** SQLite buildColumnSql */\n function sqliteBuildColumnSql(name: string, def: ReldbColumnDef): string {\n return buildColumnSqlBase(name, def, {\n quoteId: quoteIdentifier,\n mapType: mapSqliteType,\n inlinePrimaryKey: true,\n extraConstraints: (d) => {\n const extras: string[] = []\n if (d.primaryKey && d.autoIncrement)\n extras.push('AUTOINCREMENT')\n return extras\n },\n })\n }\n\n /** 事务错误消息生成 */\n function sqliteTxErrorMessage(detail: string): string {\n return reldbM('reldb_sqliteTxFailed', {\n params: { error: detail },\n })\n }\n\n // ─── DDL 操作 ───\n\n const rawDdl: DdlOperations = {\n async createTable(name, columns, ifNotExists = true) {\n const quotedTable = quoteIdentifier(name)\n const sql = buildDefaultCreateTableSql(sqliteBuildColumnSql, quotedTable, columns, ifNotExists)\n await engine!.exec(sql)\n return ok(undefined)\n },\n async dropTable(name, ifExists) {\n const ifExistsClause = ifExists ? 'IF EXISTS ' : ''\n await engine!.exec(`DROP TABLE ${ifExistsClause}${quoteIdentifier(name)}`)\n return ok(undefined)\n },\n async addColumn(table, column, def) {\n const colSql = sqliteBuildColumnSql(column, def)\n await engine!.exec(`ALTER TABLE ${quoteIdentifier(table)} ADD COLUMN ${colSql}`)\n return ok(undefined)\n },\n async dropColumn(table, column) {\n await engine!.exec(`ALTER TABLE ${quoteIdentifier(table)} DROP COLUMN ${quoteIdentifier(column)}`)\n return ok(undefined)\n },\n async renameTable(oldName, newName) {\n await engine!.exec(buildDefaultRenameTableSql(quoteIdentifier(oldName), quoteIdentifier(newName)))\n return ok(undefined)\n },\n async createIndex(table, index, def) {\n const sql = buildDefaultCreateIndexSql(quoteIdentifier, quoteIdentifier(table), quoteIdentifier(index), def)\n await engine!.exec(sql)\n return ok(undefined)\n },\n async dropIndex(index, ifExists = true) {\n const sql = buildDefaultDropIndexSql(quoteIdentifier, index, ifExists)\n await engine!.exec(sql)\n return ok(undefined)\n },\n async raw(sql) {\n await engine!.exec(sql)\n return ok(undefined)\n },\n }\n\n // ─── DML 操作 ───\n\n const rawDml: DmlOperations = {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n const rows = await engine!.all(sql, params)\n return ok(rows as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const row = await engine!.get(sql, params)\n return ok((row as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const result = await engine!.run(sql, params)\n return ok(result)\n },\n async batch(statements) {\n // 与显式事务串行,避免并发 BEGIN 导致 \"cannot start a transaction within a transaction\"。\n const releaseTxLock = await acquireTxLock()\n try {\n await engine!.batch(statements)\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.QUERY_FAILED, reldbM('reldb_sqliteBatchFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n finally {\n releaseTxLock()\n }\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const result = await queryPageAsync<T>(\n (sqlStr, params) => engine!.all(sqlStr, params),\n options,\n )\n return ok(result)\n },\n }\n\n // ─── 事务 ───\n\n /** 创建事务连接上的 DML 操作(无守卫,由 createTxHandle 统一守卫)。事务内批量不再包裹嵌套事务。 */\n function createSqliteTxDmlOps(txEngine: SqliteEngine): DmlOperations {\n return {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n return ok((await txEngine.all(sql, params)) as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n return ok(((await txEngine.get(sql, params)) as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n return ok(await txEngine.run(sql, params))\n },\n async batch(statements) {\n // 已处于显式事务中,逐条执行即可,不再开启嵌套事务。\n for (const { sql: s, params } of statements) {\n await txEngine.run(s, params)\n }\n return ok(undefined)\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const result = await queryPageAsync<T>(\n (sqlStr, params) => txEngine.all(sqlStr, params),\n options,\n )\n return ok(result)\n },\n }\n }\n\n async function beginTx(): Promise<HaiResult<DmlWithTxOperations>> {\n const txEngine = engine!\n let released = false\n const releaseTxLock = await acquireTxLock()\n\n const finishTransaction = () => {\n if (!released) {\n released = true\n releaseTxLock()\n }\n }\n\n try {\n await txEngine.exec('BEGIN TRANSACTION')\n }\n catch (error) {\n finishTransaction()\n return err(HaiReldbError.TRANSACTION_FAILED, sqliteTxErrorMessage(String(error)), error)\n }\n\n const txDmlOps = createSqliteTxDmlOps(txEngine)\n const guardedTxDmlOps = createBaseDmlOps({\n ...ctx,\n isConnected: () => txEngine.isOpen(),\n }, txDmlOps)\n return ok(createTxHandle(guardedTxDmlOps, {\n commit: async () => { await txEngine.exec('COMMIT') },\n rollback: async () => { await txEngine.exec('ROLLBACK') },\n release: () => finishTransaction(),\n errorMessage: sqliteTxErrorMessage,\n }))\n }\n\n // ─── 组装 Provider ───\n\n const dmlOps = createBaseDmlOps(ctx, rawDml)\n\n return {\n async connect(config: ReldbConfig): Promise<HaiResult<void>> {\n if (config.type !== 'sqlite') {\n return err(HaiReldbError.UNSUPPORTED_TYPE, reldbM('reldb_sqliteOnlySqlite'))\n }\n\n if (!config.database) {\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_sqliteNeedPath'))\n }\n\n const previousCleanup = await closeResource()\n if (!previousCleanup.success)\n return previousCleanup\n try {\n const sqliteOptions = {\n walMode: true,\n readonly: false,\n executor: 'sync' as 'sync' | 'worker',\n workerConnectTimeoutMs: 10_000,\n ...(config.sqlite ?? {}),\n }\n const engineOptions = {\n database: config.database,\n readonly: sqliteOptions.readonly ?? false,\n walMode: sqliteOptions.walMode !== false,\n }\n\n // worker 执行方式把同步查询移出主线程事件循环;sync 为默认保持历史行为。\n engine = sqliteOptions.executor === 'worker'\n ? createWorkerSqliteEngine(engineOptions, sqliteOptions.workerConnectTimeoutMs ?? 10_000)\n : createSyncSqliteEngine(engineOptions)\n await engine.initialize()\n\n ready = true\n currentConfig = config\n logger.info('Connected to SQLite', { database: config.database, executor: sqliteOptions.executor })\n return ok(undefined)\n }\n catch (error) {\n const cleanup = await closeResource()\n const result = err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_sqliteConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n return cleanup.success || result.success\n ? result\n : err({\n ...result.error,\n ext: { cleanupPending: true, cleanupError: cleanup.error },\n })\n }\n },\n\n close: closeResource,\n\n isConnected: () => ctx.isConnected(),\n ddl: createBaseDdlOps(ctx, rawDdl),\n sql: dmlOps,\n crud: createBaseCrudManager(dmlOps),\n tx: createBaseTxManager(ctx, beginTx),\n }\n}\n","/** 模块维护自己的迁移;这里只提供跨数据库列检查、版本账本和执行边界。 */\nimport type { HaiResult } from '@h-ai/core'\nimport type { DmlOperations, ReldbFunctions } from './reldb-types.js'\nimport { core, err, HaiCommonError, ok } from '@h-ai/core'\n\n/**\n * 一个可重入的模块升级步骤;只接收代码中固定的 SQL 与表名。\n * @example\n * ```ts\n * import type { SchemaMigration } from '@h-ai/reldb'\n * const steps: SchemaMigration[] = []\n * ```\n */\nexport interface SchemaMigration {\n version: number\n name: string\n needed: (sql: DmlOperations) => Promise<HaiResult<boolean>>\n apply: (sql: DmlOperations) => Promise<HaiResult<unknown>>\n}\n\n/**\n * 只读预检结果;生产升级需先停旧写入并备份数据库与共享缓存。\n * @example\n * ```ts\n * import type { SchemaMigrationPlan } from '@h-ai/reldb'\n * function changes(plan: SchemaMigrationPlan) { return plan.changes }\n * ```\n */\nexport interface SchemaMigrationPlan {\n module: string\n currentVersion: number\n targetVersion: number\n changes: string[]\n requiresExclusiveAccess: boolean\n}\n\n/**\n * 查询真实列名;不创建表,不把查询错误当成新安装。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n * const columns = await reldb.schemaColumns('hai_iam_users')\n * ```\n */\nexport async function schemaColumns(db: ReldbFunctions, table: string, sql: DmlOperations = db.sql): Promise<HaiResult<string[]>> {\n if (!/^[a-z][a-z0-9_]{0,62}$/.test(table))\n return err(HaiCommonError.VALIDATION_ERROR, core.i18n.coreM('core_errorValidation'))\n const type = db.config?.type\n const found = type === 'sqlite'\n ? await sql.query<{ name: string }>(`PRAGMA table_info(${table})`)\n : await sql.query<{ name: string }>(`SELECT column_name AS name FROM information_schema.columns WHERE table_schema=${type === 'mysql'\n ? 'DATABASE()'\n : 'current_schema()'} AND table_name=?`, [table])\n return found.success\n ? ok(found.data.map(row => row.name))\n : found\n}\n\n/**\n * 预检或执行模块维护的版本迁移。SQLite/PostgreSQL 原子提交;MySQL DDL 隐式提交,步骤须可重入。\n * 失败不记录目标版本;重启重新检查真实结构。新版本账本拒绝旧代码向下迁移。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n * const plan = await reldb.migrateSchema('example', [], { dryRun: true })\n * ```\n */\nexport async function migrateSchema(db: ReldbFunctions, module: string, steps: readonly SchemaMigration[], options: { dryRun?: boolean } = {}): Promise<HaiResult<SchemaMigrationPlan>> {\n if (!db.isInitialized || !/^[a-z][a-z0-9-]{0,62}$/.test(module) || steps.some((step, index) => step.version !== index + 1))\n return err(HaiCommonError.VALIDATION_ERROR, core.i18n.coreM('core_errorValidation'))\n const table = 'hai_schema_migrations'\n const targetVersion = steps.length\n const failed = (cause?: unknown) => err({\n ...HaiCommonError.INIT_FAILED,\n message: core.i18n.coreM('core_runtimeStartFailed', {\n params: { module },\n }),\n ext: { module, phase: 'migration' },\n cause,\n })\n async function inspect(sql: DmlOperations): Promise<HaiResult<SchemaMigrationPlan>> {\n const columns = await schemaColumns(db, table, sql)\n if (!columns.success)\n return failed(columns.error)\n const row = columns.data.length\n ? await sql.get<{ version: number }>(`SELECT version FROM ${table} WHERE module=?`, [module])\n : ok(null)\n if (!row.success)\n return failed(row.error)\n const currentVersion = Number(row.data?.version ?? 0)\n if (currentVersion > targetVersion)\n return failed()\n const changes: string[] = []\n for (const step of steps) {\n const needed = await step.needed(sql)\n if (!needed.success)\n return failed(needed.error)\n if (needed.data)\n changes.push(step.name)\n }\n return ok({\n module,\n currentVersion,\n targetVersion,\n changes,\n requiresExclusiveAccess: changes.length > 0,\n })\n }\n if (options.dryRun)\n return inspect(db.sql)\n const created = await db.sql.execute(`CREATE TABLE IF NOT EXISTS ${table} (module VARCHAR(64) PRIMARY KEY, version INTEGER NOT NULL)`)\n if (!created.success)\n return failed(created.error)\n const seeded = await db.sql.execute(db.config?.type === 'mysql'\n ? `INSERT IGNORE INTO ${table}(module,version) VALUES (?,0)`\n : `INSERT INTO ${table}(module,version) VALUES (?,0) ON CONFLICT(module) DO NOTHING`, [module])\n if (!seeded.success)\n return failed(seeded.error)\n const started = await db.tx.begin()\n if (!started.success)\n return failed(started.error)\n const tx = started.data\n let mysqlLock = false\n let committed = false\n try {\n // MySQL DDL 会释放事务行锁,使用同一连接的命名锁覆盖整次升级。\n if (db.config?.type === 'mysql') {\n const lock = await tx.get<{ acquired: number }>('SELECT GET_LOCK(?,30) AS acquired', [`hai-schema:${module}`])\n if (!lock.success || Number(lock.data?.acquired) !== 1) {\n return failed(lock.success\n ? new Error('Migration lock unavailable')\n : lock.error)\n }\n mysqlLock = true\n }\n const locked = await tx.execute(`UPDATE ${table} SET version=version WHERE module=?`, [module])\n if (!locked.success)\n return failed(locked.error)\n const plan = await inspect(tx)\n if (!plan.success)\n return plan\n for (const step of steps) {\n const needed = await step.needed(tx)\n if (!needed.success)\n return failed(needed.error)\n if (needed.data) {\n const applied = await step.apply(tx)\n if (!applied.success)\n return failed(applied.error)\n const remaining = await step.needed(tx)\n if (!remaining.success || remaining.data) {\n return failed(remaining.success\n ? new Error('Migration step did not converge')\n : remaining.error)\n }\n }\n }\n const recorded = await tx.execute(`UPDATE ${table} SET version=? WHERE module=?`, [targetVersion, module])\n if (!recorded.success)\n return failed(recorded.error)\n if (mysqlLock) {\n await tx.get('SELECT RELEASE_LOCK(?)', [`hai-schema:${module}`])\n mysqlLock = false\n }\n const result = await tx.commit()\n committed = result.success\n return result.success\n ? plan\n : failed(result.error)\n }\n catch (error) {\n return failed(error)\n }\n finally {\n if (mysqlLock)\n await tx.get('SELECT RELEASE_LOCK(?)', [`hai-schema:${module}`])\n // 已提交时 rollback 为无操作;失败时释放事务与连接。\n if (!committed)\n await tx.rollback()\n }\n}\n","/**\n * @h-ai/reldb — 数据库服务主入口\n *\n * 本文件提供统一的 `reldb` 对象,聚合所有数据库操作功能。\n * @module reldb-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ReldbProvider } from './providers/reldb-provider-types.js'\nimport type { ReldbConfig, ReldbConfigInput } from './reldb-config.js'\nimport type {\n CrudManager,\n DdlOperations,\n DmlOperations,\n ReldbFunctions,\n ReldbJsonOps,\n TxManager,\n} from './reldb-types.js'\n\nimport process from 'node:process'\nimport { core, err, ok } from '@h-ai/core'\n\nimport { createBaseCrudManager } from './providers/reldb-provider-base.js'\nimport { createMysqlProvider } from './providers/reldb-provider-mysql.js'\nimport { createPostgresProvider } from './providers/reldb-provider-postgres.js'\nimport { createSqliteProvider } from './providers/reldb-provider-sqlite.js'\n\nimport { ReldbConfigSchema } from './reldb-config.js'\nimport { reldbM } from './reldb-i18n.js'\nimport { createJsonOps } from './reldb-json.js'\nimport { migrateSchema, schemaColumns } from './reldb-migration.js'\nimport { pagination } from './reldb-pagination.js'\nimport { HaiReldbError } from './reldb-types.js'\n\nconst logger = core.logger.child({ module: 'reldb', scope: 'main' })\n\n// ─── 内部状态 ───\n\n/** 当前活跃的数据库 Provider(未初始化时为 null) */\nlet currentProvider: ReldbProvider | null = null\n\n/** 当前数据库配置(未初始化时为 null) */\nlet currentConfig: ReldbConfig | null = null\n\n/** 缓存的 JSON 操作实例(dbType 在 init/close 间不变,无需每次 getter 重建) */\nlet currentJsonOps: ReldbJsonOps | null = null\n\n/** 初始化进行中标记,防止并发调用导致 Provider 泄漏 */\nlet initInProgress = false\n\n/** 尚未释放的候选/旧 Provider;绝不用于业务操作,清理成功后才能替换。 */\nlet pendingProvider: ReldbProvider | null = null\n/** 初始化完成屏障,供 close 等待候选资源归属确定。 */\nlet initCompletion: Promise<void> | null = null\n/** 合并并发关闭,避免同一连接重复释放。 */\nlet closingPromise: Promise<HaiResult<void>> | null = null\n\n/** 停止发布资源并重试清理;失败时保留唯一所有权供下一次 close/init 重试。 */\nasync function closeOwnedProvider(): Promise<HaiResult<void>> {\n if (currentProvider) {\n pendingProvider = currentProvider\n currentProvider = null\n }\n currentConfig = null\n currentJsonOps = null\n if (!pendingProvider)\n return ok(undefined)\n try {\n const result = await pendingProvider.close()\n if (!result.success) {\n return err({\n ...result.error,\n ext: { ...result.error.ext, cleanupPending: true },\n })\n }\n pendingProvider = null\n return ok(undefined)\n }\n catch (error) {\n logger.error('Provider cleanup failed; retaining resource for retry', { error })\n return err({\n ...HaiReldbError.CONNECTION_FAILED,\n message: reldbM('reldb_closeFailed', {\n params: {\n error: error instanceof Error\n ? error.message\n : String(error),\n },\n }),\n cause: error,\n ext: { cleanupPending: true },\n })\n }\n}\n\n/** 初始化失败后释放候选;保留原始错误,并明确指出清理尚未完成。 */\nasync function failInitialization(result: HaiResult<void>): Promise<HaiResult<void>> {\n const cleanup = await closeOwnedProvider()\n if (result.success)\n return result\n if (cleanup.success) {\n const ext = { ...result.error.ext }\n delete ext.cleanupPending\n delete ext.cleanupError\n return err({\n ...result.error,\n ext: Object.keys(ext).length > 0\n ? ext\n : undefined,\n })\n }\n return err({\n ...result.error,\n ext: { ...result.error.ext, cleanupPending: true, cleanupError: cleanup.error },\n })\n}\n\n// ─── Provider 工厂 ───\n\n/**\n * 根据配置创建对应的数据库 Provider\n *\n * @param config - 数据库配置(已校验、默认值补齐)\n * @returns Provider 实例\n */\nfunction createProvider(config: ReldbConfig): ReldbProvider {\n switch (config.type) {\n case 'sqlite':\n return createSqliteProvider()\n case 'postgresql':\n return createPostgresProvider()\n case 'mysql':\n return createMysqlProvider()\n }\n}\n\n// ─── 未初始化时的占位操作 ───\n\n/** 未初始化工具集 */\nconst notInitialized = core.module.createNotInitializedKit(\n HaiReldbError.NOT_INITIALIZED,\n () => reldbM('reldb_notInitialized'),\n)\n\n/** 未初始化时的 DDL 操作占位对象 */\nconst notInitializedDdl = notInitialized.proxy<DdlOperations>()\n\n/** 未初始化时的 SQL 操作占位对象 */\nconst notInitializedSql = notInitialized.proxy<DmlOperations>()\n\n/** 未初始化时的 CRUD 管理器 */\nconst notInitializedCrud: CrudManager = createBaseCrudManager(notInitializedSql)\n\n/** 未初始化时的 JSON 操作构建器(默认使用 SQLite 格式) */\nconst notInitializedJson: ReldbJsonOps = createJsonOps('sqlite')\n\n/** 未初始化时的事务管理器占位对象 */\nconst notInitializedTx: TxManager = {\n begin: async () => notInitialized.result(),\n wrap: async () => notInitialized.result(),\n}\n\n// ─── 统一数据库服务对象 ───\n\n/**\n * 数据库服务对象\n *\n * 统一的数据库访问入口,提供以下功能:\n * - `reldb.init()` - 初始化数据库连接\n * - `reldb.close()` - 关闭连接\n * - `reldb.ddl` - DDL 操作(表结构管理)\n * - `reldb.sql` - SQL 操作(数据查询和修改)\n * - `reldb.tx` - 事务管理器(begin / wrap)\n * - `reldb.json` - JSON 路径操作 SQL 构建器(提取、设置、插入、删除、合并)\n * - `reldb.config` - 当前配置\n * - `reldb.isInitialized` - 初始化状态\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const initialized = await reldb.init({ type: 'sqlite', database: ':memory:' }) // 仅示例/测试。\n * if (!initialized.success) throw new Error(initialized.error.message)\n * try {\n * const created = await reldb.ddl.createTable('users', { id: { type: 'TEXT', primaryKey: true }, name: { type: 'TEXT' } })\n * if (!created.success) throw new Error(created.error.message)\n * const inserted = await reldb.sql.execute('INSERT INTO users (id, name) VALUES (?, ?)', ['u1', 'Alice'])\n * if (!inserted.success) throw new Error(inserted.error.message)\n * } finally {\n * const closed = await reldb.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * }\n * ```\n */\nexport const reldb: ReldbFunctions = {\n /**\n * 初始化数据库连接\n *\n * @param config - 数据库配置(允许部分字段,内部会补齐默认值)\n * @returns 初始化结果,失败时包含错误信息\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.init({ type: 'sqlite', database: ':memory:' })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n async init(config: ReldbConfigInput): Promise<HaiResult<void>> {\n if (initInProgress || closingPromise) {\n logger.warn('RelDB module init is already in progress, skipping concurrent call')\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_configError', {\n params: { error: 'init already in progress' },\n }))\n }\n\n initInProgress = true\n let resolveInit!: () => void\n initCompletion = new Promise<void>((resolve) => {\n resolveInit = resolve\n })\n try {\n const cleanup = await closeOwnedProvider()\n if (!cleanup.success)\n return cleanup\n\n logger.info('Initializing RelDB module')\n\n const parseResult = ReldbConfigSchema.safeParse(config)\n if (!parseResult.success) {\n logger.error('RelDB config validation failed', { error: parseResult.error.message })\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_configError', {\n params: { error: parseResult.error.message },\n }), parseResult.error)\n }\n const parsed = parseResult.data\n if (core.module.requiresSharedState(process.env) && (parsed.type === 'sqlite'))\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_sharedBackendRequired'))\n\n try {\n const provider = createProvider(parsed)\n pendingProvider = provider\n const connectResult = await provider.connect(parsed)\n if (!connectResult.success) {\n logger.error('RelDB module initialization failed', {\n code: connectResult.error.code,\n message: connectResult.error.message,\n })\n return await failInitialization(connectResult)\n }\n pendingProvider = null\n currentProvider = provider\n currentConfig = parsed\n currentJsonOps = createJsonOps(parsed.type)\n logger.info('RelDB module initialized', { type: parsed.type })\n return ok(undefined)\n }\n catch (error) {\n logger.error('RelDB module initialization failed', { error })\n return await failInitialization(err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_initFailed', {\n params: {\n error: error instanceof Error\n ? error.message\n : String(error),\n },\n }), error))\n }\n }\n finally {\n initInProgress = false\n initCompletion = null\n resolveInit()\n }\n },\n\n /**\n * 获取 DDL 操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get ddl(): DdlOperations {\n return currentProvider?.ddl ?? notInitializedDdl\n },\n\n /**\n * 获取 SQL 操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get sql(): DmlOperations {\n return currentProvider?.sql ?? notInitializedSql\n },\n\n /**\n * 获取 CRUD 管理器\n *\n * 通过 `reldb.crud.table(config)` 获取单表 CRUD 仓库。\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get crud() {\n return currentProvider?.crud ?? notInitializedCrud\n },\n\n /** 事务管理器 */\n get tx(): TxManager {\n return currentProvider?.tx ?? notInitializedTx\n },\n\n /** 迁移操作绑定当前实例,调用方只提供模块自己的步骤。 */\n migrateSchema(module, steps, options) {\n if (!currentProvider)\n return Promise.resolve(notInitialized.result())\n return migrateSchema(reldb, module, steps, options)\n },\n\n /** 列检查复用当前连接或显式传入的事务。 */\n schemaColumns(table, sql) {\n if (!currentProvider)\n return Promise.resolve(notInitialized.result())\n return schemaColumns(reldb, table, sql)\n },\n\n /** 获取当前脱敏后的配置快照(未初始化时为 null) */\n get config(): ReldbConfig | null {\n if (!currentConfig)\n return null\n const snapshot = core.sanitize.sanitizeSensitiveFields(currentConfig)\n // 通用敏感字段匹配不包含普通 key;TLS 客户端私钥必须在配置快照中单独遮蔽。\n if ('ssl' in snapshot && snapshot.ssl && typeof snapshot.ssl === 'object' && 'key' in snapshot.ssl)\n snapshot.ssl.key = core.sanitize.defaultSensitiveReplacement\n return snapshot\n },\n\n /** 检查是否已初始化 */\n get isInitialized(): boolean {\n return currentProvider !== null && currentProvider.isConnected()\n },\n\n /**\n * 获取分页工具\n *\n * 提供 `reldb.pagination.normalize()` 和 `reldb.pagination.build()` 两个纯函数,\n * 用于自定义分页场景(无需数据库连接)。\n */\n get pagination() {\n return pagination\n },\n\n /**\n * 获取 JSON 路径操作 SQL 构建器\n *\n * 根据当前数据库类型返回对应的 JSON 操作实现。\n * 未初始化时返回 SQLite 格式的构建器作为默认值。\n *\n * 构建器方法均为纯函数,返回 `{ sql, params }` 可直接嵌入 SQL 查询。\n *\n * @example\n * ```ts\n * // 提取 JSON 字段值\n * const { sql, params } = reldb.json.extract('settings', '$.theme')\n * const rows = await reldb.sql.query(\n * `SELECT * FROM users WHERE ${sql} = ?`,\n * [...params, '\"dark\"'],\n * )\n *\n * // 设置 JSON 字段路径\n * const { sql, params } = reldb.json.set('settings', '$.theme', 'dark')\n * await reldb.sql.execute(\n * `UPDATE users SET settings = ${sql} WHERE id = ?`,\n * [...params, userId],\n * )\n * ```\n */\n get json(): ReldbJsonOps {\n return currentJsonOps ?? notInitializedJson\n },\n\n /**\n * 关闭数据库连接\n *\n * 等待初始化和在途事务,停止接收新操作;失败时保留资源供 close/init 重试。\n * @returns 所有资源释放成功才返回成功;并发关闭共享同一清理过程。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.close()\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n async close(): Promise<HaiResult<void>> {\n if (!closingPromise) {\n closingPromise = (async () => {\n if (initCompletion)\n await initCompletion\n return await closeOwnedProvider()\n })().finally(() => { closingPromise = null })\n }\n return await closingPromise\n },\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../messages/en-US.json","../messages/ja-JP.json","../messages/zh-CN.json","../src/reldb-i18n.ts","../src/reldb-types.ts","../src/reldb-crud-repository.ts","../src/reldb-json.ts","../src/reldb-pagination.ts","../src/reldb-security.ts","../src/reldb-crud-kernel.ts","../src/providers/reldb-tx-assembler.ts","../src/providers/reldb-provider-base.ts","../src/providers/reldb-ddl-builder.ts","../src/providers/reldb-provider-mysql.ts","../src/providers/reldb-provider-postgres.ts","../src/providers/sqlite/reldb-sqlite-engine.ts","../src/providers/reldb-provider-sqlite.ts","../src/reldb-schema.ts","../src/reldb-main.ts"],"names":["core","sql","pagination","ok","err","key","logger","currentConfig","performance","resolve","createRequire","delay","require"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"reldb_notInitialized\": \"Database not initialized, please call db.init() first\",\n \"reldb_initFailed\": \"Failed to initialize database\",\n \"reldb_closeFailed\": \"Failed to close database\",\n \"reldb_ddlFailed\": \"DDL operation failed\",\n \"reldb_schemaMismatch\": \"Table {table} does not match its current schema\",\n \"reldb_queryFailed\": \"Query failed\",\n \"reldb_duplicateEntry\": \"Record already exists\",\n \"reldb_batchFailed\": \"Batch execute failed\",\n \"reldb_postgresTxFailed\": \"Transaction failed\",\n \"reldb_postgresOnlyPostgresql\": \"PostgreSQL Provider only supports postgresql type\",\n \"reldb_postgresConnectionFailed\": \"Failed to connect to PostgreSQL\",\n \"reldb_sqliteOnlySqlite\": \"SQLite Provider only supports sqlite type\",\n \"reldb_sqliteNeedPath\": \"SQLite requires database path (database field)\",\n \"reldb_sqliteConnectionFailed\": \"Failed to connect to SQLite\",\n \"reldb_sqliteTxFailed\": \"Transaction failed\",\n \"reldb_sqliteBatchFailed\": \"Batch execute failed\",\n \"reldb_mysqlOnlyMysql\": \"MySQL Provider only supports mysql type\",\n \"reldb_mysqlConnectionFailed\": \"Failed to connect to MySQL\",\n \"reldb_mysqlTxFailed\": \"Transaction failed\",\n \"reldb_mysqlPoolQueueFull\": \"MySQL connection acquisition queue is full\",\n \"reldb_mysqlPoolAcquireTimeout\": \"MySQL connection acquisition deadline exceeded\",\n \"reldb_mysqlPoolReleaseFailed\": \"MySQL connection release failed; close the database before retrying\",\n \"reldb_mysqlTlsDnsRequired\": \"MySQL hostname verification requires a DNS hostname matching the certificate; the current driver cannot verify an IP address identity\",\n \"reldb_crudEmptyPayload\": \"CRUD payload is empty, please provide data\",\n \"reldb_crudNoValidColumns\": \"CRUD payload has no valid columns\",\n \"reldb_crudRecordNotFound\": \"Record not found: {id}\",\n \"reldb_invalidIdentifier\": \"Invalid SQL identifier: {name} (only letters, digits and underscores allowed)\",\n \"reldb_configError\": \"Database config validation failed\",\n \"reldb_txFailed\": \"Transaction failed\",\n \"reldb_sharedBackendRequired\": \"Production mode requires a shared backend; local files and memory backends are for development or explicit end-to-end tests.\",\n \"reldb_jsonPatchObjectRequired\": \"JSON merge patch must be an object\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"reldb_notInitialized\": \"データベースが初期化されていません。先にdb.init()を呼び出してください\",\n \"reldb_initFailed\": \"データベースの初期化に失敗しました\",\n \"reldb_closeFailed\": \"データベースの終了に失敗しました\",\n \"reldb_ddlFailed\": \"DDL操作に失敗しました\",\n \"reldb_schemaMismatch\": \"テーブル {table} が現在のスキーマ定義と一致しません\",\n \"reldb_queryFailed\": \"クエリに失敗しました\",\n \"reldb_duplicateEntry\": \"レコードは既に存在します\",\n \"reldb_batchFailed\": \"バッチ実行に失敗しました\",\n \"reldb_postgresTxFailed\": \"トランザクションに失敗しました\",\n \"reldb_postgresOnlyPostgresql\": \"PostgreSQLプロバイダーはpostgresql型のみに対応しています\",\n \"reldb_postgresConnectionFailed\": \"PostgreSQLへの接続に失敗しました\",\n \"reldb_sqliteOnlySqlite\": \"SQLiteプロバイダーはsqlite型のみに対応しています\",\n \"reldb_sqliteNeedPath\": \"SQLiteにはデータベースのパス(databaseフィールド)が必要です\",\n \"reldb_sqliteConnectionFailed\": \"SQLiteへの接続に失敗しました\",\n \"reldb_sqliteTxFailed\": \"トランザクションに失敗しました\",\n \"reldb_sqliteBatchFailed\": \"バッチ実行に失敗しました\",\n \"reldb_mysqlOnlyMysql\": \"MySQLプロバイダーはmysql型のみに対応しています\",\n \"reldb_mysqlConnectionFailed\": \"MySQLへの接続に失敗しました\",\n \"reldb_mysqlTxFailed\": \"トランザクションに失敗しました\",\n \"reldb_mysqlPoolQueueFull\": \"MySQL 接続取得キューが満杯です\",\n \"reldb_mysqlPoolAcquireTimeout\": \"MySQL 接続取得の待機期限を超過しました\",\n \"reldb_mysqlPoolReleaseFailed\": \"MySQL 接続の解放に失敗しました。再試行する前にデータベースを終了してください\",\n \"reldb_mysqlTlsDnsRequired\": \"MySQL のホスト名検証には証明書と一致する DNS ホスト名が必要です。現在のドライバーでは IP アドレスの識別情報を検証できません\",\n \"reldb_crudEmptyPayload\": \"CRUDペイロードが空です。データを指定してください\",\n \"reldb_crudNoValidColumns\": \"CRUDペイロードに有効な列がありません\",\n \"reldb_crudRecordNotFound\": \"レコードが見つかりません: {id}\",\n \"reldb_invalidIdentifier\": \"SQL識別子が無効です: {name}(英数字とアンダースコアのみ使用できます)\",\n \"reldb_configError\": \"データベース設定の検証に失敗しました\",\n \"reldb_txFailed\": \"トランザクションに失敗しました\",\n \"reldb_sharedBackendRequired\": \"本番環境には共有バックエンドが必要です。ローカルファイルとメモリーバックエンドは開発環境または明示的な E2E テストでのみ使用できます。\",\n \"reldb_jsonPatchObjectRequired\": \"JSON マージパッチはオブジェクトで指定してください\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"reldb_notInitialized\": \"数据库未初始化,请先调用 db.init()\",\n \"reldb_initFailed\": \"初始化数据库失败\",\n \"reldb_closeFailed\": \"关闭数据库失败\",\n \"reldb_ddlFailed\": \"DDL 操作失败\",\n \"reldb_schemaMismatch\": \"数据表 {table} 与当前结构定义不符\",\n \"reldb_queryFailed\": \"查询失败\",\n \"reldb_duplicateEntry\": \"记录已存在\",\n \"reldb_batchFailed\": \"批量执行失败\",\n \"reldb_postgresTxFailed\": \"事务执行失败\",\n \"reldb_postgresOnlyPostgresql\": \"PostgreSQL Provider 仅支持 postgresql 类型\",\n \"reldb_postgresConnectionFailed\": \"连接 PostgreSQL 失败\",\n \"reldb_sqliteOnlySqlite\": \"SQLite Provider 仅支持 sqlite 类型\",\n \"reldb_sqliteNeedPath\": \"SQLite 需要提供数据库路径(database 字段)\",\n \"reldb_sqliteConnectionFailed\": \"连接 SQLite 失败\",\n \"reldb_sqliteTxFailed\": \"事务执行失败\",\n \"reldb_sqliteBatchFailed\": \"批量执行失败\",\n \"reldb_mysqlOnlyMysql\": \"MySQL Provider 仅支持 mysql 类型\",\n \"reldb_mysqlConnectionFailed\": \"连接 MySQL 失败\",\n \"reldb_mysqlTxFailed\": \"事务执行失败\",\n \"reldb_mysqlPoolQueueFull\": \"MySQL 连接获取等待队列已满\",\n \"reldb_mysqlPoolAcquireTimeout\": \"MySQL 连接获取已超过截止期限\",\n \"reldb_mysqlPoolReleaseFailed\": \"MySQL 连接归还失败,请关闭数据库后重试\",\n \"reldb_mysqlTlsDnsRequired\": \"MySQL 当前驱动的主机身份验证要求使用与证书匹配的 DNS 主机名,不能验证 IP 地址身份\",\n \"reldb_crudEmptyPayload\": \"CRUD 数据为空,请提供数据\",\n \"reldb_crudNoValidColumns\": \"CRUD 数据没有有效列\",\n \"reldb_crudRecordNotFound\": \"记录不存在: {id}\",\n \"reldb_invalidIdentifier\": \"非法的 SQL 标识符: {name}(仅允许字母、数字和下划线)\",\n \"reldb_configError\": \"数据库配置校验失败\",\n \"reldb_txFailed\": \"事务执行失败\",\n \"reldb_sharedBackendRequired\": \"生产模式需要跨节点共享后端;本机文件或内存后端仅用于开发和显式端到端测试。\",\n \"reldb_jsonPatchObjectRequired\": \"JSON 合并补丁必须是对象\"\n}\n","/**\n * @h-ai/reldb — i18n\n *\n * 本文件提供数据库模块的 i18n 文案访问入口。\n * @module reldb-i18n\n */\n\nimport { core } from '@h-ai/core'\nimport messagesEnUS from '../messages/en-US.json'\nimport messagesJaJP from '../messages/ja-JP.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\n// ─── i18n ───\n\n/**\n * 数据库模块文案 Key 类型\n * @example 模块内部上下文\n * ```ts\n * const key: ReldbMessageKey = 'reldb_notInitialized'\n * void reldbM(key)\n * ```\n */\ntype ReldbMessageKey = keyof typeof messagesZhCN\n\n/**\n * 获取数据库模块文案。\n * @param key - 文案 Key\n * @param options - 插值参数与格式化选项\n * @returns 本地化后的文案字符串\n * @remarks 具体参数结构与 core.i18n.createMessageGetter 保持一致。\n * @example 模块内部上下文\n * ```ts\n * void reldbM('reldb_notInitialized', { locale: 'en-US' })\n * ```\n */\nexport const reldbM = core.i18n.createMessageGetter<ReldbMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n 'ja-JP': messagesJaJP,\n})\n","/**\n * @h-ai/reldb — 类型定义\n *\n * 本文件定义数据库模块的核心接口和类型(非配置相关)。 配置相关类型请从 reldb-config.ts 导入。\n * @module reldb-types\n */\n\nimport type { ErrorInfo, HaiResult, PaginatedResult, PaginationOptions, PaginationOptionsInput } from '@h-ai/core'\nimport type { DbType, ReldbConfig, ReldbConfigInput } from './reldb-config.js'\nimport type { JsonSqlExpr, ReldbJsonOps } from './reldb-json.js'\nimport { core } from '@h-ai/core'\n\nexport type { JsonSqlExpr, ReldbJsonOps }\n\n// ─── 错误类型 ───\n\nconst ReldbErrorInfo = {\n // ─── 通用 001-009 ───\n CONNECTION_FAILED: '001:500',\n QUERY_FAILED: '002:500',\n CONSTRAINT_VIOLATION: '003:409',\n TRANSACTION_FAILED: '004:500',\n RECORD_NOT_FOUND: '006:404',\n DUPLICATE_ENTRY: '007:409',\n DEADLOCK: '008:500',\n TIMEOUT: '009:504',\n // ─── 初始化 010-019 ───\n NOT_INITIALIZED: '010:500',\n POOL_EXHAUSTED: '011:503',\n UNSUPPORTED_TYPE: '012:400',\n CONFIG_ERROR: '013:500',\n // ─── 业务操作 020+ ───\n DDL_FAILED: '020:500',\n} satisfies ErrorInfo\n\n/**\n * HaiReldbError 的数据约束与操作契约。\n * @example\n * ```ts\n * import { HaiReldbError } from '@h-ai/reldb'\n * import { err } from '@h-ai/core'\n *\n * const result = err(HaiReldbError.QUERY_FAILED, 'Query failed')\n * if (!result.success) void result.error.code\n * ```\n */\nexport const HaiReldbError = core.error.buildHaiErrorsDef('reldb', ReldbErrorInfo)\n\n// ─── 列定义 ───\n\n/**\n * 列数据类型\n *\n * 统一的列类型定义,会根据不同数据库自动映射:\n *\n * | 类型 | SQLite | PostgreSQL | MySQL |\n * |------------|---------|------------------|--------------|\n * | TEXT | TEXT | TEXT | VARCHAR(255) |\n * | INTEGER | INTEGER | INTEGER/BIGSERIAL | INT/BIGINT |\n * | BIGINT | INTEGER | BIGINT | BIGINT |\n * | REAL | REAL | DOUBLE PRECISION | DOUBLE |\n * | BLOB | BLOB | BYTEA | BLOB |\n * | BOOLEAN | INTEGER | BOOLEAN | TINYINT(1) |\n * | TIMESTAMP | INTEGER | TIMESTAMP | DATETIME |\n * | JSON | TEXT | JSONB | JSON |\n *\n * 注:MySQL 将 TEXT 映射为 VARCHAR(255) 以支持索引和 UNIQUE 约束。\n * INTEGER 在 MySQL autoIncrement 时映射为 BIGINT,在 PostgreSQL 映射为 BIGSERIAL,否则为 32 位 INT/INTEGER。\n * Unix 毫秒应声明为 BIGINT;原始 SQL/CRUD 的 BIGINT 返回形态取决于驱动,可能为 number/string/bigint。\n * 使用 number 的业务仓库须校验 Number.isSafeInteger,超出范围不能直接强转而丢失精度。\n * @example\n * ```ts\n * import type { ColumnType } from '@h-ai/reldb'\n *\n * const value: ColumnType = 'TEXT'\n * void value\n * ```\n */\nexport type ColumnType\n = | 'TEXT'\n | 'INTEGER'\n | 'BIGINT'\n | 'REAL'\n | 'BLOB'\n | 'BOOLEAN'\n | 'TIMESTAMP'\n | 'JSON'\n\n/**\n * 列定义接口\n *\n * 用于定义表的列结构。\n * @example\n * ```ts\n * import type { ReldbColumnDef } from '@h-ai/reldb'\n *\n * const value: ReldbColumnDef = { type: 'INTEGER', primaryKey: true, autoIncrement: true }\n * void value\n * ```\n */\nexport interface ReldbColumnDef {\n /** 列数据类型 */\n type: ColumnType\n /** 是否为主键 */\n primaryKey?: boolean\n /** 是否自增(仅主键有效) */\n autoIncrement?: boolean\n /** 是否非空 */\n notNull?: boolean\n /** 默认值(支持字符串、数字、布尔、null) */\n defaultValue?: string | number | boolean | null\n /** 是否唯一 */\n unique?: boolean\n /** 外键引用 */\n references?: {\n /** 引用的表名 */\n table: string\n /** 引用的列名 */\n column: string\n /** 删除时的行为 */\n onDelete?: 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION'\n /** 更新时的行为 */\n onUpdate?: 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION'\n }\n}\n\n/**\n * 表定义(列名到列定义的映射)\n * @example\n * ```ts\n * import type { ReldbTableDef } from '@h-ai/reldb'\n *\n * const value: ReldbTableDef = { id: { type: 'TEXT', primaryKey: true }, name: { type: 'TEXT', notNull: true } }\n * void value\n * ```\n */\nexport interface ReldbTableDef {\n [columnName: string]: ReldbColumnDef\n}\n\n/**\n * 索引定义\n * @example\n * ```ts\n * import type { ReldbIndexDef } from '@h-ai/reldb'\n *\n * const value: ReldbIndexDef = { columns: ['email'], unique: true }\n * void value\n * ```\n */\nexport interface ReldbIndexDef {\n /** 索引包含的列 */\n columns: string[]\n /** 是否为唯一索引 */\n unique?: boolean\n /**\n * 索引条件(WHERE 子句,用于部分索引)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,不会经过参数化处理,\n * **禁止**将用户输入直接拼接。仅用于开发者编写的静态条件。\n * @example\n * ```ts\n * import type { CrudQueryOptions } from '@h-ai/reldb'\n *\n * const options: CrudQueryOptions = { where: 'name = ?', params: ['Alice'] }\n * void options // 值走绑定参数;SQL 结构由开发者静态编写。\n * ```\n */\n where?: string\n}\n\n// ─── DDL 操作接口 ───\n\n/**\n * DDL(数据定义语言)操作接口\n *\n * 提供表结构管理功能,包括创建/删除表、添加/删除列、创建索引等。\n * 结构修改返回 `HaiResult<void>`;hasTable 返回 `HaiResult<boolean>`,以实际签名为准。\n * @example\n * ```ts\n * import type { DdlOperations } from '@h-ai/reldb'\n *\n * async function use(operations: DdlOperations) {\n * const result = await operations.createTable('users', { id: { type: 'TEXT', primaryKey: true } })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * }\n * ```\n */\nexport interface DdlOperations {\n /**\n * 创建表\n * @param tableName - 表名\n * @param columns - 列定义\n * @param ifNotExists - 是否使用 IF NOT EXISTS(默认 true)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.createTable('users', { id: { type: 'TEXT', primaryKey: true }, name: { type: 'TEXT' } })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n createTable: (tableName: string, columns: ReldbTableDef, ifNotExists?: boolean) => Promise<HaiResult<void>>\n\n /**\n * 删除表\n * @param tableName - 表名\n * @param ifExists - 是否使用 IF EXISTS(默认 true)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.dropTable('users_backup')\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n dropTable: (tableName: string, ifExists?: boolean) => Promise<HaiResult<void>>\n\n /**\n * 添加列\n * @param tableName - 表名\n * @param columnName - 列名\n * @param columnDef - 列定义\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.addColumn('users', 'age', { type: 'INTEGER' })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n addColumn: (tableName: string, columnName: string, columnDef: ReldbColumnDef) => Promise<HaiResult<void>>\n\n /**\n * 删除列\n * @param tableName - 表名\n * @param columnName - 列名\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.dropColumn('users', 'legacy_field')\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n dropColumn: (tableName: string, columnName: string) => Promise<HaiResult<void>>\n\n /**\n * 重命名表\n * @param oldName - 原表名\n * @param newName - 新表名\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.renameTable('users_old', 'users')\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n renameTable: (oldName: string, newName: string) => Promise<HaiResult<void>>\n\n /**\n * 创建索引\n * @param tableName - 表名\n * @param indexName - 索引名\n * @param indexDef - 索引定义\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.createIndex('users', 'users_name_idx', { columns: ['name'] })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n createIndex: (tableName: string, indexName: string, indexDef: ReldbIndexDef) => Promise<HaiResult<void>>\n\n /**\n * 删除索引\n * @param indexName - 索引名\n * @param ifExists - 是否使用 IF EXISTS(默认 true)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.dropIndex('users_name_idx')\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n dropIndex: (indexName: string, ifExists?: boolean) => Promise<HaiResult<void>>\n\n /**\n * 执行原始 DDL SQL\n *\n * **⚠️ 安全警告:** `sql` 参数不会经过标识符校验或参数化处理,\n * **禁止**将用户输入直接拼接到 SQL 中,否则会导致 SQL 注入风险。\n * 仅用于开发者编写的静态 DDL 语句(如 ALTER TABLE)。\n *\n * @param sql - DDL SQL 语句(必须为开发者静态构造,禁止包含用户输入)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.ddl.raw('ALTER TABLE users ADD COLUMN status TEXT')\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n raw: (sql: string) => Promise<HaiResult<void>>\n}\n\n// ─── SQL 操作接口 ───\n\n/**\n * 查询结果行类型\n *\n * 约定为键值对象,字段名与 SQL 返回列一致。\n * @example\n * ```ts\n * import type { QueryRow } from '@h-ai/reldb'\n *\n * const value: QueryRow = { id: 'u1', name: 'Alice' }\n * void value\n * ```\n */\nexport type QueryRow = Record<string, unknown>\n\n/**\n * 执行结果\n *\n * INSERT/UPDATE/DELETE 操作返回的结果。\n * @example\n * ```ts\n * import type { ExecuteResult } from '@h-ai/reldb'\n *\n * const value: ExecuteResult = { changes: 1 }\n * void value\n * ```\n */\nexport interface ExecuteResult {\n /** 影响的行数 */\n changes: number\n /** 最后插入的行 ID(仅 INSERT 时有效) */\n lastInsertRowid?: number | bigint\n}\n\n// ─── 分页类型 ───\n\n/**\n * 规范化后的分页参数\n * @example\n * ```ts\n * import type { NormalizedPagination } from '@h-ai/reldb'\n *\n * const value: NormalizedPagination = { page: 2, pageSize: 10, offset: 10, limit: 10 }\n * void value\n * ```\n */\nexport interface NormalizedPagination extends PaginationOptions {\n /** SQL offset */\n offset: number\n /** SQL limit */\n limit: number\n}\n\n/**\n * 分页参数覆盖\n * @example\n * ```ts\n * import type { PaginationOverrides } from '@h-ai/reldb'\n *\n * const value: PaginationOverrides = { defaultPageSize: 20, maxPageSize: 100 }\n * void value\n * ```\n */\nexport interface PaginationOverrides {\n /** 默认页码 */\n defaultPage?: number\n /** 默认每页数量 */\n defaultPageSize?: number\n /** 最大每页数量 */\n maxPageSize?: number\n}\n\n/**\n * 分页查询参数\n * @example\n * ```ts\n * import type { PaginationQueryOptions } from '@h-ai/reldb'\n *\n * const value: PaginationQueryOptions = { sql: 'SELECT id, name FROM users WHERE active = ?', params: [true], pagination: { page: 2, pageSize: 10 } }\n * void value\n * ```\n */\nexport interface PaginationQueryOptions {\n /** 数据查询 SQL(不含 LIMIT/OFFSET) */\n sql: string\n /** 参数列表 */\n params?: unknown[]\n /** 分页参数 */\n pagination?: PaginationOptionsInput\n /** 覆盖默认分页参数 */\n overrides?: PaginationOverrides\n}\n\n/**\n * 数据读写操作接口(SQL / 事务共享)\n * @example\n * ```ts\n * import type { DmlOperations } from '@h-ai/reldb'\n *\n * async function use(operations: DmlOperations) {\n * const result = await operations.query<{ id: string }>('SELECT id FROM users WHERE name = ?', ['Alice'])\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport interface DmlOperations {\n /**\n * 查询多行\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.sql.query<{ id: string }>('SELECT id FROM users WHERE name = ?', ['Alice'])\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n query: <T = QueryRow>(sql: string, params?: unknown[]) => Promise<HaiResult<T[]>>\n /**\n * 查询单行\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.sql.get<{ id: string }>('SELECT id FROM users WHERE name = ?', ['Alice'])\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n get: <T = QueryRow>(sql: string, params?: unknown[]) => Promise<HaiResult<T | null>>\n /**\n * 执行修改语句(INSERT/UPDATE/DELETE)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.sql.execute('UPDATE users SET name = ? WHERE id = ?', ['Alice', 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n execute: (sql: string, params?: unknown[]) => Promise<HaiResult<ExecuteResult>>\n /**\n * 批量执行多条语句(在同一事务上下文中)\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.sql.batch([{ sql: 'UPDATE users SET name = ? WHERE id = ?', params: ['Alice', 'u1'] }])\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n batch: (statements: Array<{ sql: string, params?: unknown[] }>) => Promise<HaiResult<void>>\n /**\n * 分页查询\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.sql.queryPage<{ id: string }>({ sql: 'SELECT id FROM users', pagination: { page: 1, pageSize: 10 } })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n queryPage: <T = QueryRow>(options: PaginationQueryOptions) => Promise<HaiResult<PaginatedResult<T>>>\n}\n\n// ─── CRUD 抽象类型 ───\n\n/**\n * CRUD 查询条件\n * @example\n * ```ts\n * import type { CrudQueryOptions } from '@h-ai/reldb'\n *\n * const value: CrudQueryOptions = { where: 'name = ?', params: ['Alice'], orderBy: 'id ASC', limit: 10 }\n * void value\n * ```\n */\nexport interface CrudQueryOptions {\n /**\n * WHERE 子句(不包含 WHERE 关键字)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,**禁止**将用户输入直接拼接。\n * 动态值必须通过 `params` 占位符(`?`)传入。\n * @example\n * ```ts\n * import type { CrudQueryOptions } from '@h-ai/reldb'\n *\n * const options: CrudQueryOptions = { where: 'name = ?', params: ['Alice'] }\n * void options // 值走绑定参数;SQL 结构由开发者静态编写。\n * ```\n */\n where?: string\n /** 参数列表 */\n params?: unknown[]\n /** ORDER BY 子句(不包含 ORDER BY 关键字) */\n orderBy?: string\n /** LIMIT */\n limit?: number\n /** OFFSET */\n offset?: number\n}\n\n/**\n * CRUD 分页查询条件\n * @example\n * ```ts\n * import type { CrudPageOptions } from '@h-ai/reldb'\n *\n * const value: CrudPageOptions = { where: 'active = ?', params: [true], pagination: { page: 1, pageSize: 20 } }\n * void value\n * ```\n */\nexport interface CrudPageOptions {\n /**\n * WHERE 子句(不包含 WHERE 关键字)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,**禁止**将用户输入直接拼接。\n * 动态值必须通过 `params` 占位符(`?`)传入。\n * @example\n * ```ts\n * import type { CrudQueryOptions } from '@h-ai/reldb'\n *\n * const options: CrudQueryOptions = { where: 'name = ?', params: ['Alice'] }\n * void options // 值走绑定参数;SQL 结构由开发者静态编写。\n * ```\n */\n where?: string\n /** 参数列表 */\n params?: unknown[]\n /** ORDER BY 子句(不包含 ORDER BY 关键字) */\n orderBy?: string\n /** 分页参数 */\n pagination?: PaginationOptionsInput\n /** 分页参数覆盖 */\n overrides?: PaginationOverrides\n}\n\n/**\n * CRUD 统计条件\n * @example\n * ```ts\n * import type { ReldbCrudCountOptions } from '@h-ai/reldb'\n *\n * const value: ReldbCrudCountOptions = { where: 'active = ?', params: [true] }\n * void value\n * ```\n */\nexport interface ReldbCrudCountOptions {\n /**\n * WHERE 子句(不包含 WHERE 关键字)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,**禁止**将用户输入直接拼接。\n * 动态值必须通过 `params` 占位符(`?`)传入。\n * @example\n * ```ts\n * import type { CrudQueryOptions } from '@h-ai/reldb'\n *\n * const options: CrudQueryOptions = { where: 'name = ?', params: ['Alice'] }\n * void options // 值走绑定参数;SQL 结构由开发者静态编写。\n * ```\n */\n where?: string\n /** 参数列表 */\n params?: unknown[]\n}\n\n/**\n * CRUD 配置\n * @example\n * ```ts\n * import type { CrudConfig } from '@h-ai/reldb'\n *\n * const config: CrudConfig<{ id: string }> = { table: 'users', dbType: 'postgresql', select: ['id'], createColumns: ['id'], updateColumns: [] }\n * void config\n * ```\n */\nexport interface CrudConfig<TItem> {\n /** 表名 */\n table: string\n /** 主键列名(默认 id) */\n idColumn?: string\n /** 查询列(默认 *) */\n select?: string[]\n /** 允许插入的列(不填则使用数据本身列) */\n createColumns?: string[]\n /** 允许更新的列(不填则使用数据本身列) */\n updateColumns?: string[]\n /** 行映射函数(可选) */\n mapRow?: (row: QueryRow) => TItem\n /** 数据库类型 */\n dbType: DbType\n}\n\n/**\n * CRUD 字段定义\n * @example\n * ```ts\n * import type { ReldbCrudFieldDefinition } from '@h-ai/reldb'\n *\n * const value: ReldbCrudFieldDefinition = { fieldName: 'name', columnName: 'name', def: { type: 'TEXT', notNull: true }, select: true, create: true, update: true }\n * void value\n * ```\n */\nexport interface ReldbCrudFieldDefinition {\n /** 对象字段名 */\n fieldName: string\n /** 数据库列名 */\n columnName: string\n /** 列定义 */\n def: ReldbColumnDef\n /** 是否用于查询 */\n select: boolean\n /** 是否允许插入 */\n create: boolean\n /** 是否允许更新 */\n update: boolean\n}\n\n/**\n * BaseReldbCrudRepository 配置\n * @example\n * ```ts\n * import type { BaseReldbCrudRepositoryConfig } from '@h-ai/reldb'\n *\n * const config: BaseReldbCrudRepositoryConfig<{ id: string }> = {\n * table: 'users', idField: 'id', fields: [\n * { fieldName: 'id', columnName: 'id', def: { type: 'TEXT', primaryKey: true }, select: true, create: true, update: false },\n * ],\n * }\n * void config\n * ```\n */\nexport interface BaseReldbCrudRepositoryConfig<TItem> {\n /** 表名 */\n table: string\n /** 字段定义 */\n fields: ReldbCrudFieldDefinition[]\n /** 主键列名(默认 id) */\n idColumn?: string\n /** 主键字段名(默认与 idColumn 相同) */\n idField?: keyof TItem & string\n /** 是否自动创建表(默认 true) */\n createTableIfNotExists?: boolean\n /** 主键生成策略(未提供则尝试使用 crypto.randomUUID) */\n generateId?: () => string | number\n /** 当前时间提供者(默认 Date.now) */\n nowProvider?: () => number\n}\n\n/**\n * CRUD 仓库接口\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(operations: ReldbCrudRepository<{ id: string }>) {\n * const result = await operations.findById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport interface ReldbCrudRepository<TItem> {\n create: (data: Record<string, unknown>, tx?: DmlWithTxOperations) => Promise<HaiResult<ExecuteResult>>\n createMany: (items: Array<Record<string, unknown>>, tx?: DmlWithTxOperations) => Promise<HaiResult<void>>\n createOrUpdate: (data: Record<string, unknown>, tx?: DmlWithTxOperations) => Promise<HaiResult<ExecuteResult>>\n findById: (id: unknown, tx?: DmlWithTxOperations) => Promise<HaiResult<TItem | null>>\n getById: (id: unknown, tx?: DmlWithTxOperations) => Promise<HaiResult<TItem>>\n findAll: (options?: CrudQueryOptions, tx?: DmlWithTxOperations) => Promise<HaiResult<TItem[]>>\n findPage: (options: CrudPageOptions, tx?: DmlWithTxOperations) => Promise<HaiResult<PaginatedResult<TItem>>>\n updateById: (id: unknown, data: Record<string, unknown>, tx?: DmlWithTxOperations) => Promise<HaiResult<ExecuteResult>>\n deleteById: (id: unknown, tx?: DmlWithTxOperations) => Promise<HaiResult<ExecuteResult>>\n count: (options?: ReldbCrudCountOptions, tx?: DmlWithTxOperations) => Promise<HaiResult<number>>\n exists: (options?: ReldbCrudCountOptions, tx?: DmlWithTxOperations) => Promise<HaiResult<boolean>>\n existsById: (id: unknown, tx?: DmlWithTxOperations) => Promise<HaiResult<boolean>>\n}\n\n/**\n * CRUD 管理器(统一入口)\n * @example\n * ```ts\n * import type { CrudManager } from '@h-ai/reldb'\n *\n * async function use(operations: CrudManager) {\n * const result = await operations.table<{ id: string }>({ table: 'users', dbType: 'postgresql' }).findById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport interface CrudManager {\n /** 获取单表 CRUD 仓库 */\n table: <TItem>(config: CrudConfig<TItem>) => ReldbCrudRepository<TItem>\n}\n\n// ─── 事务接口 ───\n\n/**\n * 事务句柄接口(分步事务)\n * @example\n * ```ts\n * import type { DmlWithTxOperations } from '@h-ai/reldb'\n *\n * async function use(operations: DmlWithTxOperations) {\n * const result = await operations.execute('UPDATE users SET name = ? WHERE id = ?', ['Alice', 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * const committed = await operations.commit()\n * if (!committed.success) throw new Error(committed.error.message)\n * return result.data.changes\n * }\n * ```\n */\nexport interface DmlWithTxOperations extends DmlOperations {\n /** CRUD 管理器 */\n crud: CrudManager\n /** 提交事务 */\n commit: () => Promise<HaiResult<void>>\n /** 回滚事务 */\n rollback: () => Promise<HaiResult<void>>\n}\n\n/**\n * 事务回调函数类型\n *\n * @param tx - 事务内操作对象\n * @returns 业务返回值(将被包装为 HaiResult);callback 抛错才回滚,返回失败 HaiResult 不会被自动展开。\n * @example\n * ```ts\n * import type { TxWrapCallback } from '@h-ai/reldb'\n *\n * const insert: TxWrapCallback<number> = async (tx) => {\n * const result = await tx.execute('INSERT INTO users (id, name) VALUES (?, ?)', ['u1', 'Alice'])\n * if (!result.success) throw new Error(result.error.message) // 显式抛错触发 wrap 回滚。\n * return result.data.changes\n * }\n * void insert\n * ```\n */\nexport type TxWrapCallback<T> = (tx: DmlWithTxOperations) => Promise<T>\n\n/**\n * 事务管理器\n * @example\n * ```ts\n * import type { TxManager } from '@h-ai/reldb'\n *\n * async function use(operations: TxManager) {\n * const result = await operations.wrap(async (tx) => {\n * const changed = await tx.execute('UPDATE users SET name = ? WHERE id = ?', ['Alice', 'u1'])\n * if (!changed.success) throw new Error(changed.error.message)\n * return changed.data.changes\n * })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport interface TxManager {\n /** 开启事务(分步事务) */\n begin: () => Promise<HaiResult<DmlWithTxOperations>>\n /** 包裹事务(自动提交/回滚) */\n wrap: <T>(fn: TxWrapCallback<T>) => Promise<HaiResult<T>>\n}\n\n// ─── 数据库函数接口 ───\n\n/**\n * 数据库函数接口\n *\n * 统一的数据库访问入口,通过 `reldb` 对象提供所有数据库操作。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const initialized = await reldb.init({ type: 'sqlite', database: ':memory:' }) // 仅示例/测试。\n * if (!initialized.success) throw new Error(initialized.error.message)\n * try {\n * const created = await reldb.ddl.createTable('users', { id: { type: 'TEXT', primaryKey: true }, name: { type: 'TEXT' } })\n * if (!created.success) throw new Error(created.error.message)\n * const inserted = await reldb.sql.execute('INSERT INTO users (id, name) VALUES (?, ?)', ['u1', 'Alice'])\n * if (!inserted.success) throw new Error(inserted.error.message)\n * } finally {\n * const closed = await reldb.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * }\n * ```\n */\nexport interface ReldbFunctions {\n /**\n * 初始化数据库连接\n *\n * @param config - 数据库配置\n * @returns 初始化结果\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.init({ type: 'sqlite', database: ':memory:' })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n init: (config: ReldbConfigInput) => Promise<HaiResult<void>>\n\n /** DDL 操作(表结构管理) */\n readonly ddl: DdlOperations\n\n /** SQL 操作(数据查询和修改) */\n readonly sql: DmlOperations\n\n /** CRUD 管理器 */\n readonly crud: CrudManager\n\n /** 事务管理器 */\n readonly tx: TxManager\n\n /**\n * 只读查询当前数据库真实列名;sql 可指定当前事务,不创建表。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n * const columns = await reldb.schemaColumns('hai_iam_users')\n * if (!columns.success) throw new Error(columns.error.message)\n * ```\n */\n schemaColumns: (table: string, sql?: DmlOperations) => Promise<HaiResult<string[]>>\n\n /** 当前数据库脱敏配置快照(未初始化时为 null) */\n readonly config: ReldbConfig | null\n\n /** 是否已初始化 */\n readonly isInitialized: boolean\n\n /** 分页工具 */\n readonly pagination: {\n /** 规范化分页参数 */\n normalize: (options?: PaginationOptionsInput, overrides?: PaginationOverrides) => NormalizedPagination\n /** 构建分页结果 */\n build: <T>(items: T[], total: number, pagination: PaginationOptions) => PaginatedResult<T>\n }\n\n /**\n * JSON 操作 SQL 构建器\n *\n * 提供跨数据库统一的 JSON 路径操作(提取、设置、插入、删除、合并)。\n * 返回的 SQL 片段可嵌入 `reldb.sql.query` / `reldb.sql.execute` 等调用。\n *\n * 未初始化时默认返回 SQLite 格式的构建器;初始化后自动匹配当前数据库类型。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.set('settings', '$.theme', 'dark')\n * const result = await reldb.sql.execute(`UPDATE users SET settings = ${expression.sql} WHERE id = ?`, [...expression.params, 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\n readonly json: ReldbJsonOps\n\n /**\n * 等待初始化/在途事务并关闭连接;清理失败后操作不可用,资源保留供重试。\n * @returns 资源全部释放时成功;未初始化时同样成功。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.close()\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n close: () => Promise<HaiResult<void>>\n}\n","/**\n * @h-ai/reldb — CRUD 仓库基类\n *\n * 提供 `BaseReldbCrudRepository` 抽象基类,供业务仓库继承复用。\n * @module reldb-crud-repository\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type { ReldbConfig } from './reldb-config.js'\nimport type {\n BaseReldbCrudRepositoryConfig,\n CrudPageOptions,\n CrudQueryOptions,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n QueryRow,\n ReldbCrudCountOptions,\n ReldbCrudFieldDefinition,\n ReldbCrudRepository,\n ReldbFunctions,\n ReldbTableDef,\n} from './reldb-types.js'\n\nimport { err, ok } from '@h-ai/core'\nimport { reldbM } from './reldb-i18n.js'\nimport { HaiReldbError } from './reldb-types.js'\n\n/**\n * CRUD 仓库基类\n *\n * 提供通用的单表 CRUD 操作封装,业务仓库可继承该类实现自定义逻辑。\n *\n * 核心能力:\n * - 自动建表(默认开启,可通过 `createTableIfNotExists: false` 关闭)\n * - 字段级别的权限控制(select / create / update 分别配置)\n * - 自动填充主键、createdAt、updatedAt\n * - 跨数据库类型值转换(BOOLEAN / TIMESTAMP / JSON)\n * - 支持事务上下文(所有方法均接受可选 tx 参数)\n * @example\n * ```ts\n * import { BaseReldbCrudRepository, type ReldbFunctions } from '@h-ai/reldb'\n *\n * type User = { id: string, name: string }\n * class Users extends BaseReldbCrudRepository<User> {\n * constructor(db: ReldbFunctions) {\n * super(db, { table: 'users', fields: [\n * { fieldName: 'id', columnName: 'id', def: { type: 'TEXT', primaryKey: true }, select: true, create: true, update: false },\n * { fieldName: 'name', columnName: 'name', def: { type: 'TEXT' }, select: true, create: true, update: true },\n * ] })\n * }\n * }\n * async function create(db: ReldbFunctions) { // db 已初始化。\n * const result = await new Users(db).create({ name: 'Alice' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * ```\n */\nexport abstract class BaseReldbCrudRepository<TItem> implements ReldbCrudRepository<TItem> {\n /** 底层 CRUD 仓库实例(基于 reldb-crud-kernel 创建) */\n protected readonly crud: ReldbCrudRepository<TItem>\n /** 数据库服务对象 */\n protected readonly db: ReldbFunctions\n /** 字段定义列表 */\n private readonly fields: ReldbCrudFieldDefinition[]\n /** 主键字段名(对象侧) */\n private readonly idField?: string\n /** 主键列名(数据库侧) */\n private readonly idColumn: string\n /** 主键生成器 */\n private readonly generateId?: () => string | number\n /** 当前时间提供者(默认 Date.now) */\n private readonly nowProvider: () => number\n /** 初始化 Promise(自动建表等) */\n private readonly initPromise: Promise<HaiResult<void>>\n /** 可查询列 */\n private readonly selectColumns: string[]\n /** 可插入列 */\n private readonly createColumns: string[]\n /** 可更新列 */\n private readonly updateColumns: string[]\n /** 表名 */\n private readonly table: string\n /** 当前数据库类型(延迟读取,确保获取初始化后的值) */\n private get dbType(): ReldbConfig['type'] {\n return this.db.config!.type\n }\n\n /**\n * 创建 BaseReldbCrudRepository\n *\n * 初始化字段映射、构建表结构(默认自动建表)并配置底层 CRUD 仓库。\n *\n * @param db - 数据库服务对象\n * @param config - BaseReldbCrudRepository 配置(表名、字段定义、主键策略等)\n */\n protected constructor(db: ReldbFunctions, config: BaseReldbCrudRepositoryConfig<TItem>) {\n this.db = db\n this.table = config.table\n this.fields = config.fields\n this.idColumn = config.idColumn ?? 'id'\n this.idField = config.idField ?? this.resolveIdField(config.fields, this.idColumn)\n this.generateId = config.generateId ?? this.defaultIdGenerator()\n this.nowProvider = config.nowProvider ?? (() => Date.now())\n\n // 构建表结构定义并按需创建表(默认开启)\n const tableDef = this.buildReldbTableDef(config.fields)\n const createTable = config.createTableIfNotExists !== false\n ? this.db.ddl.createTable(config.table, tableDef, true)\n : Promise.resolve(ok(undefined))\n\n this.initPromise = createTable\n\n // 选择、创建、更新字段的列集合\n this.selectColumns = this.fields.filter(field => field.select).map(field => field.columnName)\n this.createColumns = this.fields.filter(field => field.create).map(field => field.columnName)\n const updateColumns = this.fields.filter(field => field.update).map(field => field.columnName)\n const updatedAtField = this.fields.find(field => this.isUpdatedAtField(field))\n this.updateColumns = updatedAtField && !updateColumns.includes(updatedAtField.columnName)\n ? [...updateColumns, updatedAtField.columnName]\n : updateColumns\n\n this.crud = this.db.crud.table<TItem>({\n table: config.table,\n idColumn: this.idColumn,\n select: this.selectColumns,\n createColumns: this.createColumns,\n updateColumns: this.updateColumns,\n mapRow: (row: Record<string, unknown>) => this.mapRow(row),\n get dbType() { return db.config!.type },\n })\n }\n\n /**\n * 获取 SQL 操作对象(自动选择 reldb.sql 或 tx)\n *\n * 当传入事务句柄时,自动使用事务内 DataOperations;否则使用 reldb.sql。\n *\n * @param tx - 可选事务句柄\n * @returns DataOperations 实例\n */\n protected sql(tx?: DmlWithTxOperations): DmlOperations {\n return tx ?? this.db.sql\n }\n\n /**\n * 解析主键字段\n *\n * 优先使用声明为主键的字段;如果未声明主键,则回退到列名匹配。\n *\n * @param fields - 字段定义列表\n * @param idColumn - 主键列名\n * @returns 主键字段名(可能为空)\n */\n private resolveIdField(fields: ReldbCrudFieldDefinition[], idColumn: string): string | undefined {\n const primary = fields.find(field => field.def.primaryKey)\n if (primary) {\n // 显式主键优先\n return primary.fieldName\n }\n // 回退到列名匹配\n const byColumn = fields.find(field => field.columnName === idColumn)\n return byColumn?.fieldName\n }\n\n /**\n * 生成默认主键生成器\n *\n * 在运行环境支持 `crypto.randomUUID` 时返回 UUID 生成函数,否则返回 undefined。\n */\n private defaultIdGenerator(): (() => string | number) | undefined {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n // 浏览器或 Node 环境支持 UUID\n return () => crypto.randomUUID()\n }\n // 无可用生成器时交由上层提供或数据库自增\n return undefined\n }\n\n /**\n * 构建表结构定义\n *\n * @param fields - 字段定义列表\n * @returns 表结构定义\n */\n private buildReldbTableDef(fields: ReldbCrudFieldDefinition[]): ReldbTableDef {\n const entries = fields.map(field => [\n field.columnName,\n this.normalizeReldbColumnDef(field.def),\n ] as const)\n return Object.fromEntries(entries)\n }\n\n /**\n * 归一化列定义\n *\n * 用于处理不同数据库对默认值的兼容差异(例如 BOOLEAN)。\n */\n private normalizeReldbColumnDef(def: ReldbCrudFieldDefinition['def']): ReldbCrudFieldDefinition['def'] {\n if (def.defaultValue === undefined || def.defaultValue === null) {\n // 无默认值时直接返回\n return def\n }\n if (def.type !== 'BOOLEAN' || typeof def.defaultValue === 'string') {\n // 仅处理布尔且非字符串的默认值\n return def\n }\n\n const normalized: ReldbCrudFieldDefinition['def'] = { ...def }\n if (this.dbType === 'postgresql') {\n // PostgreSQL 支持 true/false\n normalized.defaultValue = Boolean(def.defaultValue)\n return normalized\n }\n // SQLite/MySQL 使用 1/0\n normalized.defaultValue = def.defaultValue ? 1 : 0\n return normalized\n }\n\n /**\n * 判断是否为创建时间字段\n */\n private isCreatedAtField(field: ReldbCrudFieldDefinition): boolean {\n return field.fieldName === 'createdAt' || field.columnName === 'created_at'\n }\n\n /**\n * 判断是否为更新时间字段\n */\n private isUpdatedAtField(field: ReldbCrudFieldDefinition): boolean {\n return field.fieldName === 'updatedAt' || field.columnName === 'updated_at'\n }\n\n /**\n * 将数据库值转换为业务值\n *\n * @param value - 数据库原始值\n * @param def - 字段定义\n * @returns 业务侧值(可能为 undefined)\n */\n private fromDbValue(value: unknown, def: ReldbCrudFieldDefinition['def']): unknown {\n if (value === null || value === undefined) {\n // DB 空值统一映射为 undefined\n return undefined\n }\n if (def.type === 'BOOLEAN') {\n // 兼容 0/1、true/false\n return Boolean(value)\n }\n if (def.type === 'TIMESTAMP') {\n if (value instanceof Date) {\n return value\n }\n if (typeof value === 'number') {\n return new Date(value)\n }\n // 尝试解析字符串时间\n const parsed = Date.parse(String(value))\n return Number.isNaN(parsed)\n ? undefined\n : new Date(parsed)\n }\n if (def.type === 'JSON') {\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as unknown\n }\n catch {\n // JSON 解析失败时返回 undefined\n return undefined\n }\n }\n return value\n }\n return value\n }\n\n /**\n * 将业务值转换为数据库值\n *\n * @param value - 业务侧值\n * @param def - 字段定义\n * @returns 适配数据库的值\n */\n private toDbValue(value: unknown, def: ReldbCrudFieldDefinition['def']): unknown {\n if (value === undefined) {\n // undefined 表示不写入\n return undefined\n }\n if (value === null) {\n // null 保持为数据库 NULL\n return null\n }\n if (def.type === 'BOOLEAN') {\n if (this.dbType === 'postgresql') {\n // PostgreSQL 直接使用 boolean\n return Boolean(value)\n }\n // SQLite/MySQL 使用 1/0\n return value ? 1 : 0\n }\n if (def.type === 'TIMESTAMP') {\n if (this.dbType === 'sqlite') {\n if (value instanceof Date) {\n return value.getTime()\n }\n if (typeof value === 'number') {\n return value\n }\n // SQLite 以毫秒时间戳存储\n const parsed = Date.parse(String(value))\n return Number.isNaN(parsed)\n ? value\n : parsed\n }\n if (value instanceof Date) {\n return value\n }\n if (typeof value === 'number') {\n return new Date(value)\n }\n return value\n }\n if (def.type === 'JSON') {\n if (typeof value === 'string') {\n // 已是 JSON 字符串\n return value\n }\n // 统一序列化为字符串\n return JSON.stringify(value)\n }\n return value\n }\n\n /**\n * 将查询行映射为业务模型\n */\n private mapRow(row: QueryRow): TItem {\n const result = {} as TItem\n const resultRecord = result as Record<string, unknown>\n for (const field of this.fields) {\n if (!field.select) {\n // 不可查询字段直接跳过\n continue\n }\n const value = this.fromDbValue(row[field.columnName], field.def)\n resultRecord[field.fieldName] = value\n }\n // 行映射结果为动态构建的对象,无法通过 TS 静态推导,需在最终返回时做单次对象断言\n return result\n }\n\n /**\n * 构建创建数据的列值映射\n *\n * 处理主键生成、默认值、createdAt/updatedAt 填充等规则。\n */\n private buildCreatePayload(data: Record<string, unknown>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n const now = this.nowProvider()\n\n let generatedId: string | number | undefined\n const idFieldDef = this.fields.find(field => field.fieldName === this.idField)\n if (this.idField && !idFieldDef?.def.autoIncrement) {\n const currentId = data[this.idField]\n if (currentId !== undefined) {\n // 已提供主键,直接使用\n }\n else if (this.generateId) {\n // 未提供主键,使用生成器\n generatedId = this.generateId()\n }\n }\n\n for (const field of this.fields) {\n if (!field.create) {\n // 不允许写入的字段跳过\n continue\n }\n\n let value = data[field.fieldName]\n\n if (value === undefined && field.def.autoIncrement) {\n // 自增字段留给数据库生成\n continue\n }\n\n if (field.fieldName === this.idField && value === undefined && generatedId !== undefined) {\n // 使用自动生成的主键\n value = generatedId\n }\n\n if (value === undefined) {\n if (this.isCreatedAtField(field) || this.isUpdatedAtField(field)) {\n // 默认填充创建/更新时间\n value = now\n }\n else if (field.def.defaultValue !== undefined && typeof field.def.defaultValue !== 'string') {\n // 非字符串默认值直接写入\n value = field.def.defaultValue\n }\n }\n\n if (value === undefined) {\n // 仍为空则跳过该列\n continue\n }\n\n payload[field.columnName] = this.toDbValue(value, field.def)\n }\n\n return payload\n }\n\n /**\n * 构建更新数据的列值映射\n *\n * 当没有任何可更新字段时返回 null。\n */\n private buildUpdatePayload(data: Record<string, unknown>): Record<string, unknown> | null {\n const payload: Record<string, unknown> = {}\n const now = this.nowProvider()\n\n for (const field of this.fields) {\n if (!field.update) {\n // 不允许更新的字段跳过\n continue\n }\n const value = data[field.fieldName]\n if (value === undefined) {\n // 未提供更新值则跳过\n continue\n }\n payload[field.columnName] = this.toDbValue(value, field.def)\n }\n\n if (Object.keys(payload).length === 0) {\n // 无可更新字段\n return null\n }\n\n const updatedAtField = this.fields.find(field => this.isUpdatedAtField(field))\n if (updatedAtField) {\n // 统一补写更新时间\n payload[updatedAtField.columnName] = this.toDbValue(now, updatedAtField.def)\n }\n\n return payload\n }\n\n /**\n * 等待初始化完成(自动建表等)\n *\n * 内置 CRUD 方法均已在执行前调用;自定义方法若通过 `this.sql()` 直接执行原始\n * SQL(尤其是写操作或在事务中),应先 `await this.ensureReady()` 以避免表尚未\n * 建好时(例如刚 dropTable 后、或后端建表较慢时)产生「表不存在」的竞态失败。\n *\n * @returns 初始化结果\n */\n protected async ensureReady(): Promise<HaiResult<void>> {\n const result = await this.initPromise\n if (!result.success) {\n // 透传初始化失败结果\n return result\n }\n return ok(undefined)\n }\n\n /** 验证框架仓库使用当前字段定义,结构不符时停止发布仓库。 */\n protected async ensureSchema(): Promise<HaiResult<void>> {\n const ready = await this.ensureReady()\n if (!ready.success)\n return ready\n const columns = await this.db.schemaColumns(this.table)\n if (!columns.success)\n return columns\n const names = new Set(columns.data)\n if (names.size !== this.fields.length || this.fields.some(field => !names.has(field.columnName))) {\n return err(HaiReldbError.DDL_FAILED, reldbM('reldb_schemaMismatch', {\n params: { table: this.table },\n }))\n }\n return ok(undefined)\n }\n\n /**\n * 创建单条记录\n *\n * 自动处理主键生成、createdAt/updatedAt 填充、字段类型转换。\n *\n * @param data - 业务字段与值的映射\n * @param tx - 可选事务句柄\n * @returns 插入结果(含 changes、lastInsertRowid)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.create({ name: 'Alice' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async create(data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<ExecuteResult>\n }\n const payload = this.buildCreatePayload(data)\n if (Object.keys(payload).length === 0) {\n // 无可写入字段时返回配置错误\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudEmptyPayload'))\n }\n return this.crud.create(payload, tx)\n }\n\n /**\n * 批量创建记录\n *\n * 每条记录均通过 buildCreatePayload 处理,然后以 batch 方式写入。\n *\n * @param items - 待插入的业务数据数组\n * @param tx - 可选事务句柄\n * @returns 批量插入结果\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.createMany([{ name: 'Alice' }, { name: 'Bob' }])\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async createMany(items: Array<Record<string, unknown>>, tx?: DmlWithTxOperations): Promise<HaiResult<void>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<void>\n }\n const payloads = items.map(item => this.buildCreatePayload(item))\n return this.crud.createMany(payloads, tx)\n }\n\n /**\n * 创建或更新单条记录(upsert)\n *\n * 主键存在时更新可更新字段,否则插入新记录。\n * 自动处理主键生成、createdAt/updatedAt 填充、字段类型转换。\n * 更新时仅写入用户显式提供的可更新字段,不会用默认值覆盖已有数据。\n *\n * ### 为什么不复用 this.crud.createOrUpdate(kernel)\n *\n * Kernel 的 createOrUpdate 使用 `excluded.col` / `VALUES(col)` 引用 INSERT 值作为\n * UPDATE 值,即 INSERT 和 UPDATE 共享同一组数据。但 Repository 层的 INSERT 负载和\n * UPDATE 负载语义不同:\n *\n * - **INSERT 负载**(buildCreatePayload):包含自动生成的主键、createdAt、updatedAt、\n * 字段默认值(如 `status: 'active'`)等应用层填充值。\n * - **UPDATE 负载**(buildUpdatePayload):仅包含用户显式传入的可更新字段 + updatedAt,\n * 不包含 createdAt(避免覆盖原始创建时间)、不包含应用默认值(避免覆盖已有数据)。\n *\n * 若复用 kernel,冲突更新时会将 INSERT 的 createdAt、默认值等一并写入,破坏已有记录。\n * 因此 Repository 自行构建两份独立负载,使用 `col = ?` 参数化占位分别传入 INSERT 值\n * 和 UPDATE 值,通过 this.sql(tx).execute() 直接执行。\n *\n * @param data - 业务字段与值的映射\n * @param tx - 可选事务句柄\n * @returns 执行结果(含 changes)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.createOrUpdate({ id: 'u1', name: 'Alice' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async createOrUpdate(data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<ExecuteResult>\n }\n\n const dbType = this.dbType\n\n // INSERT 负载:含 createdAt、默认值、生成的主键等应用层填充值\n const createPayload = this.buildCreatePayload(data)\n\n // 确保主键包含在插入负载中(upsert 需要主键来触发冲突检测)\n // 当主键为 autoIncrement 且 create: false 时,buildCreatePayload 不会包含它\n if (this.idField && data[this.idField] !== undefined) {\n const idFieldDef = this.fields.find(f => f.fieldName === this.idField)\n if (idFieldDef && !(idFieldDef.columnName in createPayload)) {\n createPayload[idFieldDef.columnName] = this.toDbValue(data[this.idField], idFieldDef.def)\n }\n }\n\n if (Object.keys(createPayload).length === 0) {\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudEmptyPayload'))\n }\n\n const insertColumns = Object.keys(createPayload)\n const insertValues = Object.values(createPayload)\n const placeholders = insertColumns.map(() => '?').join(', ')\n\n // UPDATE 负载:仅用户显式传入的可更新字段 + updatedAt\n // 与 INSERT 负载独立,不含 createdAt / 应用默认值,避免冲突更新时覆盖已有数据\n const updatePayload = this.buildUpdatePayload(data)\n\n if (!updatePayload || Object.keys(updatePayload).length === 0) {\n // 无可更新列,退化为普通 INSERT\n const sql = `INSERT INTO ${this.table} (${insertColumns.join(', ')}) VALUES (${placeholders})`\n return this.sql(tx).execute(sql, insertValues)\n }\n\n const updateColumns = Object.keys(updatePayload)\n const updateValues = Object.values(updatePayload)\n // 使用 col = ? 参数化占位(而非 kernel 的 excluded.col / VALUES(col)),\n // 使 UPDATE 值独立于 INSERT 值\n const updateSet = updateColumns.map(col => `${col} = ?`).join(', ')\n\n let sql: string\n if (dbType === 'mysql') {\n sql = `INSERT INTO ${this.table} (${insertColumns.join(', ')}) VALUES (${placeholders}) ON DUPLICATE KEY UPDATE ${updateSet}`\n }\n else {\n // SQLite / PostgreSQL\n sql = `INSERT INTO ${this.table} (${insertColumns.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${this.idColumn}) DO UPDATE SET ${updateSet}`\n }\n\n // 参数顺序:先 INSERT 值,再 UPDATE 值(两组独立)\n return this.sql(tx).execute(sql, [\n ...insertValues,\n ...updateValues,\n ])\n }\n\n /**\n * 根据主键查找单条记录\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 业务模型对象或 null(未找到)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.findById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async findById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<TItem | null>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<TItem | null>\n }\n return this.crud.findById(id, tx)\n }\n\n /**\n * 根据主键获取单条记录(必须存在)\n *\n * 与 findById 不同,当记录不存在时返回 RECORD_NOT_FOUND 错误。\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 业务模型对象(不存在时返回错误)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.getById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async getById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<TItem>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<TItem>\n }\n return this.crud.getById(id, tx)\n }\n\n /**\n * 条件查询多条记录\n *\n * @param options - 查询条件(where、orderBy、limit、offset)\n * @param tx - 可选事务句柄\n * @returns 业务模型数组\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.findAll({ where: 'name = ?', params: ['Alice'] })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async findAll(options?: CrudQueryOptions, tx?: DmlWithTxOperations): Promise<HaiResult<TItem[]>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<TItem[]>\n }\n return this.crud.findAll(options, tx)\n }\n\n /**\n * 分页查询记录\n *\n * @param options - 分页查询条件(where、orderBy、pagination、overrides)\n * @param tx - 可选事务句柄\n * @returns 分页结果(含 items、total、page、pageSize)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.findPage({ pagination: { page: 1, pageSize: 10 }, orderBy: 'id ASC' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async findPage(options: CrudPageOptions, tx?: DmlWithTxOperations): Promise<HaiResult<PaginatedResult<TItem>>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<PaginatedResult<TItem>>\n }\n return this.crud.findPage(options, tx)\n }\n\n /**\n * 根据主键更新记录\n *\n * 自动填充 updatedAt 字段。无可更新字段时返回 CONFIG_ERROR。\n *\n * @param id - 主键值\n * @param data - 待更新的业务字段\n * @param tx - 可选事务句柄\n * @returns 更新结果(含 changes)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.updateById('u1', { name: 'Bob' })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async updateById(id: unknown, data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<ExecuteResult>\n }\n const payload = this.buildUpdatePayload(data)\n if (!payload) {\n // 无可更新字段时返回配置错误\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudEmptyPayload'))\n }\n return this.crud.updateById(id, payload, tx)\n }\n\n /**\n * 根据主键删除记录\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 删除结果(含 changes)\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.deleteById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async deleteById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<ExecuteResult>\n }\n return this.crud.deleteById(id, tx)\n }\n\n /**\n * 统计符合条件的记录数\n *\n * @param options - 查询条件(where、params)\n * @param tx - 可选事务句柄\n * @returns 记录数\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.count({ where: 'name = ?', params: ['Alice'] })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async count(options?: ReldbCrudCountOptions, tx?: DmlWithTxOperations): Promise<HaiResult<number>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<number>\n }\n return this.crud.count(options, tx)\n }\n\n /**\n * 检查是否存在符合条件的记录\n *\n * @param options - 查询条件(where、params)\n * @param tx - 可选事务句柄\n * @returns 是否存在\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.exists({ where: 'name = ?', params: ['Alice'] })\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async exists(options?: ReldbCrudCountOptions, tx?: DmlWithTxOperations): Promise<HaiResult<boolean>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<boolean>\n }\n return this.crud.exists(options, tx)\n }\n\n /**\n * 根据主键检查记录是否存在\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 是否存在\n * @example\n * ```ts\n * import type { ReldbCrudRepository } from '@h-ai/reldb'\n *\n * async function use(repo: ReldbCrudRepository<{ id: string, name: string }>) {\n * const result = await repo.existsById('u1')\n * if (!result.success) throw new Error(result.error.message)\n * return result.data\n * }\n * void use\n * ```\n */\n async existsById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<boolean>> {\n const ready = await this.ensureReady()\n if (!ready.success) {\n return ready as HaiResult<boolean>\n }\n return this.crud.existsById(id, tx)\n }\n}\n","/**\n * @h-ai/reldb — JSON 操作 SQL 构建器\n *\n * 为不同数据库后端提供统一的 JSON 路径操作 SQL 表达式构建能力。\n * 路径支持简单点号与方括号路径(`$.key` / `$.key.subkey` / `$[0]`),不是完整 SQL/JSON Path 校验器。\n *\n * 各数据库后端映射:\n *\n * | 操作 | SQLite | PostgreSQL | MySQL |\n * |---------|----------------------|-------------------------------|-----------------------------|\n * | extract | json_extract | #> (text[]) | JSON_EXTRACT |\n * | set | json_set + json() | jsonb_set + ::jsonb | JSON_SET + CAST AS JSON |\n * | insert | json_insert + json() | jsonb_insert + ::jsonb | JSON_INSERT + CAST AS JSON |\n * | remove | json_remove | #- (text[]) | JSON_REMOVE |\n * | merge | json_patch | 参数化递归 CTE | JSON_MERGE_PATCH + CAST |\n *\n * @module reldb-json\n */\n\nimport { reldbM } from './reldb-i18n.js'\n\n// ─── 类型定义 ───\n\n/**\n * JSON SQL 表达式结果\n *\n * 包含可嵌入 SQL 语句的表达式片段与对应参数列表。\n * 参数占位符统一使用 `?`,各 Provider 会在执行前自动转换。\n * @example\n * ```ts\n * import { createJsonOps, type JsonSqlExpr } from '@h-ai/reldb'\n *\n * const expression: JsonSqlExpr = createJsonOps('postgresql').set('settings', '$.theme', 'dark')\n * void [expression.sql, expression.params]\n * ```\n */\nexport interface JsonSqlExpr {\n /** SQL 表达式片段(含 ? 占位符) */\n sql: string\n /** 参数列表(对应 ? 占位符,顺序与 sql 中出现顺序一致) */\n params: unknown[]\n}\n\n/**\n * JSON 操作接口\n *\n * 提供跨数据库统一的 JSON 路径操作 SQL 构建能力。\n * 所有方法返回 `JsonSqlExpr`,可嵌入 `reldb.sql.query` / `reldb.sql.execute` 等调用。\n *\n * 路径使用以下简单形式,建议以 `$` 开头:\n * - 对象字段:`$.key`、`$.key.subkey`\n * - 数组元素:`$[0]`、`$.items[1]`\n * @example\n * ```ts\n * import { createJsonOps, type ReldbJsonOps } from '@h-ai/reldb'\n *\n * const json: ReldbJsonOps = createJsonOps('postgresql')\n * const patch = json.merge('settings', { theme: 'dark', obsolete: null })\n * void patch // 作为同一次 UPDATE 的 SQL 表达式执行,值在 params。\n * ```\n */\nexport interface ReldbJsonOps {\n /**\n * JSON 路径提取表达式\n *\n * 提取 JSON 列中指定路径的值,返回 JSON 类型的值。\n * 可用于 SELECT 列表、WHERE 条件或 ORDER BY。\n *\n * @param column - 列名(或 SQL 列表达式,开发者负责安全性,禁止传入用户输入)\n * @param path - JSON 路径(如 `$.status`、`$.user.name`、`$[0]`)\n * @returns SQL 表达式与参数\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.extract('settings', '$.theme')\n * void [expression.sql, expression.params]\n * ```\n */\n extract: (column: string, path: string) => JsonSqlExpr\n\n /**\n * JSON 路径设置表达式(创建或替换)\n *\n * 设置指定路径的值;PostgreSQL 要求父路径存在,其他后端按原生 JSON 函数处理缺失父路径。\n * 返回修改后的完整 JSON 值,通常用于 `UPDATE SET col = ...`。\n *\n * @param column - 列名(开发者负责安全性,禁止传入用户输入)\n * @param path - JSON 路径\n * @param value - 要设置的值(支持任意 JSON 兼容类型)\n * @returns SQL 表达式与参数\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.set('settings', '$.theme', 'dark')\n * const result = await reldb.sql.execute(`UPDATE users SET settings = ${expression.sql} WHERE id = ?`, [...expression.params, 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\n set: (column: string, path: string, value: unknown) => JsonSqlExpr\n\n /**\n * JSON 路径插入表达式(仅当路径不存在时)\n *\n * 使用后端原生插入语义:SQLite/MySQL 不覆盖已有值;PostgreSQL 对已有对象键报错,数组路径按 jsonb_insert 插入。\n * 返回修改后的完整 JSON 值。\n *\n * @param column - 列名(开发者负责安全性,禁止传入用户输入)\n * @param path - JSON 路径\n * @param value - 要插入的值\n * @returns SQL 表达式与参数\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.insert('settings', '$.newField', 'value')\n * const result = await reldb.sql.execute(`UPDATE users SET settings = ${expression.sql} WHERE id = ?`, [...expression.params, 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\n insert: (column: string, path: string, value: unknown) => JsonSqlExpr\n\n /**\n * JSON 路径删除表达式\n *\n * 从 JSON 列中移除指定路径对应的键或数组元素。\n * 返回删除后的完整 JSON 值。\n *\n * @param column - 列名(开发者负责安全性,禁止传入用户输入)\n * @param path - JSON 路径\n * @returns SQL 表达式与参数\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.remove('settings', '$.obsolete')\n * const result = await reldb.sql.execute(`UPDATE users SET settings = ${expression.sql} WHERE id = ?`, [...expression.params, 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\n remove: (column: string, path: string) => JsonSqlExpr\n\n /**\n * JSON 合并/补丁表达式(RFC 7396 Merge Patch)\n *\n * 将 patch 对象合并到 JSON 列:\n * - patch 中存在的键:覆盖原值\n * - patch 中值为 null 的键:删除原键\n * - patch 中不存在的键:保持不变\n *\n * 返回合并后的完整 JSON 值,通常用于 `UPDATE SET col = ...`。\n *\n * @param column - 列名(开发者负责安全性,禁止传入用户输入)\n * @param patch - 要合并的 JSON 对象\n * @returns SQL 表达式与参数\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const expression = reldb.json.merge('settings', { theme: 'dark', obsolete: null })\n * const result = await reldb.sql.execute(`UPDATE users SET settings = ${expression.sql} WHERE id = ?`, [...expression.params, 'u1'])\n * if (!result.success) throw new Error(result.error.message)\n * ```\n */\n merge: (column: string, patch: Record<string, unknown>) => JsonSqlExpr\n}\n\nconst JSON_PATH_OBJECT_SEGMENT_REGEX = /^([^.[]+)/\n\n// ─── 路径解析工具 ───\n\n/**\n * 解析 JSON Path 为路径段数组\n *\n * 将 `$.key.subkey[0]` 格式的路径解析为 `['key', 'subkey', '0']`。\n *\n * @param path - JSON 路径(以 `$` 开头)\n * @returns 路径段数组\n * @example\n * ```ts\n * import { parseJsonPath } from '@h-ai/reldb'\n *\n * void parseJsonPath('$.items[0].name') // ['items', '0', 'name']\n * ```\n */\nexport function parseJsonPath(path: string): string[] {\n // 移除前缀 $\n let remaining = path.startsWith('$')\n ? path.slice(1)\n : path\n const segments: string[] = []\n\n while (remaining.length > 0) {\n if (remaining.startsWith('[')) {\n // 数组索引:[0] 或 ['key'] 或 [\"key\"]\n const end = remaining.indexOf(']')\n if (end === -1)\n break\n let segment = remaining.slice(1, end)\n // 去除首尾引号\n if (\n (segment.startsWith('\"') && segment.endsWith('\"'))\n || (segment.startsWith('\\'') && segment.endsWith('\\''))\n ) {\n segment = segment.slice(1, -1)\n }\n segments.push(segment)\n remaining = remaining.slice(end + 1)\n }\n else if (remaining.startsWith('.')) {\n remaining = remaining.slice(1)\n // 若下一段是 [ 则继续循环处理数组索引\n if (remaining.startsWith('['))\n continue\n // 对象字段名(截取到下一个 . 或 [ 为止)\n const match = remaining.match(JSON_PATH_OBJECT_SEGMENT_REGEX)\n if (match) {\n segments.push(match[1])\n remaining = remaining.slice(match[1].length)\n }\n }\n else {\n break\n }\n }\n\n return segments\n}\n\n// ─── 各数据库 JSON 操作实现 ───\n\n/**\n * 创建 SQLite 的 JSON 操作实现\n *\n * 使用 SQLite 内置的 JSON 函数(需 SQLite 3.38+ 或 json1 扩展)。\n * 路径格式遵循 JSON Path 标准(`$.key`)。\n */\nfunction createSqliteJsonOps(): ReldbJsonOps {\n return {\n extract(column, path) {\n return {\n sql: `json_extract(${column}, ?)`,\n params: [path],\n }\n },\n\n set(column, path, value) {\n return {\n sql: `json_set(${column}, ?, json(?))`,\n params: [\n path,\n JSON.stringify(value),\n ],\n }\n },\n\n insert(column, path, value) {\n return {\n sql: `json_insert(${column}, ?, json(?))`,\n params: [\n path,\n JSON.stringify(value),\n ],\n }\n },\n\n remove(column, path) {\n return {\n sql: `json_remove(${column}, ?)`,\n params: [path],\n }\n },\n\n merge(column, patch) {\n return {\n sql: `json_patch(${column}, ?)`,\n params: [\n JSON.stringify(patch),\n ],\n }\n },\n }\n}\n\n/**\n * 将对象 Merge Patch 编译为一次 PostgreSQL 表达式,逐步修改同一行版本。\n *\n * 不能先在应用读取再合并写回,否则跨节点并发更新会丢失。PostgreSQL 的 || 仅浅拼接,\n * 不删除 null,也不能保留未修改的嵌套兄弟字段;这里以参数化路径执行 RFC 7396 对象补丁。\n * 对象节点先建立或保留对象,随后应用子项;数组整体替换,null 只删除补丁所指向的键。\n * @param column - 开发者提供的静态 JSONB 列表达式,不接受外部输入。\n * @param patch - 可 JSON 序列化的对象补丁;与其他后端一致,undefined 字段被序列化忽略。\n * @returns SQL 片段及单个参数;无连接与初始化需求。\n * @throws 非 JSON 对象、循环引用或 BigInt 等无法序列化的输入。\n * @example 模块内部上下文\n * ```ts\n * const expression = buildPostgresMergePatch('profile', { settings: { theme: 'dark', obsolete: null } })\n * void expression.params // 值与路径均不拼接进 SQL。\n * ```\n */\nfunction buildPostgresMergePatch(column: string, patch: Record<string, unknown>): JsonSqlExpr {\n const normalized: unknown = JSON.parse(JSON.stringify(patch))\n if (!normalized || typeof normalized !== 'object' || Array.isArray(normalized))\n throw new TypeError(reldbM('reldb_jsonPatchObjectRequired'))\n\n const steps: Array<{ path: string[], value: unknown, object: boolean }> = []\n const pending: Array<{ path: string[], value: unknown }> = Object.entries(normalized).reverse().map(([key, value]) => ({\n path: [key],\n value,\n }))\n while (pending.length > 0) {\n const entry = pending.pop()!\n const object = entry.value !== null && typeof entry.value === 'object' && !Array.isArray(entry.value)\n steps.push({\n path: entry.path,\n value: object\n ? {}\n : entry.value,\n object,\n })\n if (object) {\n for (const [key, value] of Object.entries(entry.value as Record<string, unknown>).reverse()) {\n pending.push({\n path: [...entry.path, key],\n value,\n })\n }\n }\n }\n\n return {\n sql: `(WITH RECURSIVE\n patch_steps AS (\n SELECT ordinality AS step,\n ARRAY(SELECT jsonb_array_elements_text(item->'path')) AS path,\n item->'value' AS value, (item->>'object')::boolean AS object\n FROM jsonb_array_elements(?::jsonb) WITH ORDINALITY AS input(item, ordinality)\n ),\n merged(step, document) AS (\n SELECT 0::bigint, CASE WHEN jsonb_typeof(${column}) = 'object' THEN ${column} ELSE '{}'::jsonb END\n UNION ALL\n SELECT patch_steps.step,\n CASE\n WHEN patch_steps.object THEN jsonb_set(merged.document, patch_steps.path,\n CASE WHEN jsonb_typeof(merged.document #> patch_steps.path) = 'object'\n THEN merged.document #> patch_steps.path ELSE '{}'::jsonb END, true)\n WHEN patch_steps.value = 'null'::jsonb THEN merged.document #- patch_steps.path\n ELSE jsonb_set(merged.document, patch_steps.path, patch_steps.value, true)\n END\n FROM merged JOIN patch_steps ON patch_steps.step = merged.step + 1\n )\n SELECT document FROM merged ORDER BY step DESC LIMIT 1)`,\n params: [\n JSON.stringify(steps),\n ],\n }\n}\n\n/**\n * 创建 PostgreSQL 的 JSON 操作实现\n *\n * 使用 PostgreSQL JSONB 操作符和函数。\n * 路径以 `text[]` 形式传递(由 `parseJsonPath` 解析后发送)。\n */\nfunction createPostgresJsonOps(): ReldbJsonOps {\n return {\n extract(column, path) {\n const segments = parseJsonPath(path)\n return {\n sql: `${column} #> ?::text[]`,\n params: [segments],\n }\n },\n\n set(column, path, value) {\n const segments = parseJsonPath(path)\n return {\n sql: `jsonb_set(${column}, ?::text[], ?::jsonb)`,\n params: [\n segments,\n JSON.stringify(value),\n ],\n }\n },\n\n insert(column, path, value) {\n const segments = parseJsonPath(path)\n return {\n sql: `jsonb_insert(${column}, ?::text[], ?::jsonb)`,\n params: [\n segments,\n JSON.stringify(value),\n ],\n }\n },\n\n remove(column, path) {\n const segments = parseJsonPath(path)\n return {\n sql: `${column} #- ?::text[]`,\n params: [segments],\n }\n },\n\n merge(column, patch) {\n return buildPostgresMergePatch(column, patch)\n },\n }\n}\n\n/**\n * 创建 MySQL 的 JSON 操作实现\n *\n * 使用 MySQL 内置 JSON 函数;本仓库使用真实 MySQL 8.4 验证,不声明 MariaDB 兼容。\n * 路径使用 JSON Path 标准格式(`$.key`)。\n */\nfunction createMysqlJsonOps(): ReldbJsonOps {\n return {\n extract(column, path) {\n return {\n sql: `JSON_EXTRACT(${column}, ?)`,\n params: [path],\n }\n },\n\n set(column, path, value) {\n return {\n sql: `JSON_SET(${column}, ?, CAST(? AS JSON))`,\n params: [\n path,\n JSON.stringify(value),\n ],\n }\n },\n\n insert(column, path, value) {\n return {\n sql: `JSON_INSERT(${column}, ?, CAST(? AS JSON))`,\n params: [\n path,\n JSON.stringify(value),\n ],\n }\n },\n\n remove(column, path) {\n return {\n sql: `JSON_REMOVE(${column}, ?)`,\n params: [path],\n }\n },\n\n merge(column, patch) {\n return {\n sql: `JSON_MERGE_PATCH(${column}, CAST(? AS JSON))`,\n params: [\n JSON.stringify(patch),\n ],\n }\n },\n }\n}\n\n// ─── 工厂函数 ───\n\n/**\n * 创建指定数据库类型的 JSON 操作实例\n *\n * @param dbType - 数据库类型(来自 `reldb.config?.type`)\n * @returns JSON 操作实例\n * @example\n * ```ts\n * import { createJsonOps } from '@h-ai/reldb'\n *\n * const sqlite = createJsonOps('sqlite')\n * const expression = sqlite.extract('settings', '$.theme')\n * void expression\n * ```\n */\nexport function createJsonOps(dbType: 'sqlite' | 'postgresql' | 'mysql'): ReldbJsonOps {\n switch (dbType) {\n case 'sqlite':\n return createSqliteJsonOps()\n case 'postgresql':\n return createPostgresJsonOps()\n case 'mysql':\n return createMysqlJsonOps()\n }\n}\n","/**\n * @h-ai/reldb — 分页工具\n *\n * 数据库无关的分页参数规范化与结果构建工具。\n * @module reldb-pagination\n */\n\nimport type { PaginatedResult, PaginationOptions, PaginationOptionsInput } from '@h-ai/core'\nimport type { NormalizedPagination, PaginationOverrides } from './reldb-types.js'\n\n/** 默认起始页码 */\nconst DEFAULT_PAGE = 1\n\n/** 默认每页数量 */\nconst DEFAULT_PAGE_SIZE = 20\n\n/** 每页最大允许数量(防止过大分页导致性能问题) */\nconst MAX_PAGE_SIZE = 200\n\n/**\n * 规范化页码\n *\n * @param value - 原始页码\n * @param fallback - 默认页码\n * @returns 规范化后的页码\n */\nfunction normalizePage(value: number | undefined, fallback: number): number {\n if (!value || value < 1) {\n // 无值或非法时回退到默认页\n return fallback\n }\n return Math.floor(value)\n}\n\n/**\n * 规范化每页大小\n *\n * @param value - 原始页大小\n * @param fallback - 默认页大小\n * @param maxSize - 最大页大小\n * @returns 规范化后的页大小\n */\nfunction normalizePageSize(value: number | undefined, fallback: number, maxSize: number): number {\n if (!value || value < 1) {\n // 无值或非法时回退到默认值\n return fallback\n }\n // 限制最大值,避免过大分页\n return Math.min(Math.floor(value), maxSize)\n}\n\n/**\n * 规范化分页参数\n *\n * 将用户输入的可选分页参数转换为带有默认值的完整分页对象,\n * 同时计算 SQL 所需的 offset 和 limit。\n *\n * 处理规则:\n * - page < 1 或未提供 → 使用 defaultPage(默认 1)\n * - pageSize < 1 或未提供 → 使用 defaultPageSize(默认 20)\n * - pageSize > maxPageSize → 截断为 maxPageSize(默认 200)\n * - offset = (page - 1) * pageSize\n *\n * @param options - 用户传入的分页参数(可选)\n * @param overrides - 覆盖默认分页参数(可选)\n * @returns 规范化后的分页参数(含 offset、limit)\n * @example 模块内部上下文\n * ```ts\n * const page = normalizePagination({ page: 2, pageSize: 10 })\n * void page.offset // 10\n * ```\n */\nexport function normalizePagination(\n options?: PaginationOptionsInput,\n overrides?: PaginationOverrides,\n): NormalizedPagination {\n const defaultPage = overrides?.defaultPage ?? DEFAULT_PAGE\n const defaultPageSize = overrides?.defaultPageSize ?? DEFAULT_PAGE_SIZE\n const maxPageSize = overrides?.maxPageSize ?? MAX_PAGE_SIZE\n\n // 计算页码与大小,并推导 offset/limit\n const page = normalizePage(options?.page, defaultPage)\n const pageSize = normalizePageSize(options?.pageSize, defaultPageSize, maxPageSize)\n const offset = (page - 1) * pageSize\n\n return {\n page,\n pageSize,\n offset,\n limit: pageSize,\n }\n}\n\n/**\n * 构建分页结果\n *\n * 将查询结果和分页元数据组装为统一的分页响应结构。\n *\n * @param items - 当前页数据\n * @param total - 总记录数\n * @param pagination - 当前分页参数\n * @returns 标准分页结果对象\n * @example 模块内部上下文\n * ```ts\n * const result = buildPaginatedResult([{ id: 'u1' }], 1, { page: 1, pageSize: 20 })\n * void result.items\n * ```\n */\nexport function buildPaginatedResult<T>(\n items: T[],\n total: number,\n pagination: PaginationOptions,\n): PaginatedResult<T> {\n // 直接透传分页元信息\n return {\n items,\n total,\n page: pagination.page,\n pageSize: pagination.pageSize,\n }\n}\n\n/**\n * 分页工具集合\n *\n * 提供分页参数规范化与结果构建能力,通过 `reldb.pagination` 访问。\n * @example 模块内部上下文\n * ```ts\n * const page = pagination.normalize({ page: 2, pageSize: 10 })\n * const result = pagination.build([{ id: 'u1' }], 1, page)\n * void result\n * ```\n */\nexport const pagination = {\n normalize: normalizePagination,\n build: buildPaginatedResult,\n}\n\n// ─── 计数解析 ───\n\n/**\n * 解析 COUNT 查询返回值\n *\n * 兼容不同驱动/SQL 的列别名与返回类型(`total` / `__total__` / `cnt` / 首列值)。\n * 支持 bigint 类型的安全转换。\n *\n * @param row - 查询返回行(可能为 null/undefined)\n * @returns 解析后的数值,无数据时返回 0\n * @example 模块内部上下文\n * ```ts\n * const count = parseCount({ cnt: '42' })\n * void count\n * ```\n */\nexport function parseCount(row: Record<string, unknown> | null | undefined): number {\n if (!row) {\n // 无数据默认 0\n return 0\n }\n if ('total' in row) {\n // 常见别名 total\n return Number(row.total ?? 0)\n }\n if ('__total__' in row) {\n // 某些驱动使用 __total__\n return Number(row.__total__ ?? 0)\n }\n if ('cnt' in row) {\n // 默认别名 cnt\n return Number(row.cnt ?? 0)\n }\n const value = Object.values(row)[0]\n if (typeof value === 'bigint') {\n // SQLite/PG bigint 处理\n return Number(value)\n }\n return Number(value ?? 0)\n}\n","/**\n * @h-ai/reldb — 安全工具\n *\n * 提供 SQL 标识符校验与字符串值转义功能,防止注入风险。\n * @module reldb-security\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { } from './reldb-types.js'\nimport { err, ok } from '@h-ai/core'\nimport { reldbM } from './reldb-i18n.js'\nimport { HaiReldbError } from './reldb-types.js'\n\n// ─── 标识符校验 ───\n\n/**\n * 合法 SQL 标识符正则\n *\n * 仅允许字母、数字、下划线,且必须以字母或下划线开头。\n * 本层限制 128 字符;具体数据库可能有更短上限,仍需遵守其标识符规则。\n */\nconst VALID_IDENTIFIER_RE = /^[a-z_]\\w{0,127}$/i\n\n/**\n * 校验 SQL 标识符合法性\n *\n * 防止因动态拼接表名/列名/索引名而产生 SQL 注入风险。\n * 仅允许 `[a-zA-Z_][a-zA-Z0-9_]*`,最长 128 字符。\n *\n * @param name - 待校验的标识符\n * @returns 校验通过时返回 ok(name);不合法时返回错误 HaiResult\n * @example\n * ```ts\n * import { validateIdentifier } from '@h-ai/reldb'\n *\n * const checked = validateIdentifier('users')\n * if (!checked.success) throw new Error(checked.error.message)\n * void checked.data\n * ```\n */\nexport function validateIdentifier(name: string): HaiResult<string> {\n if (VALID_IDENTIFIER_RE.test(name)) {\n return ok(name)\n }\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_invalidIdentifier', {\n params: { name },\n }))\n}\n\n/**\n * 批量校验多个 SQL 标识符\n *\n * 逐个校验,遇到第一个不合法的立即返回错误。\n *\n * @param names - 待校验的标识符数组\n * @returns 全部合法时返回 ok(undefined);否则返回第一个不合法项的错误\n * @example\n * ```ts\n * import { validateIdentifiers } from '@h-ai/reldb'\n *\n * const checked = validateIdentifiers(['users', 'id'])\n * if (!checked.success) throw new Error(checked.error.message)\n * ```\n */\nexport function validateIdentifiers(names: string[]): HaiResult<void> {\n for (const name of names) {\n const result = validateIdentifier(name)\n if (!result.success) {\n return err(result.error)\n }\n }\n return ok(undefined)\n}\n\n// ─── 字符串值转义 ───\n\n/**\n * 用双引号包裹 SQL 标识符(适用于 PostgreSQL / SQLite / 标准 SQL)\n *\n * 标识符内的双引号会被转义为两个双引号。\n * 使用场景:DDL 中的表名、列名、索引名。\n * 调用前应先通过 `validateIdentifier` 校验合法性。\n *\n * @param name - 已校验的标识符\n * @returns 双引号包裹的安全标识符\n * @example\n * ```ts\n * import { quoteIdentifier, validateIdentifier } from '@h-ai/reldb'\n *\n * const checked = validateIdentifier('order')\n * if (!checked.success) throw new Error(checked.error.message)\n * void quoteIdentifier(checked.data)\n * ```\n */\nexport function quoteIdentifier(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`\n}\n\n/**\n * 转义 SQL 字符串字面量中的单引号\n *\n * 将 `'` 转义为 `''`,用于 DDL 中 DEFAULT 值等需要直接拼接的场景。\n * 注意:仅用于标识符/DDL 场景,数据操作应始终使用参数化查询。\n *\n * @param value - 原始字符串\n * @returns 转义后的安全字符串\n * @example\n * ```ts\n * import { escapeSqlString } from '@h-ai/reldb'\n *\n * void escapeSqlString(\"it's\") // it''s;仅用于可信 DDL 字面量,业务值使用占位符。\n * ```\n */\nexport function escapeSqlString(value: string): string {\n return value.replace(/'/g, '\\'\\'')\n}\n","/**\n * @h-ai/reldb — CRUD 抽象\n *\n * 提供基于单表的通用 CRUD 操作封装,支持在 reldb.sql 与事务 tx 中复用。\n * @module reldb-crud-kernel\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type {\n CrudConfig,\n CrudPageOptions,\n CrudQueryOptions,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n QueryRow,\n ReldbCrudCountOptions,\n ReldbCrudRepository,\n} from './reldb-types.js'\nimport { core, err, ok } from '@h-ai/core'\nimport { reldbM } from './reldb-i18n.js'\nimport { parseCount } from './reldb-pagination.js'\nimport { validateIdentifier, validateIdentifiers } from './reldb-security.js'\nimport { HaiReldbError } from './reldb-types.js'\n\nconst logger = core.logger.child({ module: 'reldb', scope: 'crud-kernel' })\nconst ORDER_BY_SEGMENT_REGEX = /^(\\w+)(?:\\s+(ASC|DESC))?$/i\n\n// ─── CRUD 工具方法 ───\n\n/**\n * 构建查询列字符串\n *\n * @param select - 列名数组(空或未提供时返回 '*')\n * @returns SQL SELECT 列片段\n */\nfunction buildSelectColumns(select?: string[]): string {\n if (!select || select.length === 0) {\n // 未指定字段时默认全部列\n return '*'\n }\n return select.join(', ')\n}\n\n/**\n * 从数据对象中挑选允许的列和值\n *\n * @param data - 原始数据\n * @param allowList - 允许列清单(为空时不过滤)\n * @returns 列名与参数值数组\n */\nfunction pickColumns(\n data: Record<string, unknown>,\n allowList?: string[],\n): { columns: string[], values: unknown[] } {\n const keys = Object.keys(data)\n // 若提供 allowList,则仅保留白名单列\n const columns = allowList\n ? keys.filter(key => allowList.includes(key))\n : keys\n const values = columns.map(key => data[key])\n return { columns, values }\n}\n\n// ─── CRUD 工厂 ───\n\n/**\n * 创建一个所有方法均返回同一错误的 ReldbCrudRepository,用于配置校验失败时短路返回\n *\n * @param failedResult - 校验失败产生的\n * @returns 所有操作均返回 configError 的 ReldbCrudRepository\n */\nfunction createFailReldbCrudRepository<TItem>(failedResult: HaiResult<never>): ReldbCrudRepository<TItem> {\n const failResult = <T>(): Promise<HaiResult<T>> => Promise.resolve(failedResult as HaiResult<T>)\n return {\n create: () => failResult(),\n createMany: () => failResult(),\n createOrUpdate: () => failResult(),\n findById: () => failResult(),\n getById: () => failResult(),\n findAll: () => failResult(),\n findPage: () => failResult(),\n updateById: () => failResult(),\n deleteById: () => failResult(),\n count: () => failResult(),\n exists: () => failResult(),\n existsById: () => failResult(),\n }\n}\n\n/**\n * 创建 CRUD 仓库\n *\n * @param ops - 数据操作接口(reldb.sql 或 tx)\n * @param config - CRUD 配置\n * @returns CRUD 仓库\n * @example 模块内部上下文\n * ```ts\n * function users(ops: DmlOperations) {\n * return createCrud<{ id: string }>(ops, { table: 'users', dbType: 'postgresql', select: ['id'] })\n * }\n * ```\n */\nexport function createCrud<TItem>(\n ops: DmlOperations,\n config: CrudConfig<TItem>,\n): ReldbCrudRepository<TItem> {\n const table = config.table\n const idColumn = config.idColumn ?? 'id'\n const selectColumns = buildSelectColumns(config.select)\n const mapRow = config.mapRow ?? ((row: QueryRow) => row as TItem)\n const dbType = config.dbType\n\n // 校验表名与主键列名,防止标识符注入\n const tableValid = validateIdentifier(table)\n if (!tableValid.success) {\n return createFailReldbCrudRepository(tableValid)\n }\n const idColumnValid = validateIdentifier(idColumn)\n if (!idColumnValid.success) {\n return createFailReldbCrudRepository(idColumnValid)\n }\n // 校验 select / createColumns / updateColumns 列名\n if (config.select) {\n const selectValid = validateIdentifiers(config.select)\n if (!selectValid.success) {\n return createFailReldbCrudRepository(selectValid)\n }\n }\n if (config.createColumns) {\n const createColsValid = validateIdentifiers(config.createColumns)\n if (!createColsValid.success) {\n return createFailReldbCrudRepository(createColsValid)\n }\n }\n if (config.updateColumns) {\n const updateColsValid = validateIdentifiers(config.updateColumns)\n if (!updateColsValid.success) {\n return createFailReldbCrudRepository(updateColsValid)\n }\n }\n\n // SQL 片段拼接工具(仅在传入值时附加)\n\n /** 构建 WHERE 子句,无条件时返回空字符串 */\n const buildWhereClause = (where?: string): string => (where\n ? ` WHERE ${where}`\n : '')\n\n /**\n * 构建 ORDER BY 子句\n *\n * 对 orderBy 中的标识符逐一校验,防止 SQL 注入。\n * 仅允许 `column`、`column ASC`、`column DESC` 格式。\n * 校验失败时跳过非法排序字段并输出 debug 日志。\n */\n const buildOrderClause = (orderBy?: string): string => {\n if (!orderBy)\n return ''\n // 解析并校验每个排序字段\n const parts = orderBy.split(',').map(s => s.trim()).filter(Boolean)\n const safeParts: string[] = []\n for (const part of parts) {\n // 匹配 \"column\" 或 \"column ASC/DESC\" 格式\n const match = part.match(ORDER_BY_SEGMENT_REGEX)\n if (!match) {\n logger.debug('Skipped invalid orderBy segment', { table, segment: part })\n continue\n }\n const colName = match[1]\n const direction = match[2] ?? ''\n const colValid = validateIdentifier(colName)\n if (!colValid.success) {\n logger.debug('Skipped invalid orderBy identifier', { table, column: colName })\n continue\n }\n safeParts.push(direction\n ? `${colName} ${direction.toUpperCase()}`\n : colName)\n }\n if (safeParts.length === 0)\n return ''\n return ` ORDER BY ${safeParts.join(', ')}`\n }\n /** 构建 LIMIT/OFFSET 子句,仅在传入值时生效 */\n const buildLimitOffset = (limit?: number, offset?: number): string => {\n const parts: string[] = []\n if (typeof limit === 'number') {\n // limit 优先\n parts.push(` LIMIT ${limit}`)\n }\n if (typeof offset === 'number') {\n // offset 仅在传入时生效\n parts.push(` OFFSET ${offset}`)\n }\n return parts.join('')\n }\n\n /** 构建空负载错误结果(数据为空时报错) */\n const createPayloadError = (): HaiResult<ExecuteResult> => err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudEmptyPayload'))\n\n /** 构建无有效列错误结果(白名单过滤后无可写列时报错) */\n const createColumnsError = (): HaiResult<ExecuteResult> => err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudNoValidColumns'))\n\n /** 解析实际数据操作接口:传入事务时使用事务接口,否则使用 reldb.sql */\n const resolveOps = (tx?: DmlWithTxOperations): DmlOperations => tx ?? ops\n\n return {\n /**\n * 创建单条记录\n *\n * @param data - 列名与值的映射(会根据 createColumns 白名单过滤)\n * @param tx - 可选事务句柄\n * @returns 插入结果(含 changes、lastInsertRowid)\n */\n async create(data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n if (!data || Object.keys(data).length === 0) {\n // 空数据直接报错\n return createPayloadError()\n }\n\n const { columns, values } = pickColumns(data, config.createColumns)\n if (columns.length === 0) {\n // 白名单过滤后无可写列\n return createColumnsError()\n }\n\n // 校验列名合法性,防止通过 data key 注入\n const colValid = validateIdentifiers(columns)\n if (!colValid.success) {\n return err(colValid.error)\n }\n\n const placeholders = columns.map(() => '?').join(', ')\n const sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`\n return resolveOps(tx).execute(sql, values)\n },\n\n /**\n * 批量创建记录\n *\n * 所有记录在同一 batch 中执行,任意一条失败则整体失败。\n *\n * @param items - 待插入的数据数组\n * @param tx - 可选事务句柄\n * @returns 批量插入结果\n */\n async createMany(items: Array<Record<string, unknown>>, tx?: DmlWithTxOperations): Promise<HaiResult<void>> {\n if (!items || items.length === 0) {\n // 空数组视为成功\n return ok(undefined)\n }\n\n const statements: Array<{ sql: string, params?: unknown[] }> = []\n\n for (const item of items) {\n if (!item || Object.keys(item).length === 0) {\n // 任意项为空则整体失败\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudEmptyPayload'))\n }\n\n const { columns, values } = pickColumns(item, config.createColumns)\n if (columns.length === 0) {\n // 过滤后无可写列\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_crudNoValidColumns'))\n }\n\n // 校验列名合法性\n const colValid = validateIdentifiers(columns)\n if (!colValid.success) {\n return err(colValid.error)\n }\n\n const placeholders = columns.map(() => '?').join(', ')\n const sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`\n statements.push({ sql, params: values })\n }\n\n return resolveOps(tx).batch(statements)\n },\n\n /**\n * 创建或更新单条记录(upsert)\n *\n * 主键冲突时更新 updateColumns 中存在的列,否则插入新记录。\n *\n * @param data - 列名与值的映射\n * @param tx - 可选事务句柄\n * @returns 执行结果(含 changes)\n */\n async createOrUpdate(data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n if (!data || Object.keys(data).length === 0) {\n return createPayloadError()\n }\n\n const { columns, values } = pickColumns(data, config.createColumns)\n if (columns.length === 0) {\n return createColumnsError()\n }\n\n const colValid = validateIdentifiers(columns)\n if (!colValid.success) {\n return err(colValid.error)\n }\n\n const placeholders = columns.map(() => '?').join(', ')\n\n // 从 updateColumns 中筛选:排除主键,且仅保留当前 INSERT 数据中存在的列\n const updateCols = (config.updateColumns ?? columns)\n .filter(col => col !== idColumn && columns.includes(col))\n\n if (updateCols.length === 0) {\n // 无可更新列,退化为普通 INSERT\n const sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`\n return resolveOps(tx).execute(sql, values)\n }\n\n let sql: string\n if (dbType === 'mysql') {\n const updateSet = updateCols.map(col => `${col} = VALUES(${col})`).join(', ')\n sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders}) ON DUPLICATE KEY UPDATE ${updateSet}`\n }\n else {\n // SQLite / PostgreSQL\n const updateSet = updateCols.map(col => `${col} = excluded.${col}`).join(', ')\n sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${idColumn}) DO UPDATE SET ${updateSet}`\n }\n\n return resolveOps(tx).execute(sql, values)\n },\n\n /**\n * 根据主键查找单条记录\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 记录对象或 null(未找到)\n */\n async findById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<TItem | null>> {\n const sql = `SELECT ${selectColumns} FROM ${table} WHERE ${idColumn} = ?`\n const result = await resolveOps(tx).get<QueryRow>(sql, [id])\n if (!result.success) {\n // 透传查询错误\n return result\n }\n // 未命中时返回 null\n return ok(result.data\n ? mapRow(result.data)\n : null)\n },\n\n /**\n * 根据主键获取单条记录(必须存在)\n *\n * 与 findById 不同,当记录不存在时返回 RECORD_NOT_FOUND 错误。\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 记录对象(不存在时返回错误)\n */\n async getById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<TItem>> {\n const findResult = await this.findById(id, tx)\n if (!findResult.success) {\n return findResult\n }\n if (findResult.data === null) {\n return err(HaiReldbError.RECORD_NOT_FOUND, reldbM('reldb_crudRecordNotFound', {\n params: {\n id: String(id),\n },\n }))\n }\n return ok(findResult.data)\n },\n\n /**\n * 条件查询多条记录\n *\n * @param options - 查询条件(where、orderBy、limit、offset)\n * @param tx - 可选事务句柄\n * @returns 记录数组\n */\n async findAll(options: CrudQueryOptions = {}, tx?: DmlWithTxOperations): Promise<HaiResult<TItem[]>> {\n const whereClause = buildWhereClause(options.where)\n const orderClause = buildOrderClause(options.orderBy)\n const limitClause = buildLimitOffset(options.limit, options.offset)\n const sql = `SELECT ${selectColumns} FROM ${table}${whereClause}${orderClause}${limitClause}`\n const result = await resolveOps(tx).query<QueryRow>(sql, options.params)\n if (!result.success) {\n // 透传查询错误\n return result\n }\n return ok(result.data.map(row => mapRow(row)))\n },\n\n /**\n * 分页查询记录\n *\n * @param options - 分页查询条件(where、orderBy、pagination、overrides)\n * @param tx - 可选事务句柄\n * @returns 分页结果(含 items、total、page、pageSize)\n */\n async findPage(options: CrudPageOptions, tx?: DmlWithTxOperations): Promise<HaiResult<PaginatedResult<TItem>>> {\n const whereClause = buildWhereClause(options.where)\n const orderClause = buildOrderClause(options.orderBy)\n const sql = `SELECT ${selectColumns} FROM ${table}${whereClause}${orderClause}`\n const pageResult = await resolveOps(tx).queryPage<QueryRow>({\n sql,\n params: options.params,\n pagination: options.pagination,\n overrides: options.overrides,\n })\n if (!pageResult.success) {\n // 透传分页查询错误\n return pageResult\n }\n return ok({\n ...pageResult.data,\n items: pageResult.data.items.map(row => mapRow(row)),\n })\n },\n\n /**\n * 根据主键更新记录\n *\n * 主键列不可更新,会自动排除。\n *\n * @param id - 主键值\n * @param data - 待更新的列值映射(会根据 updateColumns 白名单过滤)\n * @param tx - 可选事务句柄\n * @returns 更新结果(含 changes)\n */\n async updateById(id: unknown, data: Record<string, unknown>, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n if (!data || Object.keys(data).length === 0) {\n // 空数据不允许更新\n return createPayloadError()\n }\n\n const allowList = (config.updateColumns ?? []).filter(column => column !== idColumn)\n const { columns } = pickColumns(data, allowList.length > 0\n ? allowList\n : undefined)\n const filtered = columns.filter(column => column !== idColumn)\n\n if (filtered.length === 0) {\n // 过滤后无可更新列\n return createColumnsError()\n }\n\n // 校验列名合法性,防止通过 data key 注入\n const colValid = validateIdentifiers(filtered)\n if (!colValid.success) {\n return err(colValid.error)\n }\n\n const setClause = filtered.map(column => `${column} = ?`).join(', ')\n const sql = `UPDATE ${table} SET ${setClause} WHERE ${idColumn} = ?`\n const params = [\n ...filtered.map(column => data[column]),\n id,\n ]\n return resolveOps(tx).execute(sql, params)\n },\n\n /**\n * 根据主键删除记录\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 删除结果(含 changes)\n */\n async deleteById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<ExecuteResult>> {\n const sql = `DELETE FROM ${table} WHERE ${idColumn} = ?`\n return resolveOps(tx).execute(sql, [id])\n },\n\n /**\n * 统计符合条件的记录数\n *\n * @param options - 查询条件(where、params)\n * @param tx - 可选事务句柄\n * @returns 记录数\n */\n async count(options: ReldbCrudCountOptions = {}, tx?: DmlWithTxOperations): Promise<HaiResult<number>> {\n const whereClause = buildWhereClause(options.where)\n const sql = `SELECT COUNT(*) as cnt FROM ${table}${whereClause}`\n const result = await resolveOps(tx).get<QueryRow>(sql, options.params)\n if (!result.success) {\n // 透传查询错误\n return result\n }\n return ok(parseCount(result.data ?? null))\n },\n\n /**\n * 检查是否存在符合条件的记录\n *\n * @param options - 查询条件(where、params)\n * @param tx - 可选事务句柄\n * @returns 是否存在\n */\n async exists(options: ReldbCrudCountOptions = {}, tx?: DmlWithTxOperations): Promise<HaiResult<boolean>> {\n const whereClause = buildWhereClause(options.where)\n const sql = `SELECT 1 as exist_flag FROM ${table}${whereClause} LIMIT 1`\n const result = await resolveOps(tx).get<QueryRow>(sql, options.params)\n if (!result.success) {\n // 透传查询错误\n return result\n }\n // 只要命中一行即存在\n return ok(Boolean(result.data))\n },\n\n /**\n * 根据主键检查记录是否存在\n *\n * @param id - 主键值\n * @param tx - 可选事务句柄\n * @returns 是否存在\n */\n async existsById(id: unknown, tx?: DmlWithTxOperations): Promise<HaiResult<boolean>> {\n const sql = `SELECT 1 as exist_flag FROM ${table} WHERE ${idColumn} = ? LIMIT 1`\n const result = await resolveOps(tx).get<QueryRow>(sql, [id])\n if (!result.success) {\n // 透传查询错误\n return result\n }\n return ok(Boolean(result.data))\n },\n }\n}\n","/**\n * @h-ai/reldb — 事务句柄组装\n *\n * 将事务连接的 DML 操作 + commit/rollback 生命周期组装为完整的 DmlWithTxOperations。\n * 内部自动管理 ensureActive 守卫(commit/rollback 后拒绝操作)。\n * @module reldb-tx-assembler\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type {\n CrudManager,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n PaginationQueryOptions,\n TxManager,\n TxWrapCallback,\n} from '../reldb-types.js'\n\nimport { err, ok } from '@h-ai/core'\nimport { createCrud } from '../reldb-crud-kernel.js'\nimport { reldbM } from '../reldb-i18n.js'\nimport { HaiReldbError } from '../reldb-types.js'\n\n// ─── 事务回调接口 ───\n\n/**\n * 事务生命周期回调\n *\n * Provider 提供具体的 commit/rollback/release 操作。\n * @example 模块内部上下文\n * ```ts\n * function release(callbacks: TxCallbacks) {\n * callbacks.release() // commit/rollback 之后归还唯一事务资源。\n * }\n * ```\n */\nexport interface TxCallbacks {\n /** 提交事务 */\n commit: () => Promise<void>\n /** 回滚事务 */\n rollback: () => Promise<void>\n /** 释放资源(连接归还池等),commit/rollback 后调用 */\n release: () => void\n /** 事务错误消息生成 */\n errorMessage: (detail: string) => string\n}\n\n// ─── 事务句柄组装 ───\n\n/**\n * 组装完整的事务句柄\n *\n * 内部自动管理:\n * - ensureActive 守卫(commit/rollback 后拒绝操作)\n * - DmlOperations(带守卫)\n * - crud(基于 DmlOperations 创建)\n * - commit/rollback(调用回调 + 标记非活跃 + 释放资源)\n *\n * @param baseDmlOps - 事务连接上的 DML 操作\n * @param callbacks - 事务生命周期回调\n * @returns 完整的事务句柄\n * @example 模块内部上下文\n * ```ts\n * function wrap(ops: DmlOperations, callbacks: TxCallbacks) {\n * return createTxHandle(ops, callbacks)\n * }\n * ```\n */\nexport function createTxHandle(baseDmlOps: DmlOperations, callbacks: TxCallbacks): DmlWithTxOperations {\n let active = true\n\n const ensureActive = (): HaiResult<void> => {\n if (!active) {\n return err(HaiReldbError.TRANSACTION_FAILED, callbacks.errorMessage('transaction finished'))\n }\n return ok(undefined)\n }\n\n const guardedOps: DmlOperations = {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n const check = ensureActive()\n if (!check.success)\n return check\n return baseDmlOps.query<T>(sql, params)\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const check = ensureActive()\n if (!check.success)\n return check\n return baseDmlOps.get<T>(sql, params)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const check = ensureActive()\n if (!check.success)\n return check\n return baseDmlOps.execute(sql, params)\n },\n async batch(statements: Array<{ sql: string, params?: unknown[] }>): Promise<HaiResult<void>> {\n const check = ensureActive()\n if (!check.success)\n return check\n return baseDmlOps.batch(statements)\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const check = ensureActive()\n if (!check.success)\n return check\n return baseDmlOps.queryPage<T>(options)\n },\n }\n\n const crudManager: CrudManager = {\n table: config => createCrud(guardedOps, config),\n }\n\n return {\n ...guardedOps,\n crud: crudManager,\n\n async commit(): Promise<HaiResult<void>> {\n const check = ensureActive()\n if (!check.success)\n return check\n // 在等待驱动前独占结束权,阻止并发提交/回滚及结束期间的新操作。\n active = false\n try {\n await callbacks.commit()\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.TRANSACTION_FAILED, callbacks.errorMessage(String(error)), error)\n }\n finally {\n callbacks.release()\n }\n },\n\n async rollback(): Promise<HaiResult<void>> {\n const check = ensureActive()\n if (!check.success)\n return check\n active = false\n try {\n await callbacks.rollback()\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.TRANSACTION_FAILED, callbacks.errorMessage(String(error)), error)\n }\n finally {\n callbacks.release()\n }\n },\n }\n}\n\n// ─── tx.wrap 语法糖 ───\n\n/**\n * 创建统一的 tx.wrap 函数\n *\n * 自动管理事务生命周期:begin → callback → commit(成功)/ rollback(失败)。\n *\n * @param beginTx - 开启事务函数\n * @returns tx.wrap 函数\n * @example 模块内部上下文\n * ```ts\n * function wrap(begin: () => Promise<HaiResult<DmlWithTxOperations>>) {\n * return createTxWrap(begin)\n * }\n * ```\n */\nexport function createTxWrap(\n beginTx: () => Promise<HaiResult<DmlWithTxOperations>>,\n): TxManager['wrap'] {\n return async <T>(fn: TxWrapCallback<T>): Promise<HaiResult<T>> => {\n const txResult = await beginTx()\n if (!txResult.success)\n return txResult\n\n try {\n const result = await fn(txResult.data)\n const commitResult = await txResult.data.commit()\n if (!commitResult.success) {\n return commitResult as HaiResult<T>\n }\n return ok(result)\n }\n catch (error) {\n await txResult.data.rollback()\n return err(HaiReldbError.TRANSACTION_FAILED, reldbM('reldb_txFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n }\n}\n","/**\n * @h-ai/reldb — Provider 共享基础层\n *\n * Provider 共享基础层:Context + wrapOp → Factory 模式。\n *\n * 各 Provider 只需提供 raw DdlOperations / DmlOperations / beginTx,\n * base 层统一处理连接守卫、运行时异常捕获与 HaiResult 包装。\n * @module reldb-provider-base\n */\n\nimport type { HaiError, HaiErrorDef, HaiResult, PaginatedResult } from '@h-ai/core'\n\nimport type { ReldbOperationLogConfig } from '../reldb-config.js'\nimport type {\n CrudManager,\n DdlOperations,\n DmlOperations,\n PaginationQueryOptions,\n TxManager,\n} from '../reldb-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { createCrud } from '../reldb-crud-kernel.js'\nimport { reldbM } from '../reldb-i18n.js'\nimport { buildPaginatedResult, normalizePagination, parseCount } from '../reldb-pagination.js'\nimport { validateIdentifier, validateIdentifiers } from '../reldb-security.js'\nimport { HaiReldbError } from '../reldb-types.js'\nimport { createTxWrap } from './reldb-tx-assembler.js'\n\n// ─── 操作上下文 ───\n\n/**\n * 操作上下文:由 Provider 在创建 ops 时传入\n *\n * 对标 VecdbOpsContext:统一的连接状态检查 + 日志记录。\n * @example 模块内部上下文\n * ```ts\n * function connected(ctx: ReldbOpsContext) {\n * if (!ctx.isConnected()) return false\n * ctx.logger.debug('Database ready', {})\n * return true\n * }\n * ```\n */\nexport interface ReldbOpsContext {\n /** 连接状态检查 */\n isConnected: () => boolean\n /** Logger 实例(用于运行时异常的错误日志) */\n logger: {\n error: (msg: string, meta?: Record<string, unknown>) => void\n info: (msg: string, meta?: Record<string, unknown>) => void\n debug: (msg: string, meta?: Record<string, unknown>) => void\n trace: (msg: string, meta?: Record<string, unknown>) => void\n }\n /** 当前操作日志配置 */\n operationLog?: () => ReldbOperationLogConfig | undefined\n}\n\n/**\n * ReldbOperationCategory 的数据约束与操作契约。\n * @example 模块内部上下文\n * ```ts\n * const category: ReldbOperationCategory = 'read'\n * void category\n * ```\n */\ntype ReldbOperationCategory = 'read' | 'write'\n\n/** 仅提取固定的数量信息;SQL 字面量、参数、默认值及错误对象不进入日志。 */\nfunction summarizeOperationPayload(payload: unknown): Record<string, number> {\n try {\n if (!payload || typeof payload !== 'object')\n return {}\n const fields = payload as Record<string, unknown>\n return {\n ...(typeof fields.sql === 'string'\n ? { sqlLength: fields.sql.length }\n : {}),\n ...(Array.isArray(fields.params)\n ? { parameterCount: fields.params.length }\n : {}),\n ...(Array.isArray(fields.statements)\n ? { statementCount: fields.statements.length }\n : {}),\n ...(fields.columns && typeof fields.columns === 'object'\n ? { columnCount: Object.keys(fields.columns).length }\n : {}),\n }\n }\n catch {\n return {}\n }\n}\n\n/**\n * 记录不含 SQL 原文及绑定值的操作摘要。\n *\n * @param ctx - Provider 日志和配置上下文\n * @param category - 读取或写入类别\n * @param operation - 内部固定操作名\n * @param payload - 仅用于计算语句长度和参数数量,不序列化原值\n * @example 模块内部上下文\n * ```ts\n * function read(ctx: ReldbOpsContext) {\n * logReldbOperation(ctx, 'read', 'sql.get', { sql: 'SELECT id FROM users WHERE id = ?', params: ['u1'] })\n * } // 日志仅记录 SQL 长度和参数数量。\n * ```\n */\nexport function logReldbOperation(\n ctx: ReldbOpsContext,\n category: ReldbOperationCategory,\n operation: string,\n payload: unknown,\n): void {\n const config = ctx.operationLog?.()\n if (!config?.[category]) {\n return\n }\n\n ctx.logger[config.level]('RelDB operation executed', {\n category,\n operation,\n payload: config.maxLength <= 0\n ? ''\n : JSON.stringify(summarizeOperationPayload(payload)).slice(0, config.maxLength),\n })\n}\n\n// ─── 统一操作包装器 ───\n\n/**\n * 统一操作包装器:guard → delegate → catch-all\n *\n * 对标 vecdb wrapOp:\n * 1. 连接守卫:未初始化时直接返回 NOT_INITIALIZED\n * 2. 委托给 raw ops 执行(raw ops 内部用 HaiResult 表达业务错误)\n * 3. catch-all 安全网:捕获 raw ops 未预期的运行时异常\n */\nasync function wrapOp<T>(\n ctx: ReldbOpsContext,\n fn: () => Promise<HaiResult<T>>,\n errorDef: HaiErrorDef,\n errorLabel: string,\n errorMeta?: Record<string, unknown>,\n): Promise<HaiResult<T>> {\n if (!ctx.isConnected()) {\n return err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized'))\n }\n const failed = (error: unknown, original?: HaiError): HaiResult<T> => {\n let definition = original ?? errorDef\n const traceId = core.context.get().traceId ?? core.context.get().requestId ?? original?.traceId ?? core.id.uuid()\n const fields = error && typeof error === 'object'\n ? error as Record<string, unknown>\n : {}\n // 驱动差异在数据库层收敛;业务不解析本地化消息或依赖驱动类型。\n if (definition.code === HaiReldbError.QUERY_FAILED.code && ([\n '23505',\n 'ER_DUP_ENTRY',\n 'SQLITE_CONSTRAINT_UNIQUE',\n 'SQLITE_CONSTRAINT_PRIMARYKEY',\n ].includes(String(fields.code)) || fields.errno === 1062)) {\n definition = HaiReldbError.DUPLICATE_ENTRY\n }\n const secrets = new Set<string>()\n const seen = new WeakSet<object>()\n const collect = (value: unknown): void => {\n if (typeof value === 'string' && value) {\n secrets.add(value)\n }\n else if (typeof value === 'number' || typeof value === 'bigint') {\n secrets.add(String(value))\n }\n else if (value && typeof value === 'object' && !seen.has(value)) {\n seen.add(value)\n Object.values(value).forEach(collect)\n }\n }\n collect(errorMeta?.params)\n const payloads = [\n errorMeta,\n ...(Array.isArray(errorMeta?.statements)\n ? errorMeta.statements as Record<string, unknown>[]\n : []),\n ]\n for (const payload of payloads) {\n collect(payload?.params)\n for (const match of (typeof payload?.sql === 'string'\n ? payload.sql\n : '').matchAll(/'((?:''|[^'])*)'/g))\n secrets.add(match[1].replaceAll('\\'\\'', '\\''))\n }\n // 只复制驱动诊断白名单;完整 SQL、绑定参数和连接配置从不进入日志。\n const diagnostic: Record<string, unknown> = {}\n for (const key of [\n 'name',\n 'message',\n 'stack',\n 'code',\n 'errno',\n 'sqlState',\n 'detail',\n 'hint',\n 'constraint',\n 'schema',\n 'routine',\n 'severity',\n 'table',\n 'column',\n ]) {\n const value: unknown = error instanceof Error && key === 'message'\n ? error.message\n : error instanceof Error && key === 'stack'\n ? error.stack\n : fields[key]\n if (typeof value === 'string') {\n if ([\n 'code',\n 'sqlState',\n 'schema',\n 'routine',\n 'severity',\n 'constraint',\n 'table',\n 'column',\n ].includes(key)) {\n diagnostic[key] = core.sanitize.sanitizeText(value)\n }\n else {\n // 参数值只遮蔽诊断正文,不把数字参数误当成错误码或堆栈行号。\n const frames = key === 'stack'\n ? value.search(/^\\s+at\\s/m)\n : -1\n const body = frames < 0\n ? value\n : value.slice(0, frames)\n diagnostic[key] = core.sanitize.sanitizeText(body, [...secrets]).replace(/'(?:''|[^'])*'/g, '\\'[REDACTED]\\'') + (frames < 0\n ? ''\n : core.sanitize.sanitizeText(value.slice(frames)))\n }\n }\n else if (typeof value === 'number') {\n diagnostic[key] = value\n }\n }\n if (!Object.keys(diagnostic).length)\n diagnostic.message = core.sanitize.sanitizeText(String(error), [...secrets])\n ctx.logger.error(errorLabel, {\n ...summarizeOperationPayload(errorMeta),\n table: errorMeta?.tableName,\n column: errorMeta?.columnName,\n errorCode: definition.code,\n traceId,\n error: diagnostic,\n })\n const key = definition.code === HaiReldbError.DDL_FAILED.code\n ? 'reldb_ddlFailed'\n : definition.code === HaiReldbError.TRANSACTION_FAILED.code\n ? 'reldb_txFailed'\n : 'reldb_queryFailed'\n return err({\n ...definition,\n traceId,\n message: definition.code === HaiReldbError.DUPLICATE_ENTRY.code\n ? reldbM('reldb_duplicateEntry')\n : original\n ? core.sanitize.sanitizeText(original.message, [...secrets])\n : reldbM(key),\n cause: diagnostic,\n })\n }\n try {\n const result = await fn()\n return result.success\n ? result\n : failed(result.error.cause ?? result.error, result.error)\n }\n catch (error) {\n return failed(error)\n }\n}\n\n// ─── DDL 操作工厂 ───\n\n/**\n * 创建标准 DDL 操作\n *\n * 各 Provider 只需提供 raw DdlOperations,base 层统一处理标识符校验、连接守卫与运行时异常。\n * @param ctx - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param raw - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * function wrap(ctx: ReldbOpsContext, raw: DdlOperations) {\n * return createBaseDdlOps(ctx, raw)\n * }\n * ```\n */\nexport function createBaseDdlOps(ctx: ReldbOpsContext, raw: DdlOperations): DdlOperations {\n return {\n createTable(tableName, columns, ifNotExists = true) {\n const v1 = validateIdentifier(tableName)\n if (!v1.success)\n return Promise.resolve(v1)\n const v2 = validateIdentifiers(Object.keys(columns))\n if (!v2.success)\n return Promise.resolve(v2)\n logReldbOperation(ctx, 'write', 'ddl.createTable', { tableName, columns, ifNotExists })\n return wrapOp(ctx, () => raw.createTable(tableName, columns, ifNotExists), HaiReldbError.DDL_FAILED, 'DDL: createTable failed', { tableName })\n },\n\n dropTable(tableName, ifExists = true) {\n const v = validateIdentifier(tableName)\n if (!v.success)\n return Promise.resolve(v)\n logReldbOperation(ctx, 'write', 'ddl.dropTable', { tableName, ifExists })\n return wrapOp(ctx, () => raw.dropTable(tableName, ifExists), HaiReldbError.DDL_FAILED, 'DDL: dropTable failed', { tableName })\n },\n\n addColumn(tableName, columnName, columnDef) {\n const v1 = validateIdentifier(tableName)\n if (!v1.success)\n return Promise.resolve(v1)\n const v2 = validateIdentifier(columnName)\n if (!v2.success)\n return Promise.resolve(v2)\n logReldbOperation(ctx, 'write', 'ddl.addColumn', { tableName, columnName, columnDef })\n return wrapOp(ctx, () => raw.addColumn(tableName, columnName, columnDef), HaiReldbError.DDL_FAILED, 'DDL: addColumn failed', { tableName, columnName })\n },\n\n dropColumn(tableName, columnName) {\n const v1 = validateIdentifier(tableName)\n if (!v1.success)\n return Promise.resolve(v1)\n const v2 = validateIdentifier(columnName)\n if (!v2.success)\n return Promise.resolve(v2)\n logReldbOperation(ctx, 'write', 'ddl.dropColumn', { tableName, columnName })\n return wrapOp(ctx, () => raw.dropColumn(tableName, columnName), HaiReldbError.DDL_FAILED, 'DDL: dropColumn failed', { tableName, columnName })\n },\n\n renameTable(oldName, newName) {\n const v1 = validateIdentifier(oldName)\n if (!v1.success)\n return Promise.resolve(v1)\n const v2 = validateIdentifier(newName)\n if (!v2.success)\n return Promise.resolve(v2)\n logReldbOperation(ctx, 'write', 'ddl.renameTable', { oldName, newName })\n return wrapOp(ctx, () => raw.renameTable(oldName, newName), HaiReldbError.DDL_FAILED, 'DDL: renameTable failed', { oldName, newName })\n },\n\n createIndex(tableName, indexName, indexDef) {\n const v1 = validateIdentifier(tableName)\n if (!v1.success)\n return Promise.resolve(v1)\n const v2 = validateIdentifier(indexName)\n if (!v2.success)\n return Promise.resolve(v2)\n const v3 = validateIdentifiers(indexDef.columns)\n if (!v3.success)\n return Promise.resolve(v3)\n logReldbOperation(ctx, 'write', 'ddl.createIndex', { tableName, indexName, indexDef })\n return wrapOp(ctx, () => raw.createIndex(tableName, indexName, indexDef), HaiReldbError.DDL_FAILED, 'DDL: createIndex failed', { tableName, indexName })\n },\n\n dropIndex(indexName, ifExists = true) {\n const v = validateIdentifier(indexName)\n if (!v.success)\n return Promise.resolve(v)\n logReldbOperation(ctx, 'write', 'ddl.dropIndex', { indexName, ifExists })\n return wrapOp(ctx, () => raw.dropIndex(indexName, ifExists), HaiReldbError.DDL_FAILED, 'DDL: dropIndex failed', { indexName })\n },\n\n raw(sql) {\n logReldbOperation(ctx, 'write', 'ddl.raw', { sql })\n return wrapOp(ctx, () => raw.raw(sql), HaiReldbError.DDL_FAILED, 'DDL: raw failed', { sql })\n },\n }\n}\n\n// ─── DML 操作工厂 ───\n\n/**\n * 创建标准 DML 操作\n *\n * 各 Provider 只需提供 raw DmlOperations,base 层统一处理连接守卫与运行时异常。\n * @param ctx - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param raw - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * function wrap(ctx: ReldbOpsContext, raw: DmlOperations) {\n * return createBaseDmlOps(ctx, raw)\n * }\n * ```\n */\nexport function createBaseDmlOps(ctx: ReldbOpsContext, raw: DmlOperations): DmlOperations {\n return {\n query: (sql, params) => {\n logReldbOperation(ctx, 'read', 'query', { sql, params })\n return wrapOp(ctx, () => raw.query(sql, params), HaiReldbError.QUERY_FAILED, 'DML: query failed', { sql, params })\n },\n get: (sql, params) => {\n logReldbOperation(ctx, 'read', 'get', { sql, params })\n return wrapOp(ctx, () => raw.get(sql, params), HaiReldbError.QUERY_FAILED, 'DML: get failed', { sql, params })\n },\n execute: (sql, params) => {\n logReldbOperation(ctx, 'write', 'execute', { sql, params })\n return wrapOp(ctx, () => raw.execute(sql, params), HaiReldbError.QUERY_FAILED, 'DML: execute failed', { sql, params })\n },\n batch: (statements) => {\n logReldbOperation(ctx, 'write', 'batch', { count: statements.length, statements })\n return wrapOp(ctx, () => raw.batch(statements), HaiReldbError.QUERY_FAILED, 'DML: batch failed', { statements })\n },\n queryPage: (options) => {\n logReldbOperation(ctx, 'read', 'queryPage', options)\n return wrapOp(ctx, () => raw.queryPage(options), HaiReldbError.QUERY_FAILED, 'DML: queryPage failed', { ...options })\n },\n }\n}\n\n// ─── 事务管理器工厂 ───\n\n/**\n * 创建标准事务管理器\n *\n * 各 Provider 只需提供 beginTx 函数,base 层统一处理连接守卫 + tx.wrap 语法糖。\n * @param ctx - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param beginTx - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * function wrap(ctx: ReldbOpsContext, begin: () => Promise<HaiResult<import('../reldb-types.js').DmlWithTxOperations>>) {\n * return createBaseTxManager(ctx, begin)\n * }\n * ```\n */\nexport function createBaseTxManager(ctx: ReldbOpsContext, beginTx: TxManager['begin']): TxManager {\n const begin: TxManager['begin'] = async () => {\n logReldbOperation(ctx, 'write', 'tx.begin', {})\n const result = await wrapOp(ctx, beginTx, HaiReldbError.TRANSACTION_FAILED, 'TX: begin failed')\n if (!result.success) {\n return result\n }\n\n const tx = result.data\n return ok({\n ...tx,\n commit: async () => {\n logReldbOperation(ctx, 'write', 'tx.commit', {})\n return tx.commit()\n },\n rollback: async () => {\n logReldbOperation(ctx, 'write', 'tx.rollback', {})\n return tx.rollback()\n },\n })\n }\n return {\n begin,\n wrap: createTxWrap(begin),\n }\n}\n\n// ─── CRUD 管理器工厂 ───\n\n/**\n * 创建 CRUD 管理器\n *\n * @param ops - DML 操作接口\n * @returns CRUD 管理器\n * @example 模块内部上下文\n * ```ts\n * function users(ops: DmlOperations) {\n * return createBaseCrudManager(ops).table<{ id: string }>({ table: 'users', dbType: 'postgresql' })\n * }\n * ```\n */\nexport function createBaseCrudManager(ops: DmlOperations): CrudManager {\n return {\n table: config => createCrud(ops, config),\n }\n}\n\n// ─── 通用分页查询执行器 ───\n\n/**\n * 通用异步分页查询\n *\n * 使用独立的 COUNT(*) 查询获取总数,再执行 LIMIT/OFFSET 获取当前页数据。\n * 各 Provider 在实现 DmlOperations.queryPage 时使用此函数。\n *\n * @param queryRows - 查询多行的原始函数\n * @param options - 分页查询参数\n * @returns 分页结果\n * @example 模块内部上下文\n * ```ts\n * async function page(query: (sql: string, params?: unknown[]) => Promise<unknown[]>) {\n * return queryPageAsync<{ id: string }>(query, { sql: 'SELECT id FROM users', pagination: { page: 1, pageSize: 10 } })\n * }\n * ```\n */\nexport async function queryPageAsync<T>(\n queryRows: (sql: string, params?: unknown[]) => Promise<unknown[]>,\n options: PaginationQueryOptions,\n): Promise<PaginatedResult<T>> {\n const pagination = normalizePagination(options.pagination, options.overrides)\n\n // 独立 COUNT 查询\n const countSql = `SELECT COUNT(*) as cnt FROM (${options.sql}) AS t`\n const countRows = await queryRows(countSql, options.params)\n const total = (countRows as Record<string, unknown>[]).length > 0\n ? parseCount((countRows as Record<string, unknown>[])[0])\n : 0\n\n // 数据查询\n const dataSql = `${options.sql} LIMIT ? OFFSET ?`\n const dataParams = [\n ...(options.params ?? []),\n pagination.limit,\n pagination.offset,\n ]\n const rows = await queryRows(dataSql, dataParams)\n\n return buildPaginatedResult(rows as T[], total, pagination)\n}\n","/**\n * @h-ai/reldb — DDL SQL 构建辅助\n *\n * 纯函数集合:生成跨数据库通用的 DDL SQL 片段。\n * Provider 在 raw DdlOperations 实现中调用这些函数生成 SQL,再交由引擎执行。\n * @module reldb-ddl-builder\n */\n\nimport type { ReldbColumnDef, ReldbIndexDef, ReldbTableDef } from '../reldb-types.js'\n\nimport { escapeSqlString, quoteIdentifier } from '../reldb-security.js'\n\n// ─── 列定义构建 ───\n\n/**\n * 列定义 SQL 构建选项\n *\n * 各 Provider 通过不同选项控制方言差异(类型映射、主键内联方式等)。\n * @example 模块内部上下文\n * ```ts\n * const options: ColumnSqlOptions = { quoteId: quoteIdentifier, mapType: def => def.type, inlinePrimaryKey: true }\n * void options\n * ```\n */\nexport interface ColumnSqlOptions {\n /** 标识符引用函数 */\n quoteId: (n: string) => string\n /** ColumnType → SQL 类型字符串 */\n mapType: (def: ReldbColumnDef) => string\n /** 是否在列定义中内联 PRIMARY KEY(SQLite/PG true,MySQL false) */\n inlinePrimaryKey: boolean\n /** 自定义约束附加(返回额外 SQL 片段数组) */\n extraConstraints?: (def: ReldbColumnDef) => string[]\n /** 默认值格式化覆盖(返回 undefined 走通用逻辑,返回 null 跳过默认值) */\n formatDefault?: (def: ReldbColumnDef) => string | null | undefined\n}\n\n/**\n * 通用 buildColumnSql 骨架\n *\n * 各 Provider 仅提供 typeMap 和 overrides 即可。\n * @param name - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param def - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param options - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * const sql = buildColumnSqlBase('name', { type: 'TEXT', notNull: true }, { quoteId: quoteIdentifier, mapType: def => def.type, inlinePrimaryKey: true })\n * void sql\n * ```\n */\nexport function buildColumnSqlBase(\n name: string,\n def: ReldbColumnDef,\n options: ColumnSqlOptions,\n): string {\n const parts: string[] = [\n options.quoteId(name),\n ]\n\n parts.push(options.mapType(def))\n\n if (options.inlinePrimaryKey && def.primaryKey) {\n parts.push('PRIMARY KEY')\n }\n\n // 额外约束(如 AUTOINCREMENT、AUTO_INCREMENT、NOT NULL for PK 等)\n if (options.extraConstraints) {\n parts.push(...options.extraConstraints(def))\n }\n\n if (def.notNull && !def.primaryKey) {\n parts.push('NOT NULL')\n }\n\n if (def.unique && !def.primaryKey) {\n parts.push('UNIQUE')\n }\n\n // 默认值\n if (def.defaultValue !== undefined) {\n const custom = options.formatDefault?.(def)\n if (custom === null) {\n // null 表示跳过默认值(如 MySQL autoIncrement)\n }\n else if (custom !== undefined) {\n parts.push(custom)\n }\n else if (def.defaultValue === null) {\n parts.push('DEFAULT NULL')\n }\n else if (typeof def.defaultValue === 'string') {\n if (def.defaultValue.startsWith('(') && def.defaultValue.endsWith(')')) {\n parts.push(`DEFAULT ${def.defaultValue}`)\n }\n else {\n parts.push(`DEFAULT '${escapeSqlString(def.defaultValue)}'`)\n }\n }\n else {\n parts.push(`DEFAULT ${def.defaultValue}`)\n }\n }\n\n // 外键引用(内联模式)\n if (options.inlinePrimaryKey && def.references) {\n parts.push(`REFERENCES ${quoteIdentifier(def.references.table)}(${quoteIdentifier(def.references.column)})`)\n if (def.references.onDelete) {\n parts.push(`ON DELETE ${def.references.onDelete}`)\n }\n if (def.references.onUpdate) {\n parts.push(`ON UPDATE ${def.references.onUpdate}`)\n }\n }\n\n return parts.join(' ')\n}\n\n// ─── 表级 DDL SQL ───\n\n/**\n * 默认 CREATE TABLE SQL 生成(SQLite / PostgreSQL 通用)\n *\n * 列定义内联主键和外键,无额外子句。\n * @param buildColumnSql - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param quotedTable - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param columns - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param ifNotExists - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * const sql = buildDefaultCreateTableSql((name, def) => buildColumnSqlBase(name, def, { quoteId: quoteIdentifier, mapType: value => value.type, inlinePrimaryKey: true }), quoteIdentifier('users'), { id: { type: 'TEXT', primaryKey: true } }, true)\n * void sql\n * ```\n */\nexport function buildDefaultCreateTableSql(\n buildColumnSql: (name: string, def: ReldbColumnDef) => string,\n quotedTable: string,\n columns: ReldbTableDef,\n ifNotExists: boolean,\n): string {\n const columnDefs = Object.entries(columns)\n .map(([name, def]) => buildColumnSql(name, def))\n .join(', ')\n const ifNotExistsClause = ifNotExists ? 'IF NOT EXISTS ' : ''\n return `CREATE TABLE ${ifNotExistsClause}${quotedTable} (${columnDefs})`\n}\n\n/**\n * 默认 CREATE INDEX SQL 生成(SQLite / PostgreSQL 通用)\n *\n * 支持 IF NOT EXISTS 与 WHERE 子句。\n * @param quoteId - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param quotedTable - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param quotedIndex - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param indexDef - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * const sql = buildDefaultCreateIndexSql(quoteIdentifier, quoteIdentifier('users'), quoteIdentifier('users_name_idx'), { columns: ['name'] })\n * void sql\n * ```\n */\nexport function buildDefaultCreateIndexSql(\n quoteId: (name: string) => string,\n quotedTable: string,\n quotedIndex: string,\n indexDef: ReldbIndexDef,\n): string {\n const uniqueClause = indexDef.unique ? 'UNIQUE ' : ''\n const columns = indexDef.columns.map(c => quoteId(c)).join(', ')\n const whereClause = indexDef.where\n ? ` WHERE ${indexDef.where}`\n : ''\n return `CREATE ${uniqueClause}INDEX IF NOT EXISTS ${quotedIndex} ON ${quotedTable} (${columns})${whereClause}`\n}\n\n/**\n * 默认 RENAME TABLE SQL 生成(SQLite / PostgreSQL 通用)\n * @param quotedOld - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param quotedNew - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * void buildDefaultRenameTableSql(quoteIdentifier('users_old'), quoteIdentifier('users'))\n * ```\n */\nexport function buildDefaultRenameTableSql(quotedOld: string, quotedNew: string): string {\n return `ALTER TABLE ${quotedOld} RENAME TO ${quotedNew}`\n}\n\n/**\n * 默认 DROP INDEX SQL 生成(SQLite / PostgreSQL 通用)\n * @param quoteId - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param indexName - 当前操作所需的输入;以声明类型和上文约束为准。\n * @param ifExists - 当前操作所需的输入;以声明类型和上文约束为准。\n * @returns 声明返回类型对应的操作结果。\n * @example 模块内部上下文\n * ```ts\n * void buildDefaultDropIndexSql(quoteIdentifier, 'users_name_idx', true)\n * ```\n */\nexport function buildDefaultDropIndexSql(\n quoteId: (name: string) => string,\n indexName: string,\n ifExists: boolean,\n): string {\n const ifExistsClause = ifExists ? 'IF EXISTS ' : ''\n return `DROP INDEX ${ifExistsClause}${quoteId(indexName)}`\n}\n","/**\n * @h-ai/reldb — MySQL Provider\n *\n * 基于 mysql2 的 MySQL 数据库实现。\n * 按 Context + wrapOp → Factory 模式实现。\n * @module reldb-provider-mysql\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type { PoolConnection as MysqlConnection, Pool as MysqlPool, ResultSetHeader } from 'mysql2/promise'\nimport type { MysqlPoolConfig, ReldbConfig } from '../reldb-config.js'\nimport type {\n DdlOperations,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n PaginationQueryOptions,\n ReldbColumnDef,\n} from '../reldb-types.js'\nimport type { ReldbOpsContext } from './reldb-provider-base.js'\nimport type { ReldbProvider } from './reldb-provider-types.js'\n\nimport { createRequire } from 'node:module'\nimport { isIP } from 'node:net'\nimport { performance } from 'node:perf_hooks'\nimport { core, err, ok } from '@h-ai/core'\nimport { MysqlPoolConfigSchema } from '../reldb-config.js'\nimport { reldbM } from '../reldb-i18n.js'\nimport { HaiReldbError } from '../reldb-types.js'\n\nimport {\n buildColumnSqlBase,\n} from './reldb-ddl-builder.js'\nimport { createBaseCrudManager, createBaseDdlOps, createBaseDmlOps, createBaseTxManager, queryPageAsync } from './reldb-provider-base.js'\nimport { createTxHandle } from './reldb-tx-assembler.js'\n\nconst logger = core.logger.child({ module: 'reldb', scope: 'mysql' })\n\n/**\n * 借用真实驱动连接及其容量槽位;超时只约束借用完成前,不中止已启动 SQL。\n * @example 模块内部上下文\n * ```ts\n * async function ready(lease: MysqlConnectionLease) {\n * try { return await lease.connection.query('SELECT 1') } finally { lease.release() }\n * }\n * ```\n */\ninterface MysqlConnectionLease {\n connection: MysqlConnection\n deadline: number\n release: () => void\n}\n\n/**\n * 可取消的 FIFO 排队项;进入驱动前可直接移除,绝不留在 mysql2 内部队列。\n * @example 模块内部上下文\n * ```ts\n * function cancel(waiter: MysqlConnectionWaiter) {\n * waiter.cancel() // 超时后不能再转交给 mysql2 排队。\n * }\n * ```\n */\ninterface MysqlConnectionWaiter {\n start: () => void\n cancel: () => void\n}\n\n// ─── MySQL Provider 实现 ───\n\n/**\n * 创建 MySQL Provider 实例\n *\n * @returns MySQL Provider\n * @example 模块内部上下文\n * ```ts\n * const provider = createMysqlProvider()\n * const closed = await provider.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * ```\n */\nexport function createMysqlProvider(): ReldbProvider {\n /** 连接池实例 */\n let pool: MysqlPool | null = null\n /** 只有健康检查完成的连接才可供业务使用;清理失败仍保留底层资源。 */\n let ready = false\n let closing: Promise<HaiResult<void>> | null = null\n let poolConfig: MysqlPoolConfig | null = null\n let activeSlots = 0\n let slotsDrained: Promise<void> = Promise.resolve()\n let resolveSlots: (() => void) | null = null\n const waiters: MysqlConnectionWaiter[] = []\n let currentConfig: ReldbConfig | null = null\n\n /** 归还槽位后只启动未取消的队首请求;在途建连即使已超时也须结算后才能腾出槽位。 */\n function releaseSlot(): void {\n activeSlots--\n if (ready && poolConfig) {\n const maximum = poolConfig.max\n while (waiters.length > 0) {\n if (activeSlots >= maximum)\n break\n waiters.shift()!.start()\n }\n }\n if (activeSlots === 0) {\n resolveSlots?.()\n resolveSlots = null\n }\n }\n\n /**\n * 在唯一截止期限内借用连接;SDK 不排队,超时排队项立即删除,迟到连接只释放而不执行 SQL。\n *\n * 已进入驱动的建连不能由 mysql2 Promise API 取消,因此保留槽位直到它完成/失败。\n * close 等待这些有限建连结算,驱动 connectTimeout 与 acquireTimeout 相同。\n */\n function acquireConnection(): Promise<HaiResult<MysqlConnectionLease>> {\n const owned = pool\n const limits = poolConfig\n if (!ready || !owned || !limits)\n return Promise.resolve(err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized')))\n if (activeSlots >= limits.max && waiters.length >= limits.queueLimit)\n return Promise.resolve(err(HaiReldbError.POOL_EXHAUSTED, reldbM('reldb_mysqlPoolQueueFull')))\n\n const deadline = performance.now() + limits.acquireTimeout\n return new Promise((resolve) => {\n let completed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeoutResult = () => err(HaiReldbError.TIMEOUT, reldbM('reldb_mysqlPoolAcquireTimeout'))\n const finish = (result: HaiResult<MysqlConnectionLease>) => {\n if (completed)\n return\n completed = true\n clearTimeout(timer)\n resolve(result)\n }\n const waiter: MysqlConnectionWaiter = {\n cancel: () => finish(err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized'))),\n start: () => {\n if (!ready || performance.now() >= deadline) {\n finish(ready\n ? timeoutResult()\n : err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized')))\n return\n }\n if (activeSlots++ === 0)\n slotsDrained = new Promise<void>((resolve) => { resolveSlots = resolve })\n // 独立处理失败分支,避免 Promise.race 遗留一个会在后台继续执行的连接借用。\n void Promise.resolve().then(() => owned.getConnection()).then((connection) => {\n if (completed || !ready || performance.now() >= deadline) {\n try {\n connection.release()\n }\n finally { releaseSlot() }\n finish(ready\n ? timeoutResult()\n : err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized')))\n return\n }\n let released = false\n finish(ok({\n connection,\n deadline,\n release: () => {\n if (released)\n return\n released = true\n try {\n connection.release()\n }\n finally { releaseSlot() }\n },\n }))\n }, (error) => {\n releaseSlot()\n finish(err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_mysqlConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error))\n }).catch((error) => {\n // 迟到连接清理异常时停止新业务,保留池供 close 重试,不泄露驱动错误。\n ready = false\n finish(err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_mysqlConnectionFailed', {\n params: {\n error: reldbM('reldb_mysqlPoolReleaseFailed'),\n },\n }), error))\n logger.warn('MySQL connection release failed; pool requires cleanup')\n })\n },\n }\n timer = setTimeout(() => {\n const index = waiters.indexOf(waiter)\n if (index >= 0)\n waiters.splice(index, 1)\n finish(timeoutResult())\n }, limits.acquireTimeout)\n if (activeSlots < limits.max)\n waiter.start()\n else\n waiters.push(waiter)\n })\n }\n\n /** 所有池级 SQL/DDL 都先借用并归还连接,不能绕过获取超时或容量限制。 */\n async function withConnection<T>(fn: (connection: MysqlConnection) => Promise<HaiResult<T>>): Promise<HaiResult<T>> {\n const acquired = await acquireConnection()\n if (!acquired.success)\n return acquired\n try {\n if (!ready)\n return err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized'))\n if (performance.now() >= acquired.data.deadline)\n return err(HaiReldbError.TIMEOUT, reldbM('reldb_mysqlPoolAcquireTimeout'))\n return await fn(acquired.data.connection)\n }\n finally { acquired.data.release() }\n }\n\n /** 保留所有权直到释放成功;合并并发关闭且立即阻止新操作。 */\n function closeResource(): Promise<HaiResult<void>> {\n ready = false\n currentConfig = null\n for (const waiter of waiters.splice(0))\n waiter.cancel()\n if (closing)\n return closing\n const owned = pool\n if (!owned)\n return Promise.resolve(ok(undefined))\n closing = (async (): Promise<HaiResult<void>> => {\n try {\n await slotsDrained\n await owned.end()\n pool = null\n poolConfig = null\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_mysqlConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n })().finally(() => { closing = null })\n return closing\n }\n\n // ─── 操作上下文 ───\n\n const ctx: ReldbOpsContext = {\n isConnected: () => ready && pool !== null,\n logger,\n operationLog: () => currentConfig?.operationLog,\n }\n\n // ─── 辅助函数 ───\n\n /** MySQL 标识符引用(反引号) */\n function mysqlQuoteId(name: string): string {\n return `\\`${name}\\``\n }\n\n /** 事务错误消息生成 */\n function mysqlTxErrorMessage(detail: string): string {\n return reldbM('reldb_mysqlTxFailed', {\n params: { error: detail },\n })\n }\n\n /**\n * 根据索引名解析所在表\n *\n * MySQL 的 `DROP INDEX` 语句需要表名,因此通过 INFORMATION_SCHEMA\n * 在当前数据库中查找索引所属表。\n */\n async function findIndexTableName(\n indexName: string,\n ): Promise<HaiResult<string | null>> {\n return withConnection(async (connection) => {\n const [rows] = await connection.query(\n 'SELECT TABLE_NAME as name FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND INDEX_NAME = ? LIMIT 1',\n [indexName],\n )\n const data = rows as Array<{ name: string }>\n return ok(data[0]?.name ?? null)\n })\n }\n\n // ─── MySQL 方言辅助 ───\n\n /** MySQL 列类型映射 */\n function mapMysqlType(def: ReldbColumnDef): string {\n switch (def.type) {\n case 'TEXT':\n return 'VARCHAR(255)'\n case 'INTEGER':\n return def.autoIncrement ? 'BIGINT' : 'INT'\n case 'BIGINT':\n return 'BIGINT'\n case 'REAL':\n return 'DOUBLE'\n case 'BLOB':\n return 'BLOB'\n case 'BOOLEAN':\n return 'TINYINT(1)'\n case 'TIMESTAMP':\n return 'DATETIME'\n case 'JSON':\n return 'JSON'\n default:\n return 'TEXT'\n }\n }\n\n /** MySQL buildColumnSql */\n function mysqlBuildColumnSql(name: string, def: ReldbColumnDef): string {\n return buildColumnSqlBase(name, def, {\n quoteId: mysqlQuoteId,\n mapType: mapMysqlType,\n inlinePrimaryKey: false,\n extraConstraints: (d) => {\n const extras: string[] = []\n // MySQL 主键需要显式 NOT NULL(base 的 notNull 检查排除了 primaryKey)\n if (d.primaryKey)\n extras.push('NOT NULL')\n if (d.autoIncrement)\n extras.push('AUTO_INCREMENT')\n return extras\n },\n formatDefault: (d) => {\n if (d.defaultValue === undefined)\n return undefined\n if (d.autoIncrement)\n return null // 跳过 autoIncrement 列的默认值\n if (typeof d.defaultValue === 'string'\n && (d.defaultValue === 'NOW()' || d.defaultValue === 'CURRENT_TIMESTAMP')) {\n return `DEFAULT ${d.defaultValue}`\n }\n if (typeof d.defaultValue === 'boolean') {\n return `DEFAULT ${d.defaultValue ? 1 : 0}`\n }\n return undefined // 走通用逻辑\n },\n })\n }\n\n /** MySQL CREATE TABLE(含 PRIMARY KEY、FOREIGN KEY、ENGINE) */\n function mysqlBuildCreateTableSql(quotedTable: string, columns: Record<string, ReldbColumnDef>, ifNotExists: boolean): string {\n const columnDefs: string[] = []\n let primaryKeyCol: string | null = null\n\n for (const [name, def] of Object.entries(columns)) {\n columnDefs.push(mysqlBuildColumnSql(name, def))\n if (def.primaryKey) {\n primaryKeyCol = name\n }\n }\n\n if (primaryKeyCol) {\n columnDefs.push(`PRIMARY KEY (${mysqlQuoteId(primaryKeyCol)})`)\n }\n\n // 外键约束\n for (const [name, def] of Object.entries(columns)) {\n if (def.references) {\n let fkSql = `FOREIGN KEY (${mysqlQuoteId(name)}) REFERENCES ${mysqlQuoteId(def.references.table)}(${mysqlQuoteId(def.references.column)})`\n if (def.references.onDelete) {\n fkSql += ` ON DELETE ${def.references.onDelete}`\n }\n if (def.references.onUpdate) {\n fkSql += ` ON UPDATE ${def.references.onUpdate}`\n }\n columnDefs.push(fkSql)\n }\n }\n\n const ifNotExistsClause = ifNotExists ? 'IF NOT EXISTS ' : ''\n return `CREATE TABLE ${ifNotExistsClause}${quotedTable} (${columnDefs.join(', ')}) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4`\n }\n\n // ─── DDL 操作 ───\n\n /** 单条 DDL 共享池借用边界,释放在 finally 内完成。 */\n function executeDdl(sql: string): Promise<HaiResult<void>> {\n return withConnection(async (connection) => {\n await connection.query(sql)\n return ok(undefined)\n })\n }\n\n const rawDdl: DdlOperations = {\n async createTable(name, columns, ifNotExists = true) {\n const quotedTable = mysqlQuoteId(name)\n const sql = mysqlBuildCreateTableSql(quotedTable, columns, ifNotExists)\n return executeDdl(sql)\n },\n async dropTable(name, ifExists) {\n const ifExistsClause = ifExists ? 'IF EXISTS ' : ''\n return executeDdl(`DROP TABLE ${ifExistsClause}${mysqlQuoteId(name)}`)\n },\n async addColumn(table, column, def) {\n const colSql = mysqlBuildColumnSql(column, def)\n return executeDdl(`ALTER TABLE ${mysqlQuoteId(table)} ADD COLUMN ${colSql}`)\n },\n async dropColumn(table, column) {\n return executeDdl(`ALTER TABLE ${mysqlQuoteId(table)} DROP COLUMN ${mysqlQuoteId(column)}`)\n },\n async renameTable(oldName, newName) {\n return executeDdl(`RENAME TABLE ${mysqlQuoteId(oldName)} TO ${mysqlQuoteId(newName)}`)\n },\n async createIndex(table, index, def) {\n const uniqueClause = def.unique ? 'UNIQUE ' : ''\n const columns = def.columns.map(c => mysqlQuoteId(c)).join(', ')\n return executeDdl(`CREATE ${uniqueClause}INDEX ${mysqlQuoteId(index)} ON ${mysqlQuoteId(table)} (${columns})`)\n },\n async dropIndex(index, ifExists) {\n const tableResult = await findIndexTableName(index)\n if (!tableResult.success)\n return tableResult\n\n if (!tableResult.data) {\n if (ifExists)\n return ok(undefined)\n return err(HaiReldbError.DDL_FAILED, reldbM('reldb_ddlFailed', {\n params: { error: `index not found: ${index}` },\n }))\n }\n\n return executeDdl(`DROP INDEX ${mysqlQuoteId(index)} ON ${mysqlQuoteId(tableResult.data)}`)\n },\n async raw(sql) {\n return executeDdl(sql)\n },\n }\n\n // ─── DML 操作 ───\n\n const rawDml: DmlOperations = {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n return withConnection(async (connection) => {\n const [rows]: [unknown, unknown] = await connection.query(sql, params)\n return ok(rows as T[])\n })\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n return withConnection(async (connection) => {\n const [rows]: [unknown, unknown] = await connection.query(sql, params)\n return ok(((rows as unknown[])[0] as T) ?? null)\n })\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n return withConnection(async (connection) => {\n const [result] = await connection.execute<ResultSetHeader>({ sql, values: params })\n return ok({ changes: result.affectedRows, lastInsertRowid: result.insertId })\n })\n },\n async batch(statements) {\n return withConnection(async (connection) => {\n try {\n await connection.beginTransaction()\n for (const { sql: s, params } of statements) {\n await connection.execute({ sql: s, values: params })\n }\n await connection.commit()\n return ok(undefined)\n }\n catch (error) {\n await connection.rollback().catch(() => { })\n return err(HaiReldbError.QUERY_FAILED, reldbM('reldb_batchFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n })\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n return withConnection(async (connection) => {\n const result = await queryPageAsync<T>(\n async (sql, params) => {\n const [rows] = await connection.query(sql, params)\n return rows as unknown[]\n },\n options,\n )\n return ok(result)\n })\n },\n }\n\n // ─── 事务 ───\n\n /** 创建事务连接上的 DML 操作 */\n function createMysqlTxDmlOps(conn: MysqlConnection): DmlOperations {\n return {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n const [rows]: [unknown, unknown] = await conn.query(sql, params)\n return ok(rows as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const [rows]: [unknown, unknown] = await conn.query(sql, params)\n return ok(((rows as unknown[])[0] as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const [result] = await conn.execute<ResultSetHeader>({ sql, values: params })\n return ok({ changes: result.affectedRows, lastInsertRowid: result.insertId })\n },\n async batch(statements) {\n for (const { sql: s, params } of statements) {\n await conn.execute({ sql: s, values: params })\n }\n return ok(undefined)\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const result = await queryPageAsync<T>(\n async (sql, params) => {\n const [rows] = await conn.query(sql, params)\n return rows as unknown[]\n },\n options,\n )\n return ok(result)\n },\n }\n }\n\n async function beginTx(): Promise<HaiResult<DmlWithTxOperations>> {\n const acquired = await acquireConnection()\n if (!acquired.success)\n return acquired\n let connection: MysqlConnection | null = acquired.data.connection\n try {\n if (!ready || performance.now() >= acquired.data.deadline) {\n acquired.data.release()\n return ready\n ? err(HaiReldbError.TIMEOUT, reldbM('reldb_mysqlPoolAcquireTimeout'))\n : err(HaiReldbError.NOT_INITIALIZED, reldbM('reldb_notInitialized'))\n }\n await connection.beginTransaction()\n }\n catch (error) {\n acquired.data.release()\n return err(HaiReldbError.TRANSACTION_FAILED, mysqlTxErrorMessage(String(error)), error)\n }\n\n const txDmlOps = createMysqlTxDmlOps(connection)\n const guardedTxDmlOps = createBaseDmlOps({\n ...ctx,\n isConnected: () => connection !== null,\n }, txDmlOps)\n return ok(createTxHandle(guardedTxDmlOps, {\n commit: async () => { await connection!.commit() },\n rollback: async () => { await connection!.rollback() },\n release: () => {\n try {\n acquired.data.release()\n }\n finally {\n connection = null\n }\n },\n errorMessage: mysqlTxErrorMessage,\n }))\n }\n\n // ─── 组装 Provider ───\n\n const dmlOps = createBaseDmlOps(ctx, rawDml)\n\n return {\n async connect(config: ReldbConfig): Promise<HaiResult<void>> {\n if (config.type !== 'mysql') {\n return err(HaiReldbError.UNSUPPORTED_TYPE, reldbM('reldb_mysqlOnlyMysql'))\n }\n const previousCleanup = await closeResource()\n if (!previousCleanup.success)\n return previousCleanup\n const host = config.url\n ? new URL(config.url).hostname\n : config.host\n if (config.ssl && config.ssl.rejectUnauthorized && config.ssl.verifyIdentity && isIP(host.replace(/^\\[|\\]$/g, ''))) {\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_mysqlTlsDnsRequired'))\n }\n if (config.ssl && (!config.ssl.rejectUnauthorized || !config.ssl.verifyIdentity)) {\n logger.warn('MySQL TLS server verification is explicitly disabled', {\n certificateVerification: config.ssl.rejectUnauthorized,\n hostnameVerification: config.ssl.rejectUnauthorized && config.ssl.verifyIdentity,\n })\n }\n try {\n // Node ESM 按需加载驱动,避免构建器生成无法执行的动态 require。\n const mysql = createRequire(import.meta.url)('mysql2/promise')\n\n poolConfig = config.pool ?? MysqlPoolConfigSchema.parse({})\n pool = mysql.createPool({\n // mysql2 会用非空的分字段覆盖 URI;URL 模式不能传 schema 默认 host 或冲突字段。\n ...(config.url\n ? { uri: config.url }\n : {\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n }),\n ssl: config.ssl,\n connectionLimit: poolConfig.max,\n // 排队由本 Provider 管理,超时项可直接移除;驱动绝不保留取消后的等待者。\n waitForConnections: false,\n connectTimeout: poolConfig.acquireTimeout,\n charset: config.mysql?.charset ?? 'utf8mb4',\n }) as MysqlPool\n\n // 验证连接可用性\n await pool.query('SELECT 1')\n\n ready = true\n currentConfig = config\n logger.info('Connected to MySQL', config.url\n ? {\n target: core.sanitize.sanitizeUrl(config.url),\n }\n : { host: config.host, port: config.port, database: config.database })\n return ok(undefined)\n }\n catch (error) {\n const cleanup = await closeResource()\n const result = err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_mysqlConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n return cleanup.success || result.success\n ? result\n : err({\n ...result.error,\n ext: { cleanupPending: true, cleanupError: cleanup.error },\n })\n }\n },\n\n close: closeResource,\n\n isConnected: () => ctx.isConnected(),\n ddl: createBaseDdlOps(ctx, rawDdl),\n sql: dmlOps,\n crud: createBaseCrudManager(dmlOps),\n tx: createBaseTxManager(ctx, beginTx),\n }\n}\n","/**\n * @h-ai/reldb — PostgreSQL Provider\n *\n * 基于 pg 的 PostgreSQL 数据库实现。\n * 按 Context + wrapOp → Factory 模式实现。\n * @module reldb-provider-postgres\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type { ReldbConfig } from '../reldb-config.js'\nimport type {\n DdlOperations,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n PaginationQueryOptions,\n ReldbColumnDef,\n} from '../reldb-types.js'\nimport type { ReldbOpsContext } from './reldb-provider-base.js'\nimport type { ReldbProvider } from './reldb-provider-types.js'\n\nimport { createRequire } from 'node:module'\nimport { setTimeout as delay } from 'node:timers/promises'\nimport { core, err, ok } from '@h-ai/core'\nimport { reldbM } from '../reldb-i18n.js'\nimport { quoteIdentifier } from '../reldb-security.js'\nimport { HaiReldbError } from '../reldb-types.js'\nimport {\n buildColumnSqlBase,\n buildDefaultCreateIndexSql,\n buildDefaultCreateTableSql,\n buildDefaultDropIndexSql,\n buildDefaultRenameTableSql,\n} from './reldb-ddl-builder.js'\nimport { createBaseCrudManager, createBaseDdlOps, createBaseDmlOps, createBaseTxManager, queryPageAsync } from './reldb-provider-base.js'\nimport { createTxHandle } from './reldb-tx-assembler.js'\n\nconst logger = core.logger.child({ module: 'reldb', scope: 'postgres' })\n\n/** PostgreSQL 美元引号起始标记匹配(提至模块作用域避免每次调用重建) */\nconst PG_DOLLAR_TAG_REGEX = /^\\$([A-Z_]\\w*)?\\$/i\n\n// ─── pg 类型定义(避免强依赖) ───\n\n/**\n * PostgreSQL 连接池接口\n * @example 模块内部上下文\n * ```ts\n * async function ready(pool: PgPool) {\n * const client = await pool.connect()\n * try { return await client.query('SELECT 1') } finally { client.release() }\n * }\n * ```\n */\ninterface PgPool {\n query: (text: string, values?: unknown[]) => Promise<{ rows: unknown[], rowCount: number }>\n connect: () => Promise<PgClient>\n end: () => Promise<void>\n on: (event: 'error', listener: (error: unknown) => void) => void\n}\n\n/**\n * PostgreSQL 客户端接口\n * @example 模块内部上下文\n * ```ts\n * async function ready(client: PgClient) {\n * try { return await client.query('SELECT 1') } finally { client.release() }\n * }\n * ```\n */\ninterface PgClient {\n query: (text: string, values?: unknown[]) => Promise<{ rows: unknown[], rowCount: number }>\n release: () => void\n}\n\n// ─── PostgreSQL Provider 实现 ───\n\n/**\n * 创建 PostgreSQL Provider 实例\n *\n * @returns PostgreSQL Provider\n * @example 模块内部上下文\n * ```ts\n * const provider = createPostgresProvider()\n * const closed = await provider.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * ```\n */\nexport function createPostgresProvider(): ReldbProvider {\n /** 连接池实例 */\n let pool: PgPool | null = null\n /** 只有健康检查完成的连接才可供业务使用;清理失败仍保留底层资源。 */\n let ready = false\n let closing: Promise<HaiResult<void>> | null = null\n let activeTransactions = 0\n let transactionsDrained: Promise<void> = Promise.resolve()\n let resolveTransactions: (() => void) | null = null\n\n /** 在获取连接前登记事务,关闭时等待其提交/回滚并归还连接。 */\n function retainTransaction(): () => void {\n if (activeTransactions++ === 0)\n transactionsDrained = new Promise<void>((resolve) => { resolveTransactions = resolve })\n return () => {\n if (--activeTransactions === 0) {\n resolveTransactions?.()\n resolveTransactions = null\n }\n }\n }\n let currentConfig: ReldbConfig | null = null\n\n /** 保留所有权直到释放成功;合并并发关闭且立即阻止新操作。 */\n function closeResource(): Promise<HaiResult<void>> {\n ready = false\n currentConfig = null\n if (closing)\n return closing\n const owned = pool\n if (!owned)\n return Promise.resolve(ok(undefined))\n closing = (async (): Promise<HaiResult<void>> => {\n try {\n await transactionsDrained\n await owned.end()\n pool = null\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_postgresConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n })().finally(() => { closing = null })\n return closing\n }\n\n // ─── 操作上下文 ───\n\n const ctx: ReldbOpsContext = {\n isConnected: () => ready && pool !== null,\n logger,\n operationLog: () => currentConfig?.operationLog,\n }\n\n // ─── 辅助函数 ───\n\n /**\n * 将 ? 占位符转换为 PostgreSQL 的 $1, $2, ... 格式\n *\n * 需要跳过字符串字面量(单/双引号)、美元引号块($tag$...$tag$)以及行/块注释中的 `?`,\n * 避免 `SELECT 'a?b' WHERE x=?` 被错误重写为 `SELECT 'a$1' WHERE x=$2`。\n */\n function convertPlaceholders(sql: string): string {\n let out = ''\n let index = 0\n let i = 0\n const len = sql.length\n\n while (i < len) {\n const ch = sql[i]\n\n // 单引号字符串(含 SQL 标准 '' 转义)\n if (ch === '\\'') {\n out += ch\n i++\n while (i < len) {\n const c = sql[i]\n out += c\n i++\n if (c === '\\'') {\n if (sql[i] === '\\'') {\n out += sql[i]\n i++\n continue\n }\n break\n }\n }\n continue\n }\n\n // 双引号标识符(含 \"\" 转义)\n if (ch === '\"') {\n out += ch\n i++\n while (i < len) {\n const c = sql[i]\n out += c\n i++\n if (c === '\"') {\n if (sql[i] === '\"') {\n out += sql[i]\n i++\n continue\n }\n break\n }\n }\n continue\n }\n\n // PostgreSQL 美元引号:$tag$ ... $tag$ 或 $$ ... $$\n if (ch === '$') {\n const tagMatch = sql.slice(i).match(PG_DOLLAR_TAG_REGEX)\n if (tagMatch) {\n const tag = tagMatch[0]\n const end = sql.indexOf(tag, i + tag.length)\n if (end === -1) {\n out += sql.slice(i)\n i = len\n }\n else {\n out += sql.slice(i, end + tag.length)\n i = end + tag.length\n }\n continue\n }\n }\n\n // 单行注释 -- ... \\n\n if (ch === '-' && sql[i + 1] === '-') {\n const nl = sql.indexOf('\\n', i)\n if (nl === -1) {\n out += sql.slice(i)\n i = len\n }\n else {\n out += sql.slice(i, nl + 1)\n i = nl + 1\n }\n continue\n }\n\n // 块注释 /* ... */(支持简单嵌套处理:按首个结束标记终止)\n if (ch === '/' && sql[i + 1] === '*') {\n const endIdx = sql.indexOf('*/', i + 2)\n if (endIdx === -1) {\n out += sql.slice(i)\n i = len\n }\n else {\n out += sql.slice(i, endIdx + 2)\n i = endIdx + 2\n }\n continue\n }\n\n // 占位符替换\n if (ch === '?') {\n out += `$${++index}`\n i++\n continue\n }\n\n out += ch\n i++\n }\n\n return out\n }\n\n /** 事务错误消息生成 */\n function pgTxErrorMessage(detail: string): string {\n return reldbM('reldb_postgresTxFailed', {\n params: { error: detail },\n })\n }\n\n // ─── PostgreSQL 方言辅助 ───\n\n /** PostgreSQL 列类型映射 */\n function mapPgType(def: ReldbColumnDef): string {\n switch (def.type) {\n case 'TEXT':\n return 'TEXT'\n case 'INTEGER':\n return def.autoIncrement ? 'BIGSERIAL' : 'INTEGER'\n case 'BIGINT':\n return 'BIGINT'\n case 'REAL':\n return 'DOUBLE PRECISION'\n case 'BLOB':\n return 'BYTEA'\n case 'BOOLEAN':\n return 'BOOLEAN'\n case 'TIMESTAMP':\n return 'TIMESTAMP'\n case 'JSON':\n return 'JSONB'\n default:\n return 'TEXT'\n }\n }\n\n /** PostgreSQL buildColumnSql */\n function pgBuildColumnSql(name: string, def: ReldbColumnDef): string {\n return buildColumnSqlBase(name, def, {\n quoteId: quoteIdentifier,\n mapType: mapPgType,\n inlinePrimaryKey: true,\n formatDefault: (d) => {\n if (d.defaultValue === undefined)\n return undefined\n if (typeof d.defaultValue === 'string'\n && (d.defaultValue === 'NOW()' || d.defaultValue === 'CURRENT_TIMESTAMP')) {\n return `DEFAULT ${d.defaultValue}`\n }\n return undefined // 走通用逻辑\n },\n })\n }\n\n /** 通用 pg queryFn → rows 适配 */\n async function pgQueryRows(\n queryFn: (text: string, values?: unknown[]) => Promise<{ rows: unknown[], rowCount: number }>,\n sql: string,\n params?: unknown[],\n ): Promise<unknown[]> {\n const result = await queryFn(convertPlaceholders(sql), params)\n return result.rows\n }\n\n /** 仅重试自动提交、单条幂等建表/索引的 PostgreSQL 系统目录竞争。事务失败须由调用方回滚。 */\n async function executeStatement(sql: string, params?: unknown[]) {\n try {\n return await pool!.query(sql, params)\n }\n catch (error) {\n const kind = /^\\s*CREATE\\s+(TABLE|(?:UNIQUE\\s+)?INDEX)\\s+IF\\s+NOT\\s+EXISTS\\s+/i.exec(sql)?.[1]?.toUpperCase()\n const single = !sql.trim().replace(/;$/, '').includes(';')\n const catalogConflict = typeof error === 'object' && error !== null && 'code' in error && (\n (error.code === '23505' && 'schema' in error && error.schema === 'pg_catalog'\n && 'constraint' in error && (error.constraint === 'pg_class_relname_nsp_index' || (kind === 'TABLE' && error.constraint === 'pg_type_typname_nsp_index')))\n // 并发提交可能在系统目录检查之间触发重复关系或类型错误,此路径没有 schema/constraint。\n || (kind === 'TABLE' && 'routine' in error && (\n (error.routine === 'heap_create_with_catalog' && (error.code === '42P07' || error.code === '42710'))\n || (error.routine === 'TypeCreate' && error.code === '42710')\n ))\n )\n if (!kind || !single || !catalogConflict)\n throw error\n // 胜者已提交后原语句会命中 IF NOT EXISTS;第二次失败照常交由公共操作包装器返回。\n return pool!.query(sql, params)\n }\n }\n\n // ─── DDL 操作 ───\n\n const rawDdl: DdlOperations = {\n async createTable(name, columns, ifNotExists = true) {\n const quotedTable = quoteIdentifier(name)\n const sql = buildDefaultCreateTableSql(pgBuildColumnSql, quotedTable, columns, ifNotExists)\n await executeStatement(sql)\n return ok(undefined)\n },\n async dropTable(name, ifExists) {\n const ifExistsClause = ifExists ? 'IF EXISTS ' : ''\n await pool!.query(`DROP TABLE ${ifExistsClause}${quoteIdentifier(name)}`)\n return ok(undefined)\n },\n async addColumn(table, column, def) {\n const colSql = pgBuildColumnSql(column, def)\n await pool!.query(`ALTER TABLE ${quoteIdentifier(table)} ADD COLUMN ${colSql}`)\n return ok(undefined)\n },\n async dropColumn(table, column) {\n await pool!.query(`ALTER TABLE ${quoteIdentifier(table)} DROP COLUMN ${quoteIdentifier(column)}`)\n return ok(undefined)\n },\n async renameTable(oldName, newName) {\n await pool!.query(buildDefaultRenameTableSql(quoteIdentifier(oldName), quoteIdentifier(newName)))\n return ok(undefined)\n },\n async createIndex(table, index, def) {\n const sql = buildDefaultCreateIndexSql(quoteIdentifier, quoteIdentifier(table), quoteIdentifier(index), def)\n await executeStatement(sql)\n return ok(undefined)\n },\n async dropIndex(index, ifExists = true) {\n const sql = buildDefaultDropIndexSql(quoteIdentifier, index, ifExists)\n await pool!.query(sql)\n return ok(undefined)\n },\n async raw(sql) {\n await executeStatement(sql)\n return ok(undefined)\n },\n }\n\n // ─── DML 操作 ───\n\n const rawDml: DmlOperations = {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n const rows = await pgQueryRows((t, v) => pool!.query(t, v), sql, params)\n return ok(rows as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const rows = await pgQueryRows((t, v) => pool!.query(t, v), sql, params)\n return ok((rows[0] as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const result = await executeStatement(convertPlaceholders(sql), params)\n return ok({ changes: result.rowCount ?? 0 })\n },\n async batch(statements) {\n let client: PgClient | null = null\n try {\n client = await pool!.connect()\n await client.query('BEGIN')\n for (const { sql: s, params } of statements) {\n await client.query(convertPlaceholders(s), params)\n }\n await client.query('COMMIT')\n return ok(undefined)\n }\n catch (error) {\n if (client) {\n await client.query('ROLLBACK').catch(() => { })\n }\n return err(HaiReldbError.QUERY_FAILED, reldbM('reldb_batchFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n finally {\n if (client) {\n client.release()\n }\n }\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const result = await queryPageAsync<T>(\n async (sql, params) => {\n const r = await pool!.query(convertPlaceholders(sql), params)\n return r.rows\n },\n options,\n )\n return ok(result)\n },\n }\n\n // ─── 事务 ───\n\n /** 创建事务连接上的 DML 操作 */\n function createPgTxDmlOps(client: PgClient): DmlOperations {\n const queryFn = (text: string, values?: unknown[]) => client.query(text, values)\n return {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n const rows = await pgQueryRows(queryFn, sql, params)\n return ok(rows as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const rows = await pgQueryRows(queryFn, sql, params)\n return ok((rows[0] as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const result = await queryFn(convertPlaceholders(sql), params)\n return ok({ changes: result.rowCount ?? 0 })\n },\n async batch(statements) {\n for (const { sql: s, params } of statements) {\n await queryFn(convertPlaceholders(s), params)\n }\n return ok(undefined)\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const result = await queryPageAsync<T>(\n async (sql, params) => {\n const r = await queryFn(convertPlaceholders(sql), params)\n return r.rows\n },\n options,\n )\n return ok(result)\n },\n }\n }\n\n async function beginTx(): Promise<HaiResult<DmlWithTxOperations>> {\n let client: PgClient | null = null\n\n const releaseOwnership = retainTransaction()\n try {\n client = await pool!.connect()\n await client.query('BEGIN')\n }\n catch (error) {\n try {\n client?.release()\n }\n finally { releaseOwnership() }\n return err(HaiReldbError.TRANSACTION_FAILED, pgTxErrorMessage(String(error)), error)\n }\n\n const txDmlOps = createPgTxDmlOps(client)\n const guardedTxDmlOps = createBaseDmlOps({\n ...ctx,\n isConnected: () => client !== null,\n }, txDmlOps)\n return ok(createTxHandle(guardedTxDmlOps, {\n commit: async () => { await client!.query('COMMIT') },\n rollback: async () => { await client!.query('ROLLBACK') },\n release: () => {\n try {\n client!.release()\n }\n finally {\n client = null\n releaseOwnership()\n }\n },\n errorMessage: pgTxErrorMessage,\n }))\n }\n\n // ─── 组装 Provider ───\n\n const dmlOps = createBaseDmlOps(ctx, rawDml)\n\n return {\n async connect(config: ReldbConfig): Promise<HaiResult<void>> {\n if (config.type !== 'postgresql') {\n return err(HaiReldbError.UNSUPPORTED_TYPE, reldbM('reldb_postgresOnlyPostgresql'))\n }\n const previousCleanup = await closeResource()\n if (!previousCleanup.success)\n return previousCleanup\n try {\n // Node ESM 按需加载驱动,避免构建器生成无法执行的动态 require。\n const { Pool } = createRequire(import.meta.url)('pg')\n\n pool = new Pool({\n connectionString: config.url,\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n ssl: config.ssl,\n min: config.pool?.min,\n max: config.pool?.max ?? 10,\n idleTimeoutMillis: config.pool?.idleTimeout,\n connectionTimeoutMillis: config.pool?.acquireTimeout,\n }) as PgPool\n\n // pg-pool 会移除损坏的空闲连接;必须监听 error,避免 EventEmitter 使进程退出。\n // 不记录 error/message/client,驱动错误可能携带 SQL、连接串或服务端敏感细节。\n pool.on('error', (error) => {\n const code = error && typeof error === 'object' && 'code' in error\n && typeof error.code === 'string' && /^[A-Z0-9_]{1,32}$/.test(error.code)\n ? error.code\n : undefined\n logger.warn('PostgreSQL idle connection error; pool will replace connection', {\n code,\n name: error instanceof Error\n ? 'Error'\n : 'UnknownError',\n })\n })\n\n // 新容器网络的 DNS 可能短暂未就绪;仅启动探测的 EAI_AGAIN 有界重试,不重放业务 SQL。\n for (let attempt = 0; ; attempt++) {\n try {\n await pool.query('SELECT 1')\n break\n }\n catch (error) {\n if (attempt >= 2 || typeof error !== 'object' || error === null || !('code' in error) || error.code !== 'EAI_AGAIN')\n throw error\n await delay(250 * (attempt + 1))\n }\n }\n\n ready = true\n currentConfig = config\n logger.info('Connected to PostgreSQL', { host: config.host, port: config.port, database: config.database })\n return ok(undefined)\n }\n catch (error) {\n const cleanup = await closeResource()\n const result = err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_postgresConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n return cleanup.success || result.success\n ? result\n : err({\n ...result.error,\n ext: { cleanupPending: true, cleanupError: cleanup.error },\n })\n }\n },\n\n close: closeResource,\n\n isConnected: () => ctx.isConnected(),\n ddl: createBaseDdlOps(ctx, rawDdl),\n sql: dmlOps,\n crud: createBaseCrudManager(dmlOps),\n tx: createBaseTxManager(ctx, beginTx),\n }\n}\n","/**\n * @h-ai/reldb — SQLite 执行引擎\n *\n * 屏蔽两种执行方式的差异,供 SQLite Provider 统一调用:\n * - 同步引擎(默认):主线程直接持有 better-sqlite3 连接,行为与历史实现完全一致。\n * - worker 引擎:把唯一连接放进专用 worker 线程,主线程通过消息驱动,避免 better-sqlite3\n * 的同步查询阻塞主线程事件循环。WAL 只能改善数据库锁并发,无法避免同步调用占用调用线程,\n * 因此把阻塞移出主线程才是关键。\n *\n * 说明:worker 引擎只使用单个连接(单 worker),配合 Provider 主线程事务串行锁与 worker 的\n * FIFO 消息顺序保证事务正确性;不做只读连接池,避免事务/写路径复杂化。\n *\n * @module reldb-sqlite-engine\n */\n\nimport type BetterSqlite3 from 'better-sqlite3'\nimport type { ExecuteResult } from '../../reldb-types.js'\nimport { existsSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { setTimeout as delay } from 'node:timers/promises'\nimport { Worker } from 'node:worker_threads'\n\nconst require = createRequire(import.meta.url)\n\n/**\n * 一条待执行的语句(批量 / 事务内使用)。\n * @example 模块内部上下文\n * ```ts\n * const statement: SqliteStatement = { sql: 'INSERT INTO users (id) VALUES (?)', params: ['u1'] }\n * void statement\n * ```\n */\nexport interface SqliteStatement {\n sql: string\n params?: unknown[]\n}\n\n/**\n * SQLite 执行引擎接口。\n *\n * 所有方法均为异步:同步引擎内部仍是阻塞调用(签名异步保持一致),worker 引擎为真正的跨线程异步。\n * @example 模块内部上下文\n * ```ts\n * async function ready(engine: SqliteEngine) {\n * try {\n * await engine.initialize()\n * return await engine.get('SELECT 1 AS value')\n * } finally { await engine.close() }\n * }\n * ```\n */\nexport interface SqliteEngine {\n /**\n * 完成 WAL/worker 握手;必须先保存引擎引用,失败后仍通过 close 释放资源。\n * @example\n * try { await engine.initialize() } finally { await engine.close() }\n */\n initialize: () => Promise<void>\n /** 查询多行。 */\n all: (sql: string, params?: unknown[]) => Promise<unknown[]>\n /** 查询单行(无结果返回 null)。 */\n get: (sql: string, params?: unknown[]) => Promise<unknown>\n /** 执行修改语句,返回影响行数与自增主键。 */\n run: (sql: string, params?: unknown[]) => Promise<ExecuteResult>\n /** 执行无参数 SQL(DDL / BEGIN / COMMIT / ROLLBACK)。 */\n exec: (sql: string) => Promise<void>\n /** 在单个原子事务中批量执行语句。 */\n batch: (statements: SqliteStatement[]) => Promise<void>\n /** 关闭连接(worker 引擎同时终止线程)。 */\n close: () => Promise<void>\n /** 连接是否可用。 */\n isOpen: () => boolean\n}\n\n/**\n * 引擎打开选项。\n * @example 模块内部上下文\n * ```ts\n * const options: SqliteEngineOptions = { database: ':memory:', readonly: false, walMode: false }\n * void options\n * ```\n */\nexport interface SqliteEngineOptions {\n /** 数据库文件路径或 ':memory:'。 */\n database: string\n /** 是否只读。 */\n readonly: boolean\n /** 是否启用 WAL。 */\n walMode: boolean\n}\n\n/**\n * 创建同步引擎:主线程直接持有连接(默认执行方式)。\n *\n * @param options - 打开选项。\n * @returns 已拥有连接的引擎;调用 initialize 后才可执行 SQL。\n * @example 模块内部上下文\n * ```ts\n * const engine = createSyncSqliteEngine({ database: ':memory:', readonly: false, walMode: false })\n * try {\n * await engine.initialize()\n * void await engine.get('SELECT 1 AS value')\n * } finally { await engine.close() }\n * ```\n */\nexport function createSyncSqliteEngine(options: SqliteEngineOptions): SqliteEngine {\n const Database = require('better-sqlite3')\n const db = new Database(options.database, { readonly: options.readonly }) as BetterSqlite3.Database\n let initialized = false\n\n return {\n async initialize() {\n if (!initialized && options.walMode !== false) {\n // 首次切换 WAL 的锁升级可能跳过原生 busy handler;只重试初始化,不重放业务 SQL。\n // 与 worker 保持相同的单次 5 秒预算,原生等待和退避共同消耗该预算。\n const deadline = performance.now() + 5000\n let contention: unknown\n try {\n for (;;) {\n if (contention && performance.now() >= deadline)\n throw contention\n db.pragma(`busy_timeout = ${Math.max(1, Math.ceil(deadline - performance.now()))}`)\n try {\n db.pragma('journal_mode = WAL')\n break\n }\n catch (error) {\n if (!error || typeof error !== 'object' || !('code' in error)\n || typeof error.code !== 'string' || !/^SQLITE_BUSY(?:_|$)/.test(error.code)\n || performance.now() >= deadline) {\n throw error\n }\n contention = error\n await delay(Math.min(25, Math.max(1, deadline - performance.now())))\n }\n }\n }\n finally {\n db.pragma('busy_timeout = 5000')\n }\n }\n initialized = true\n },\n async all(sql, params) {\n const stmt = db.prepare(sql)\n return params\n ? stmt.all(...params)\n : stmt.all()\n },\n async get(sql, params) {\n const stmt = db.prepare(sql)\n return (params\n ? stmt.get(...params)\n : stmt.get()) ?? null\n },\n async run(sql, params) {\n const stmt = db.prepare(sql)\n const result = params\n ? stmt.run(...params)\n : stmt.run()\n return { changes: result.changes, lastInsertRowid: result.lastInsertRowid }\n },\n async exec(sql) {\n db.exec(sql)\n },\n async batch(statements) {\n const tx = db.transaction((items: SqliteStatement[]) => {\n for (const item of items) {\n const stmt = db.prepare(item.sql)\n if (item.params)\n stmt.run(...item.params)\n else stmt.run()\n }\n })\n tx(statements)\n },\n async close() {\n initialized = false\n if (db.open) {\n db.close()\n }\n },\n isOpen: () => initialized && db.open,\n }\n}\n\n/** 定位 worker 脚本;兼容源码(src 布局)与打包(dist 布局)两种运行位置。 */\nfunction resolveWorkerUrl(): URL {\n const candidates = [\n // 源码 / 测试:引擎与 worker 同目录。\n new URL('./reldb-sqlite-worker.mjs', import.meta.url),\n // 打包:引擎被并入 dist/index.js,worker 复制到 dist/providers/sqlite/。\n new URL('./providers/sqlite/reldb-sqlite-worker.mjs', import.meta.url),\n ]\n for (const candidate of candidates) {\n if (existsSync(candidate))\n return candidate\n }\n // 回退到源码布局,让 Worker 抛出可诊断的加载错误。\n return candidates[0]\n}\n\n/**\n * worker 响应消息。\n * @example 模块内部上下文\n * ```ts\n * function failed(response: WorkerResponse) {\n * return response.ok ? undefined : response.error?.message\n * }\n * ```\n */\ninterface WorkerResponse {\n id: number\n ok: boolean\n result?: unknown\n error?: { message: string }\n}\n\n/**\n * 创建 worker 引擎:把连接放进专用 worker 线程,卸载主线程阻塞。\n *\n * @param options - 打开选项。\n * @param connectTimeoutMs - 等待 worker 打开数据库的超时时间。\n * @returns 已拥有 worker 的引擎;initialize 在握手失败或超时时 reject。\n * @example 模块内部上下文\n * ```ts\n * const engine = createWorkerSqliteEngine({ database: ':memory:', readonly: false, walMode: false }, 10_000)\n * try {\n * await engine.initialize()\n * void await engine.get('SELECT 1 AS value')\n * } finally { await engine.close() }\n * ```\n */\nexport function createWorkerSqliteEngine(\n options: SqliteEngineOptions,\n connectTimeoutMs: number,\n): SqliteEngine {\n const worker = new Worker(resolveWorkerUrl(), {\n workerData: { database: options.database, readonly: options.readonly, walMode: options.walMode },\n })\n\n let seq = 0\n let open = false\n let exited = false\n let closing: Promise<void> | null = null\n const pending = new Map<number, { resolve: (value: unknown) => void, reject: (error: Error) => void }>()\n\n /** 连接失效时统一拒绝所有在途请求,避免 Promise 永久挂起。 */\n function rejectAll(error: Error): void {\n for (const entry of pending.values())\n entry.reject(error)\n pending.clear()\n }\n\n worker.on('message', (msg: WorkerResponse | { type: string }) => {\n // 初始化握手消息由 init Promise 处理,这里只处理带 id 的请求响应。\n if (!('id' in msg))\n return\n const entry = pending.get(msg.id)\n if (!entry)\n return\n pending.delete(msg.id)\n if (msg.ok)\n entry.resolve(msg.result)\n else entry.reject(new Error(msg.error?.message ?? 'sqlite worker error'))\n })\n worker.on('error', (error) => {\n open = false\n rejectAll(error instanceof Error\n ? error\n : new Error(String(error)))\n })\n worker.on('exit', (code) => {\n exited = true\n open = false\n if (pending.size > 0)\n rejectAll(new Error(`sqlite worker exited unexpectedly with code ${code}`))\n })\n\n /** 等待握手时同步处理 error/exit,并在所有完成路径释放定时器和临时监听器。 */\n function initialize(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n finish(new Error(`sqlite worker init timed out after ${connectTimeoutMs}ms`))\n }, connectTimeoutMs)\n\n function finish(error?: Error): void {\n clearTimeout(timer)\n worker.off('message', onHandshake)\n worker.off('error', onError)\n worker.off('exit', onExit)\n if (error) {\n reject(error)\n }\n else {\n open = true\n resolve()\n }\n }\n function onError(error: Error): void {\n finish(error)\n }\n function onExit(code: number): void {\n finish(new Error(`sqlite worker exited before ready with code ${code}`))\n }\n function onHandshake(msg: { type?: string }): void {\n if (msg?.type === 'ready') {\n finish()\n }\n else if (msg?.type === 'init-error') {\n finish(new Error((msg as { error?: { message: string } }).error?.message ?? 'sqlite worker init failed'))\n }\n }\n\n worker.on('message', onHandshake)\n worker.once('error', onError)\n worker.once('exit', onExit)\n if (exited)\n finish(new Error('sqlite worker exited before initialization'))\n })\n }\n\n /** 发送一条请求并等待响应。 */\n function post(op: string, payload: { sql?: string, params?: unknown[], statements?: SqliteStatement[] }): Promise<unknown> {\n if (!open)\n return Promise.reject(new Error('sqlite worker is not open'))\n const id = ++seq\n return new Promise<unknown>((resolve, reject) => {\n pending.set(id, { resolve, reject })\n worker.postMessage({ id, op, ...payload })\n })\n }\n\n return {\n initialize,\n // 边界反序列化:worker 通过结构化克隆回传,行/结果类型在此断言。\n async all(sql, params) {\n return (await post('all', { sql, params })) as unknown[]\n },\n async get(sql, params) {\n return await post('get', { sql, params })\n },\n async run(sql, params) {\n return (await post('run', { sql, params })) as ExecuteResult\n },\n async exec(sql) {\n await post('exec', { sql })\n },\n async batch(statements) {\n await post('batch', { statements })\n },\n close() {\n if (closing)\n return closing\n const wasOpen = open\n const gracefulClose = wasOpen\n ? post('close', {})\n : Promise.resolve()\n open = false\n closing = (async () => {\n // 握手失败时也必须终止线程;终止失败保留所有权,下一次 close 再试。\n await gracefulClose.catch(() => undefined)\n if (!exited)\n await worker.terminate()\n })().finally(() => { closing = null })\n return closing\n },\n isOpen: () => open,\n }\n}\n","/**\n * @h-ai/reldb — SQLite Provider\n *\n * 基于 better-sqlite3 的 SQLite 数据库实现。\n * 按 Context + wrapOp → Factory 模式实现。\n * @module reldb-provider-sqlite\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type { ReldbConfig } from '../reldb-config.js'\nimport type {\n DdlOperations,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n PaginationQueryOptions,\n ReldbColumnDef,\n} from '../reldb-types.js'\nimport type { ReldbOpsContext } from './reldb-provider-base.js'\nimport type { ReldbProvider } from './reldb-provider-types.js'\nimport type { SqliteEngine } from './sqlite/reldb-sqlite-engine.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { reldbM } from '../reldb-i18n.js'\nimport { quoteIdentifier } from '../reldb-security.js'\nimport { HaiReldbError } from '../reldb-types.js'\nimport {\n buildColumnSqlBase,\n buildDefaultCreateIndexSql,\n buildDefaultCreateTableSql,\n buildDefaultDropIndexSql,\n buildDefaultRenameTableSql,\n} from './reldb-ddl-builder.js'\nimport { createBaseCrudManager, createBaseDdlOps, createBaseDmlOps, createBaseTxManager, queryPageAsync } from './reldb-provider-base.js'\nimport { createTxHandle } from './reldb-tx-assembler.js'\nimport { createSyncSqliteEngine, createWorkerSqliteEngine } from './sqlite/reldb-sqlite-engine.js'\n\nconst logger = core.logger.child({ module: 'reldb', scope: 'sqlite' })\n\n// ─── SQLite Provider 实现 ───\n\n/**\n * 创建 SQLite Provider 实例\n *\n * @returns SQLite Provider\n * @example 模块内部上下文\n * ```ts\n * const provider = createSqliteProvider()\n * const closed = await provider.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * ```\n */\nexport function createSqliteProvider(): ReldbProvider {\n /** SQLite 执行引擎(同步或 worker) */\n let engine: SqliteEngine | null = null\n /** 只有健康检查完成的连接才可供业务使用;清理失败仍保留底层资源。 */\n let ready = false\n let closing: Promise<HaiResult<void>> | null = null\n /** 串行化 SQLite 事务,关闭前等待所有借出事务归还。 */\n let txChain: Promise<void> = Promise.resolve()\n let currentConfig: ReldbConfig | null = null\n\n /** 保留所有权直到释放成功;合并并发关闭且立即阻止新操作。 */\n function closeResource(): Promise<HaiResult<void>> {\n ready = false\n currentConfig = null\n if (closing)\n return closing\n const owned = engine\n if (!owned)\n return Promise.resolve(ok(undefined))\n closing = (async (): Promise<HaiResult<void>> => {\n try {\n // 在途事务拥有独立上下文;先等待释放,再关闭唯一引擎。\n await txChain.catch(() => undefined)\n await owned.close()\n engine = null\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_sqliteConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n })().finally(() => { closing = null })\n return closing\n }\n\n /** 事务锁获取超时(毫秒),防止永久阻塞 */\n const TX_LOCK_TIMEOUT_MS = 30_000\n\n /**\n * 获取事务锁,带超时保护\n *\n * 当锁等待超过 TX_LOCK_TIMEOUT_MS 时抛出超时错误,防止无限阻塞。\n */\n async function acquireTxLock(): Promise<() => void> {\n let release!: () => void\n const current = new Promise<void>((resolve) => {\n release = resolve\n })\n const prev = txChain\n txChain = txChain.then(() => current)\n\n // 带超时的等待\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n // 超时后释放锁链,避免后续事务也阻塞\n release()\n reject(new Error(`SQLite transaction lock acquisition timed out after ${TX_LOCK_TIMEOUT_MS}ms`))\n }, TX_LOCK_TIMEOUT_MS)\n })\n\n try {\n await Promise.race([prev, timeoutPromise])\n }\n finally {\n if (timer !== undefined) {\n clearTimeout(timer)\n }\n }\n\n return release\n }\n\n // ─── 操作上下文 ───\n\n const ctx: ReldbOpsContext = {\n isConnected: () => ready && engine !== null && engine.isOpen(),\n logger,\n operationLog: () => currentConfig?.operationLog,\n }\n\n // ─── SQLite 方言辅助 ───\n\n /** SQLite 列类型映射 */\n function mapSqliteType(def: ReldbColumnDef): string {\n switch (def.type) {\n case 'TEXT':\n case 'JSON':\n return 'TEXT'\n case 'INTEGER':\n case 'BIGINT':\n case 'BOOLEAN':\n return 'INTEGER'\n case 'REAL':\n return 'REAL'\n case 'BLOB':\n return 'BLOB'\n case 'TIMESTAMP':\n return 'INTEGER' // Unix timestamp\n default:\n return 'TEXT'\n }\n }\n\n /** SQLite buildColumnSql */\n function sqliteBuildColumnSql(name: string, def: ReldbColumnDef): string {\n return buildColumnSqlBase(name, def, {\n quoteId: quoteIdentifier,\n mapType: mapSqliteType,\n inlinePrimaryKey: true,\n extraConstraints: (d) => {\n const extras: string[] = []\n if (d.primaryKey && d.autoIncrement)\n extras.push('AUTOINCREMENT')\n return extras\n },\n })\n }\n\n /** 事务错误消息生成 */\n function sqliteTxErrorMessage(detail: string): string {\n return reldbM('reldb_sqliteTxFailed', {\n params: { error: detail },\n })\n }\n\n // ─── DDL 操作 ───\n\n const rawDdl: DdlOperations = {\n async createTable(name, columns, ifNotExists = true) {\n const quotedTable = quoteIdentifier(name)\n const sql = buildDefaultCreateTableSql(sqliteBuildColumnSql, quotedTable, columns, ifNotExists)\n await engine!.exec(sql)\n return ok(undefined)\n },\n async dropTable(name, ifExists) {\n const ifExistsClause = ifExists ? 'IF EXISTS ' : ''\n await engine!.exec(`DROP TABLE ${ifExistsClause}${quoteIdentifier(name)}`)\n return ok(undefined)\n },\n async addColumn(table, column, def) {\n const colSql = sqliteBuildColumnSql(column, def)\n await engine!.exec(`ALTER TABLE ${quoteIdentifier(table)} ADD COLUMN ${colSql}`)\n return ok(undefined)\n },\n async dropColumn(table, column) {\n await engine!.exec(`ALTER TABLE ${quoteIdentifier(table)} DROP COLUMN ${quoteIdentifier(column)}`)\n return ok(undefined)\n },\n async renameTable(oldName, newName) {\n await engine!.exec(buildDefaultRenameTableSql(quoteIdentifier(oldName), quoteIdentifier(newName)))\n return ok(undefined)\n },\n async createIndex(table, index, def) {\n const sql = buildDefaultCreateIndexSql(quoteIdentifier, quoteIdentifier(table), quoteIdentifier(index), def)\n await engine!.exec(sql)\n return ok(undefined)\n },\n async dropIndex(index, ifExists = true) {\n const sql = buildDefaultDropIndexSql(quoteIdentifier, index, ifExists)\n await engine!.exec(sql)\n return ok(undefined)\n },\n async raw(sql) {\n await engine!.exec(sql)\n return ok(undefined)\n },\n }\n\n // ─── DML 操作 ───\n\n const rawDml: DmlOperations = {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n const rows = await engine!.all(sql, params)\n return ok(rows as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const row = await engine!.get(sql, params)\n return ok((row as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const result = await engine!.run(sql, params)\n return ok(result)\n },\n async batch(statements) {\n // 与显式事务串行,避免并发 BEGIN 导致 \"cannot start a transaction within a transaction\"。\n const releaseTxLock = await acquireTxLock()\n try {\n await engine!.batch(statements)\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.QUERY_FAILED, reldbM('reldb_sqliteBatchFailed', {\n params: {\n error: String(error),\n },\n }), error)\n }\n finally {\n releaseTxLock()\n }\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const result = await queryPageAsync<T>(\n (sqlStr, params) => engine!.all(sqlStr, params),\n options,\n )\n return ok(result)\n },\n }\n\n // ─── 事务 ───\n\n /** 创建事务连接上的 DML 操作(无守卫,由 createTxHandle 统一守卫)。事务内批量不再包裹嵌套事务。 */\n function createSqliteTxDmlOps(txEngine: SqliteEngine): DmlOperations {\n return {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n return ok((await txEngine.all(sql, params)) as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n return ok(((await txEngine.get(sql, params)) as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n return ok(await txEngine.run(sql, params))\n },\n async batch(statements) {\n // 已处于显式事务中,逐条执行即可,不再开启嵌套事务。\n for (const { sql: s, params } of statements) {\n await txEngine.run(s, params)\n }\n return ok(undefined)\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const result = await queryPageAsync<T>(\n (sqlStr, params) => txEngine.all(sqlStr, params),\n options,\n )\n return ok(result)\n },\n }\n }\n\n async function beginTx(): Promise<HaiResult<DmlWithTxOperations>> {\n const txEngine = engine!\n let released = false\n const releaseTxLock = await acquireTxLock()\n\n const finishTransaction = () => {\n if (!released) {\n released = true\n releaseTxLock()\n }\n }\n\n try {\n await txEngine.exec('BEGIN TRANSACTION')\n }\n catch (error) {\n finishTransaction()\n return err(HaiReldbError.TRANSACTION_FAILED, sqliteTxErrorMessage(String(error)), error)\n }\n\n const txDmlOps = createSqliteTxDmlOps(txEngine)\n const guardedTxDmlOps = createBaseDmlOps({\n ...ctx,\n isConnected: () => txEngine.isOpen(),\n }, txDmlOps)\n return ok(createTxHandle(guardedTxDmlOps, {\n commit: async () => { await txEngine.exec('COMMIT') },\n rollback: async () => { await txEngine.exec('ROLLBACK') },\n release: () => finishTransaction(),\n errorMessage: sqliteTxErrorMessage,\n }))\n }\n\n // ─── 组装 Provider ───\n\n const dmlOps = createBaseDmlOps(ctx, rawDml)\n\n return {\n async connect(config: ReldbConfig): Promise<HaiResult<void>> {\n if (config.type !== 'sqlite') {\n return err(HaiReldbError.UNSUPPORTED_TYPE, reldbM('reldb_sqliteOnlySqlite'))\n }\n\n if (!config.database) {\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_sqliteNeedPath'))\n }\n\n const previousCleanup = await closeResource()\n if (!previousCleanup.success)\n return previousCleanup\n try {\n const sqliteOptions = {\n walMode: true,\n readonly: false,\n executor: 'sync' as 'sync' | 'worker',\n workerConnectTimeoutMs: 10_000,\n ...(config.sqlite ?? {}),\n }\n const engineOptions = {\n database: config.database,\n readonly: sqliteOptions.readonly ?? false,\n walMode: sqliteOptions.walMode !== false,\n }\n\n // worker 执行方式把同步查询移出主线程事件循环;sync 为默认保持历史行为。\n engine = sqliteOptions.executor === 'worker'\n ? createWorkerSqliteEngine(engineOptions, sqliteOptions.workerConnectTimeoutMs ?? 10_000)\n : createSyncSqliteEngine(engineOptions)\n await engine.initialize()\n\n ready = true\n currentConfig = config\n logger.info('Connected to SQLite', { database: config.database, executor: sqliteOptions.executor })\n return ok(undefined)\n }\n catch (error) {\n const cleanup = await closeResource()\n const result = err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_sqliteConnectionFailed', {\n params: {\n error: String(error),\n },\n }), error)\n return cleanup.success || result.success\n ? result\n : err({\n ...result.error,\n ext: { cleanupPending: true, cleanupError: cleanup.error },\n })\n }\n },\n\n close: closeResource,\n\n isConnected: () => ctx.isConnected(),\n ddl: createBaseDdlOps(ctx, rawDdl),\n sql: dmlOps,\n crud: createBaseCrudManager(dmlOps),\n tx: createBaseTxManager(ctx, beginTx),\n }\n}\n","/** 读取各数据库实际表结构。 */\nimport type { HaiResult } from '@h-ai/core'\nimport type { DmlOperations, ReldbFunctions } from './reldb-types.js'\nimport { core, err, HaiCommonError, ok } from '@h-ai/core'\n\n/**\n * 查询真实列名;不创建表,不把查询错误当成新安装。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n * const columns = await reldb.schemaColumns('hai_iam_users')\n * ```\n */\nexport async function schemaColumns(db: ReldbFunctions, table: string, sql: DmlOperations = db.sql): Promise<HaiResult<string[]>> {\n if (!/^[a-z][a-z0-9_]{0,62}$/.test(table))\n return err(HaiCommonError.VALIDATION_ERROR, core.i18n.coreM('core_errorValidation'))\n const type = db.config?.type\n const found = type === 'sqlite'\n ? await sql.query<{ name: string }>(`PRAGMA table_info(${table})`)\n : await sql.query<{ name: string }>(`SELECT column_name AS name FROM information_schema.columns WHERE table_schema=${type === 'mysql'\n ? 'DATABASE()'\n : 'current_schema()'} AND table_name=?`, [table])\n return found.success\n ? ok(found.data.map(row => row.name))\n : found\n}\n","/**\n * @h-ai/reldb — 数据库服务主入口\n *\n * 本文件提供统一的 `reldb` 对象,聚合所有数据库操作功能。\n * @module reldb-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ReldbProvider } from './providers/reldb-provider-types.js'\nimport type { ReldbConfig, ReldbConfigInput } from './reldb-config.js'\nimport type {\n CrudManager,\n DdlOperations,\n DmlOperations,\n ReldbFunctions,\n ReldbJsonOps,\n TxManager,\n} from './reldb-types.js'\n\nimport process from 'node:process'\nimport { core, err, ok } from '@h-ai/core'\n\nimport { createBaseCrudManager } from './providers/reldb-provider-base.js'\nimport { createMysqlProvider } from './providers/reldb-provider-mysql.js'\nimport { createPostgresProvider } from './providers/reldb-provider-postgres.js'\nimport { createSqliteProvider } from './providers/reldb-provider-sqlite.js'\n\nimport { ReldbConfigSchema } from './reldb-config.js'\nimport { reldbM } from './reldb-i18n.js'\nimport { createJsonOps } from './reldb-json.js'\nimport { pagination } from './reldb-pagination.js'\nimport { schemaColumns } from './reldb-schema.js'\nimport { HaiReldbError } from './reldb-types.js'\n\nconst logger = core.logger.child({ module: 'reldb', scope: 'main' })\n\n// ─── 内部状态 ───\n\n/** 当前活跃的数据库 Provider(未初始化时为 null) */\nlet currentProvider: ReldbProvider | null = null\n\n/** 当前数据库配置(未初始化时为 null) */\nlet currentConfig: ReldbConfig | null = null\n\n/** 缓存的 JSON 操作实例(dbType 在 init/close 间不变,无需每次 getter 重建) */\nlet currentJsonOps: ReldbJsonOps | null = null\n\n/** 初始化进行中标记,防止并发调用导致 Provider 泄漏 */\nlet initInProgress = false\n\n/** 尚未释放的候选/旧 Provider;绝不用于业务操作,清理成功后才能替换。 */\nlet pendingProvider: ReldbProvider | null = null\n/** 初始化完成屏障,供 close 等待候选资源归属确定。 */\nlet initCompletion: Promise<void> | null = null\n/** 合并并发关闭,避免同一连接重复释放。 */\nlet closingPromise: Promise<HaiResult<void>> | null = null\n\n/** 停止发布资源并重试清理;失败时保留唯一所有权供下一次 close/init 重试。 */\nasync function closeOwnedProvider(): Promise<HaiResult<void>> {\n if (currentProvider) {\n pendingProvider = currentProvider\n currentProvider = null\n }\n currentConfig = null\n currentJsonOps = null\n if (!pendingProvider)\n return ok(undefined)\n try {\n const result = await pendingProvider.close()\n if (!result.success) {\n return err({\n ...result.error,\n ext: { ...result.error.ext, cleanupPending: true },\n })\n }\n pendingProvider = null\n return ok(undefined)\n }\n catch (error) {\n logger.error('Provider cleanup failed; retaining resource for retry', { error })\n return err({\n ...HaiReldbError.CONNECTION_FAILED,\n message: reldbM('reldb_closeFailed', {\n params: {\n error: error instanceof Error\n ? error.message\n : String(error),\n },\n }),\n cause: error,\n ext: { cleanupPending: true },\n })\n }\n}\n\n/** 初始化失败后释放候选;保留原始错误,并明确指出清理尚未完成。 */\nasync function failInitialization(result: HaiResult<void>): Promise<HaiResult<void>> {\n const cleanup = await closeOwnedProvider()\n if (result.success)\n return result\n if (cleanup.success) {\n const ext = { ...result.error.ext }\n delete ext.cleanupPending\n delete ext.cleanupError\n return err({\n ...result.error,\n ext: Object.keys(ext).length > 0\n ? ext\n : undefined,\n })\n }\n return err({\n ...result.error,\n ext: { ...result.error.ext, cleanupPending: true, cleanupError: cleanup.error },\n })\n}\n\n// ─── Provider 工厂 ───\n\n/**\n * 根据配置创建对应的数据库 Provider\n *\n * @param config - 数据库配置(已校验、默认值补齐)\n * @returns Provider 实例\n */\nfunction createProvider(config: ReldbConfig): ReldbProvider {\n switch (config.type) {\n case 'sqlite':\n return createSqliteProvider()\n case 'postgresql':\n return createPostgresProvider()\n case 'mysql':\n return createMysqlProvider()\n }\n}\n\n// ─── 未初始化时的占位操作 ───\n\n/** 未初始化工具集 */\nconst notInitialized = core.module.createNotInitializedKit(\n HaiReldbError.NOT_INITIALIZED,\n () => reldbM('reldb_notInitialized'),\n)\n\n/** 未初始化时的 DDL 操作占位对象 */\nconst notInitializedDdl = notInitialized.proxy<DdlOperations>()\n\n/** 未初始化时的 SQL 操作占位对象 */\nconst notInitializedSql = notInitialized.proxy<DmlOperations>()\n\n/** 未初始化时的 CRUD 管理器 */\nconst notInitializedCrud: CrudManager = createBaseCrudManager(notInitializedSql)\n\n/** 未初始化时的 JSON 操作构建器(默认使用 SQLite 格式) */\nconst notInitializedJson: ReldbJsonOps = createJsonOps('sqlite')\n\n/** 未初始化时的事务管理器占位对象 */\nconst notInitializedTx: TxManager = {\n begin: async () => notInitialized.result(),\n wrap: async () => notInitialized.result(),\n}\n\n// ─── 统一数据库服务对象 ───\n\n/**\n * 数据库服务对象\n *\n * 统一的数据库访问入口,提供以下功能:\n * - `reldb.init()` - 初始化数据库连接\n * - `reldb.close()` - 关闭连接\n * - `reldb.ddl` - DDL 操作(表结构管理)\n * - `reldb.sql` - SQL 操作(数据查询和修改)\n * - `reldb.tx` - 事务管理器(begin / wrap)\n * - `reldb.json` - JSON 路径操作 SQL 构建器(提取、设置、插入、删除、合并)\n * - `reldb.config` - 当前配置\n * - `reldb.isInitialized` - 初始化状态\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const initialized = await reldb.init({ type: 'sqlite', database: ':memory:' }) // 仅示例/测试。\n * if (!initialized.success) throw new Error(initialized.error.message)\n * try {\n * const created = await reldb.ddl.createTable('users', { id: { type: 'TEXT', primaryKey: true }, name: { type: 'TEXT' } })\n * if (!created.success) throw new Error(created.error.message)\n * const inserted = await reldb.sql.execute('INSERT INTO users (id, name) VALUES (?, ?)', ['u1', 'Alice'])\n * if (!inserted.success) throw new Error(inserted.error.message)\n * } finally {\n * const closed = await reldb.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * }\n * ```\n */\nexport const reldb: ReldbFunctions = {\n /**\n * 初始化数据库连接\n *\n * @param config - 数据库配置(允许部分字段,内部会补齐默认值)\n * @returns 初始化结果,失败时包含错误信息\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.init({ type: 'sqlite', database: ':memory:' })\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n async init(config: ReldbConfigInput): Promise<HaiResult<void>> {\n if (initInProgress || closingPromise) {\n logger.warn('RelDB module init is already in progress, skipping concurrent call')\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_configError', {\n params: { error: 'init already in progress' },\n }))\n }\n\n initInProgress = true\n let resolveInit!: () => void\n initCompletion = new Promise<void>((resolve) => {\n resolveInit = resolve\n })\n try {\n const cleanup = await closeOwnedProvider()\n if (!cleanup.success)\n return cleanup\n\n logger.info('Initializing RelDB module')\n\n const parseResult = ReldbConfigSchema.safeParse(config)\n if (!parseResult.success) {\n logger.error('RelDB config validation failed', { error: parseResult.error.message })\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_configError', {\n params: { error: parseResult.error.message },\n }), parseResult.error)\n }\n const parsed = parseResult.data\n if (core.module.requiresSharedState(process.env) && (parsed.type === 'sqlite'))\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_sharedBackendRequired'))\n\n try {\n const provider = createProvider(parsed)\n pendingProvider = provider\n const connectResult = await provider.connect(parsed)\n if (!connectResult.success) {\n logger.error('RelDB module initialization failed', {\n code: connectResult.error.code,\n message: connectResult.error.message,\n })\n return await failInitialization(connectResult)\n }\n pendingProvider = null\n currentProvider = provider\n currentConfig = parsed\n currentJsonOps = createJsonOps(parsed.type)\n logger.info('RelDB module initialized', { type: parsed.type })\n return ok(undefined)\n }\n catch (error) {\n logger.error('RelDB module initialization failed', { error })\n return await failInitialization(err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_initFailed', {\n params: {\n error: error instanceof Error\n ? error.message\n : String(error),\n },\n }), error))\n }\n }\n finally {\n initInProgress = false\n initCompletion = null\n resolveInit()\n }\n },\n\n /**\n * 获取 DDL 操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get ddl(): DdlOperations {\n return currentProvider?.ddl ?? notInitializedDdl\n },\n\n /**\n * 获取 SQL 操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get sql(): DmlOperations {\n return currentProvider?.sql ?? notInitializedSql\n },\n\n /**\n * 获取 CRUD 管理器\n *\n * 通过 `reldb.crud.table(config)` 获取单表 CRUD 仓库。\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get crud() {\n return currentProvider?.crud ?? notInitializedCrud\n },\n\n /** 事务管理器 */\n get tx(): TxManager {\n return currentProvider?.tx ?? notInitializedTx\n },\n\n /** 列检查复用当前连接或显式传入的事务。 */\n schemaColumns(table, sql) {\n if (!currentProvider)\n return Promise.resolve(notInitialized.result())\n return schemaColumns(reldb, table, sql)\n },\n\n /** 获取当前脱敏后的配置快照(未初始化时为 null) */\n get config(): ReldbConfig | null {\n if (!currentConfig)\n return null\n const snapshot = core.sanitize.sanitizeSensitiveFields(currentConfig)\n // 通用敏感字段匹配不包含普通 key;TLS 客户端私钥必须在配置快照中单独遮蔽。\n if ('ssl' in snapshot && snapshot.ssl && typeof snapshot.ssl === 'object' && 'key' in snapshot.ssl)\n snapshot.ssl.key = core.sanitize.defaultSensitiveReplacement\n return snapshot\n },\n\n /** 检查是否已初始化 */\n get isInitialized(): boolean {\n return currentProvider !== null && currentProvider.isConnected()\n },\n\n /**\n * 获取分页工具\n *\n * 提供 `reldb.pagination.normalize()` 和 `reldb.pagination.build()` 两个纯函数,\n * 用于自定义分页场景(无需数据库连接)。\n */\n get pagination() {\n return pagination\n },\n\n /**\n * 获取 JSON 路径操作 SQL 构建器\n *\n * 根据当前数据库类型返回对应的 JSON 操作实现。\n * 未初始化时返回 SQLite 格式的构建器作为默认值。\n *\n * 构建器方法均为纯函数,返回 `{ sql, params }` 可直接嵌入 SQL 查询。\n *\n * @example\n * ```ts\n * // 提取 JSON 字段值\n * const { sql, params } = reldb.json.extract('settings', '$.theme')\n * const rows = await reldb.sql.query(\n * `SELECT * FROM users WHERE ${sql} = ?`,\n * [...params, '\"dark\"'],\n * )\n *\n * // 设置 JSON 字段路径\n * const { sql, params } = reldb.json.set('settings', '$.theme', 'dark')\n * await reldb.sql.execute(\n * `UPDATE users SET settings = ${sql} WHERE id = ?`,\n * [...params, userId],\n * )\n * ```\n */\n get json(): ReldbJsonOps {\n return currentJsonOps ?? notInitializedJson\n },\n\n /**\n * 关闭数据库连接\n *\n * 等待初始化和在途事务,停止接收新操作;失败时保留资源供 close/init 重试。\n * @returns 所有资源释放成功才返回成功;并发关闭共享同一清理过程。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const result = await reldb.close()\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * ```\n */\n async close(): Promise<HaiResult<void>> {\n if (!closingPromise) {\n closingPromise = (async () => {\n if (initCompletion)\n await initCompletion\n return await closeOwnedProvider()\n })().finally(() => { closingPromise = null })\n }\n return await closingPromise\n },\n}\n"]}
|