@h-ai/reldb 0.1.0-alpha5

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/reldb-config.ts","../messages/en-US.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/reldb-provider-sqlite.ts","../src/reldb-main.ts"],"names":["core","sql","pagination","ok","err","logger","require"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/reldb — 数据库配置 Schema\n *\n * 本文件定义数据库模块的配置结构,使用 Zod 进行运行时校验。\n * @module reldb-config\n */\n\nimport { z } from 'zod'\n// ─── 数据库配置 Schema ───\n\n/**\n * 数据库类型枚举\n *\n * 支持的数据库类型:\n * - `sqlite` - SQLite 嵌入式数据库(使用 better-sqlite3)\n * - `postgresql` - PostgreSQL 数据库(使用 pg)\n * - `mysql` - MySQL 数据库(使用 mysql2)\n */\nexport const ReldbTypeSchema = z.enum(['sqlite', 'postgresql', 'mysql'])\n\n/** 数据库类型 */\nexport type DbType = z.infer<typeof ReldbTypeSchema>\n\n/**\n * 连接池配置 Schema\n *\n * 用于 PostgreSQL 和 MySQL 的连接池管理。\n * SQLite 为嵌入式数据库,不使用连接池。\n *\n * @example\n * ```ts\n * const poolConfig = {\n * min: 2,\n * max: 20,\n * idleTimeout: 30000,\n * acquireTimeout: 10000\n * }\n * ```\n */\nexport const PoolConfigSchema = z.object({\n /** 最小连接数(默认 1) */\n min: z.number().int().min(0).default(1),\n /** 最大连接数(默认 10) */\n max: z.number().int().min(1).default(10),\n /** 空闲连接超时时间,单位毫秒(默认 30000) */\n idleTimeout: z.number().int().min(0).default(30000),\n /** 获取连接超时时间,单位毫秒(默认 10000) */\n acquireTimeout: z.number().int().min(0).default(10000),\n})\n\n/** 连接池配置类型 */\nexport type PoolConfig = z.infer<typeof PoolConfigSchema>\n\n/**\n * SSL 配置 Schema\n *\n * 支持多种配置方式:\n * - `true/false` - 简单开关\n * - `'require'/'prefer'/'allow'/'disable'` - SSL 模式\n * - 自定义对象 - 详细 SSL 配置\n *\n * @example\n * ```ts\n * // 简单开关\n * ssl: true\n *\n * // SSL 模式\n * ssl: 'require'\n *\n * // 自定义配置\n * ssl: { rejectUnauthorized: false }\n * ```\n */\nexport const SslConfigSchema = z.union([\n z.boolean(),\n z.enum(['require', 'prefer', 'allow', 'disable']),\n z.record(z.string(), z.unknown()),\n])\n\n/** SSL 配置类型 */\nexport type SslConfig = z.infer<typeof SslConfigSchema>\n\n/**\n * SQLite 特定选项 Schema\n *\n * @example\n * ```ts\n * sqlite: {\n * walMode: true, // 启用 WAL 模式,提高并发性能\n * readonly: false // 只读模式\n * }\n * ```\n */\nexport const SqliteOptionsSchema = z.object({\n /** 是否启用 WAL 模式(默认 true),可提高并发读写性能 */\n walMode: z.boolean().default(true),\n /** 是否只读模式(默认 false) */\n readonly: z.boolean().default(false),\n})\n\n/**\n * MySQL 特定选项 Schema\n *\n * @example\n * ```ts\n * mysql: {\n * charset: 'utf8mb4',\n * timezone: '+08:00'\n * }\n * ```\n */\nexport const MysqlOptionsSchema = z.object({\n /** 字符集(默认 utf8mb4),推荐使用 utf8mb4 支持完整 Unicode */\n charset: z.string().default('utf8mb4'),\n /** 时区设置,如 '+08:00' */\n timezone: z.string().optional(),\n})\n\n// ─── 网络数据库共享字段 ───\n\nconst NetworkConfigSchema = z.object({\n /**\n * 连接字符串(可选)\n * 如果提供 url,将优先使用,忽略 host/port 等字段\n */\n url: z.string().optional(),\n\n /** 数据库主机地址(默认 localhost) */\n host: z.string().default('localhost'),\n\n /**\n * 数据库端口\n * - PostgreSQL 默认 5432\n * - MySQL 默认 3306\n */\n port: z.number().int().min(1).max(65535).optional(),\n\n /** 数据库名称 */\n database: z.string(),\n\n /** 数据库用户名 */\n user: z.string().optional(),\n\n /** 数据库密码 */\n password: z.string().optional(),\n\n /** SSL/TLS 连接配置 */\n ssl: SslConfigSchema.optional(),\n\n /** 连接池配置 */\n pool: PoolConfigSchema.optional(),\n})\n\n// ─── 各数据库类型配置 Schema ───\n\n/**\n * SQLite 配置 Schema\n *\n * @example\n * ```ts\n * // 文件数据库\n * { type: 'sqlite', database: './data.db' }\n *\n * // 内存数据库(用于测试)\n * { type: 'sqlite', database: ':memory:' }\n * ```\n */\nexport const SqliteConfigSchema = z.object({\n type: z.literal('sqlite'),\n /** 数据库文件路径(如 './data.db')或 ':memory:'(内存数据库) */\n database: z.string(),\n /** SQLite 特定选项 */\n sqlite: SqliteOptionsSchema.optional(),\n})\n\n/**\n * PostgreSQL 配置 Schema\n *\n * @example\n * ```ts\n * // 使用连接字符串\n * { type: 'postgresql', url: 'postgres://user:pass@localhost:5432/mydb' }\n *\n * // 使用分开的字段\n * {\n * type: 'postgresql',\n * host: 'localhost',\n * port: 5432,\n * database: 'mydb',\n * user: 'admin',\n * password: 'secret',\n * pool: { max: 20 }\n * }\n * ```\n */\nexport const PostgresqlConfigSchema = NetworkConfigSchema.extend({\n type: z.literal('postgresql'),\n})\n\n/**\n * MySQL 配置 Schema\n *\n * @example\n * ```ts\n * // 使用连接字符串\n * { type: 'mysql', url: 'mysql://user:pass@localhost:3306/mydb' }\n *\n * // 使用分开的字段\n * {\n * type: 'mysql',\n * host: 'localhost',\n * port: 3306,\n * database: 'mydb',\n * user: 'admin',\n * password: 'secret',\n * mysql: { charset: 'utf8mb4' }\n * }\n * ```\n */\nexport const MysqlConfigSchema = NetworkConfigSchema.extend({\n type: z.literal('mysql'),\n /** MySQL 特定选项 */\n mysql: MysqlOptionsSchema.optional(),\n})\n\n/**\n * 统一数据库配置 Schema(判别联合体)\n *\n * 根据 `type` 字段区分不同数据库类型的配置。\n */\nexport const ReldbConfigSchema = z.discriminatedUnion('type', [\n SqliteConfigSchema,\n PostgresqlConfigSchema,\n MysqlConfigSchema,\n])\n\n/** 数据库配置类型(判别联合体) */\nexport type ReldbConfig = z.infer<typeof ReldbConfigSchema>\n\n/** SQLite 配置类型 */\nexport type SqliteConfig = z.infer<typeof SqliteConfigSchema>\n\n/** PostgreSQL 配置类型 */\nexport type PostgresqlConfig = z.infer<typeof PostgresqlConfigSchema>\n\n/** MySQL 配置类型 */\nexport type MysqlConfig = z.infer<typeof MysqlConfigSchema>\n\n/**\n * 数据库配置输入类型(用于 init 等入口)\n *\n * 说明:Zod 的 default 会让输入端字段可省略,但输出端字段为必填。\n * 因此对外 API(如 reldb.init)更适合接收 ReldbConfigInput。\n */\nexport type ReldbConfigInput = z.input<typeof ReldbConfigSchema>\n","{\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: {error}\",\n \"reldb_closeFailed\": \"Failed to close database: {error}\",\n \"reldb_unsupportedType\": \"Unsupported database type: {type}\",\n \"reldb_ddlFailed\": \"DDL operation failed: {error}\",\n \"reldb_queryFailed\": \"Query failed: {error}\",\n \"reldb_executeFailed\": \"Execute failed: {error}\",\n \"reldb_batchFailed\": \"Batch execute failed: {error}\",\n \"reldb_postgresTxFailed\": \"Transaction failed: {error}\",\n \"reldb_postgresOnlyPostgresql\": \"PostgreSQL Provider only supports postgresql type\",\n \"reldb_postgresConnectionFailed\": \"Failed to connect to PostgreSQL: {error}\",\n\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: {error}\",\n \"reldb_sqliteTxFailed\": \"Transaction failed: {error}\",\n \"reldb_sqliteCreateTableFailed\": \"Failed to create table {tableName}: {error}\",\n \"reldb_sqliteDropTableFailed\": \"Failed to drop table {tableName}: {error}\",\n \"reldb_sqliteAddColumnFailed\": \"Failed to add column {columnName} to table {tableName}: {error}\",\n \"reldb_sqliteDropColumnFailed\": \"Failed to drop column {columnName} from table {tableName}: {error}\",\n \"reldb_sqliteRenameTableFailed\": \"Failed to rename table {oldName} to {newName}: {error}\",\n \"reldb_sqliteCreateIndexFailed\": \"Failed to create index {indexName}: {error}\",\n \"reldb_sqliteDropIndexFailed\": \"Failed to drop index {indexName}: {error}\",\n \"reldb_sqliteExecDdlFailed\": \"Failed to execute DDL: {error}\",\n \"reldb_sqliteQueryFailed\": \"Query failed: {error}\",\n \"reldb_sqliteExecuteFailed\": \"Execute failed: {error}\",\n \"reldb_sqliteBatchFailed\": \"Batch execute failed: {error}\",\n \"reldb_mysqlOnlyMysql\": \"MySQL Provider only supports mysql type\",\n \"reldb_mysqlConnectionFailed\": \"Failed to connect to MySQL: {error}\",\n \"reldb_mysqlTxFailed\": \"Transaction failed: {error}\",\n\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: {error}\",\n \"reldb_txFailed\": \"Transaction failed: {error}\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"reldb_notInitialized\": \"数据库未初始化,请先调用 db.init()\",\n \"reldb_initFailed\": \"初始化数据库失败: {error}\",\n \"reldb_closeFailed\": \"关闭数据库失败: {error}\",\n \"reldb_unsupportedType\": \"不支持的数据库类型: {type}\",\n \"reldb_ddlFailed\": \"DDL 操作失败: {error}\",\n \"reldb_queryFailed\": \"查询失败: {error}\",\n \"reldb_executeFailed\": \"执行失败: {error}\",\n \"reldb_batchFailed\": \"批量执行失败: {error}\",\n \"reldb_postgresTxFailed\": \"事务执行失败: {error}\",\n \"reldb_postgresOnlyPostgresql\": \"PostgreSQL Provider 仅支持 postgresql 类型\",\n \"reldb_postgresConnectionFailed\": \"连接 PostgreSQL 失败: {error}\",\n\n \"reldb_sqliteOnlySqlite\": \"SQLite Provider 仅支持 sqlite 类型\",\n \"reldb_sqliteNeedPath\": \"SQLite 需要提供数据库路径(database 字段)\",\n \"reldb_sqliteConnectionFailed\": \"连接 SQLite 失败: {error}\",\n \"reldb_sqliteTxFailed\": \"事务执行失败: {error}\",\n \"reldb_sqliteCreateTableFailed\": \"创建表 {tableName} 失败: {error}\",\n \"reldb_sqliteDropTableFailed\": \"删除表 {tableName} 失败: {error}\",\n \"reldb_sqliteAddColumnFailed\": \"向表 {tableName} 添加列 {columnName} 失败: {error}\",\n \"reldb_sqliteDropColumnFailed\": \"从表 {tableName} 删除列 {columnName} 失败: {error}\",\n \"reldb_sqliteRenameTableFailed\": \"重命名表 {oldName} 为 {newName} 失败: {error}\",\n \"reldb_sqliteCreateIndexFailed\": \"创建索引 {indexName} 失败: {error}\",\n \"reldb_sqliteDropIndexFailed\": \"删除索引 {indexName} 失败: {error}\",\n \"reldb_sqliteExecDdlFailed\": \"执行 DDL 失败: {error}\",\n \"reldb_sqliteQueryFailed\": \"查询失败: {error}\",\n \"reldb_sqliteExecuteFailed\": \"执行失败: {error}\",\n \"reldb_sqliteBatchFailed\": \"批量执行失败: {error}\",\n \"reldb_mysqlOnlyMysql\": \"MySQL Provider 仅支持 mysql 类型\",\n \"reldb_mysqlConnectionFailed\": \"连接 MySQL 失败: {error}\",\n \"reldb_mysqlTxFailed\": \"事务执行失败: {error}\",\n\n \"reldb_crudEmptyPayload\": \"CRUD 数据为空,请提供数据\",\n \"reldb_crudNoValidColumns\": \"CRUD 数据没有有效列\",\n \"reldb_crudRecordNotFound\": \"记录不存在: {id}\",\n \"reldb_invalidIdentifier\": \"非法的 SQL 标识符: {name}(仅允许字母、数字和下划线)\",\n \"reldb_configError\": \"数据库配置校验失败:{error}\",\n \"reldb_txFailed\": \"事务执行失败: {error}\"\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 messagesZhCN from '../messages/zh-CN.json'\n\n// ─── i18n ───\n\n/**\n * 数据库模块文案 Key 类型\n */\ntype ReldbMessageKey = keyof typeof messagesZhCN\n\n/**\n * 获取数据库模块文案。\n * @param key - 文案 Key\n * @param options - 插值参数与格式化选项\n * @returns 本地化后的文案字符串\n * @remarks 具体参数结构与 core.i18n.createMessageGetter 保持一致。\n *\n * @example\n * ```ts\n * import { reldbM } from '@h-ai/reldb'\n *\n * const text = reldbM('reldb_someMessageKey')\n * ```\n */\nexport const reldbM = core.i18n.createMessageGetter<ReldbMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\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 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 POOL_EXHAUSTED: '010:503',\n NOT_INITIALIZED: '011:500',\n DDL_FAILED: '012:500',\n UNSUPPORTED_TYPE: '013:400',\n CONFIG_ERROR: '014:500',\n} satisfies ErrorInfo\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/SERIAL | INT/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,否则映射为 INT。\n */\nexport type ColumnType\n = | 'TEXT'\n | 'INTEGER'\n | 'REAL'\n | 'BLOB'\n | 'BOOLEAN'\n | 'TIMESTAMP'\n | 'JSON'\n\n/**\n * 列定义接口\n *\n * 用于定义表的列结构。\n *\n * @example\n * ```ts\n * // 主键列\n * const idColumn: ReldbColumnDef = {\n * type: 'INTEGER',\n * primaryKey: true,\n * autoIncrement: true\n * }\n *\n * // 带外键的列\n * const userIdColumn: ReldbColumnDef = {\n * type: 'INTEGER',\n * notNull: true,\n * references: {\n * table: 'users',\n * column: 'id',\n * onDelete: 'CASCADE'\n * }\n * }\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 *\n * @example\n * ```ts\n * const userTable: ReldbTableDef = {\n * id: { type: 'INTEGER', primaryKey: true, autoIncrement: true },\n * name: { type: 'TEXT', notNull: true },\n * email: { type: 'TEXT', unique: true },\n * created_at: { type: 'TIMESTAMP', defaultValue: 'NOW()' }\n * }\n * ```\n */\nexport interface ReldbTableDef {\n [columnName: string]: ReldbColumnDef\n}\n\n/**\n * 索引定义\n *\n * @example\n * ```ts\n * // 普通索引\n * const emailIndex: ReldbIndexDef = { columns: ['email'] }\n *\n * // 唯一复合索引\n * const compositeIndex: ReldbIndexDef = {\n * columns: ['user_id', 'created_at'],\n * unique: true\n * }\n *\n * // 部分索引(带条件)\n * const partialIndex: ReldbIndexDef = {\n * columns: ['status'],\n * where: \"status = 'active'\"\n * }\n * ```\n */\nexport interface ReldbIndexDef {\n /** 索引包含的列 */\n columns: string[]\n /** 是否为唯一索引 */\n unique?: boolean\n /**\n * 索引条件(WHERE 子句,用于部分索引)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,不会经过参数化处理,\n * **禁止**将用户输入直接拼接。仅用于开发者编写的静态条件。\n */\n where?: string\n}\n\n// ─── DDL 操作接口 ───\n\n/**\n * DDL(数据定义语言)操作接口\n *\n * 提供表结构管理功能,包括创建/删除表、添加/删除列、创建索引等。\n * 所有操作返回 `HaiResult<void>` 类型。\n *\n * @example\n * ```ts\n * // 创建表\n * const result = await reldb.ddl.createTable('users', {\n * id: { type: 'INTEGER', primaryKey: true, autoIncrement: true },\n * name: { type: 'TEXT', notNull: true }\n * })\n *\n * if (!result.success) {\n * // 处理错误:创建表失败(可根据 result.error.code / message 做兜底)\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 * const result = await reldb.ddl.createTable('users', {\n * id: { type: 'INTEGER', primaryKey: true, autoIncrement: true },\n * name: { type: 'TEXT', notNull: true }\n * })\n * if (!result.success) {\n * // 创建失败:根据 result.error.code / message 处理\n * }\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 * await reldb.ddl.dropTable('users')\n * await reldb.ddl.dropTable('users_backup', false)\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 * await reldb.ddl.addColumn('users', 'age', { type: 'INTEGER' })\n * await reldb.ddl.addColumn('users', 'email', { type: 'TEXT', unique: true })\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 * await reldb.ddl.dropColumn('users', 'legacy_field')\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 * await reldb.ddl.renameTable('users_temp', 'users')\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 * await reldb.ddl.createIndex('users', 'idx_users_email', {\n * columns: ['email'],\n * unique: true,\n * })\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 * await reldb.ddl.dropIndex('idx_users_email')\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 * // ✅ 安全:静态 SQL\n * await reldb.ddl.raw('ALTER TABLE users ADD COLUMN status TEXT')\n *\n * // ❌ 危险:拼接用户输入\n * await reldb.ddl.raw(`ALTER TABLE ${userInput} ADD COLUMN status TEXT`)\n * ```\n */\n raw: (sql: string) => Promise<HaiResult<void>>\n}\n\n// ─── SQL 操作接口 ───\n\n/**\n * 查询结果行类型\n *\n * 约定为键值对象,字段名与 SQL 返回列一致。\n */\nexport type QueryRow = Record<string, unknown>\n\n/**\n * 执行结果\n *\n * INSERT/UPDATE/DELETE 操作返回的结果。\n */\nexport interface ExecuteResult {\n /** 影响的行数 */\n changes: number\n /** 最后插入的行 ID(仅 INSERT 时有效) */\n lastInsertRowid?: number | bigint\n}\n\n// ─── 分页类型 ───\n\n/**\n * 规范化后的分页参数\n */\nexport interface NormalizedPagination extends PaginationOptions {\n /** SQL offset */\n offset: number\n /** SQL limit */\n limit: number\n}\n\n/**\n * 分页参数覆盖\n */\nexport interface PaginationOverrides {\n /** 默认页码 */\n defaultPage?: number\n /** 默认每页数量 */\n defaultPageSize?: number\n /** 最大每页数量 */\n maxPageSize?: number\n}\n\n/**\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 */\nexport interface DmlOperations {\n /** 查询多行 */\n query: <T = QueryRow>(sql: string, params?: unknown[]) => Promise<HaiResult<T[]>>\n /** 查询单行 */\n get: <T = QueryRow>(sql: string, params?: unknown[]) => Promise<HaiResult<T | null>>\n /** 执行修改语句(INSERT/UPDATE/DELETE) */\n execute: (sql: string, params?: unknown[]) => Promise<HaiResult<ExecuteResult>>\n /** 批量执行多条语句(在同一事务上下文中) */\n batch: (statements: Array<{ sql: string, params?: unknown[] }>) => Promise<HaiResult<void>>\n /** 分页查询 */\n queryPage: <T = QueryRow>(options: PaginationQueryOptions) => Promise<HaiResult<PaginatedResult<T>>>\n}\n\n// ─── CRUD 抽象类型 ───\n\n/** CRUD 查询条件 */\nexport interface CrudQueryOptions {\n /**\n * WHERE 子句(不包含 WHERE 关键字)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,**禁止**将用户输入直接拼接。\n * 动态值必须通过 `params` 占位符(`?`)传入。\n *\n * @example\n * ```ts\n * // ✅ 安全:占位符 + params\n * crud.findAll({ where: 'status = ? AND age > ?', params: ['active', 18] })\n *\n * // ❌ 危险:拼接用户输入\n * crud.findAll({ where: `name = '${userInput}'` })\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/** CRUD 分页查询条件 */\nexport interface CrudPageOptions {\n /**\n * WHERE 子句(不包含 WHERE 关键字)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,**禁止**将用户输入直接拼接。\n * 动态值必须通过 `params` 占位符(`?`)传入。\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/** CRUD 统计条件 */\nexport interface ReldbCrudCountOptions {\n /**\n * WHERE 子句(不包含 WHERE 关键字)\n *\n * **⚠️ 安全警告:** `where` 为原始 SQL 片段,**禁止**将用户输入直接拼接。\n * 动态值必须通过 `params` 占位符(`?`)传入。\n */\n where?: string\n /** 参数列表 */\n params?: unknown[]\n}\n\n/** CRUD 配置 */\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/** CRUD 字段定义 */\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/** BaseReldbCrudRepository 配置 */\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/** CRUD 仓库接口 */\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/** CRUD 管理器(统一入口) */\nexport interface CrudManager {\n /** 获取单表 CRUD 仓库 */\n table: <TItem>(config: CrudConfig<TItem>) => ReldbCrudRepository<TItem>\n}\n\n// ─── 事务接口 ───\n\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)\n * @example\n * ```ts\n * const result = await reldb.tx.wrap(async (tx) => {\n * await tx.execute('INSERT INTO users (name) VALUES (?)', ['用户A'])\n * return await tx.get('SELECT * FROM users WHERE name = ?', ['用户A'])\n * })\n * ```\n */\nexport type TxWrapCallback<T> = (tx: DmlWithTxOperations) => Promise<T>\n\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 *\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * // 初始化\n * await reldb.init({ type: 'sqlite', database: ':memory:' })\n *\n * // 检查状态\n * if (reldb.isInitialized) {\n * // 可读取当前数据库类型:reldb.config?.type\n * }\n *\n * // 使用 DDL\n * await reldb.ddl.createTable('users', { ... })\n *\n * // 使用 SQL\n * await reldb.sql.query('SELECT * FROM users')\n *\n * // 使用事务\n * await reldb.tx.wrap(async (tx) => { ... })\n *\n * // 关闭连接\n * await reldb.close()\n * ```\n */\nexport interface ReldbFunctions {\n /**\n * 初始化数据库连接\n *\n * @param config - 数据库配置\n * @returns 初始化结果\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 /** 当前数据库配置(未初始化时为 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 *\n * @example\n * ```ts\n * // 提取 JSON 字段值(用于 WHERE 条件)\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 readonly json: ReldbJsonOps\n\n /** 关闭数据库连接 */\n close: () => Promise<HaiResult<void>>\n}\n\n// ─── Provider 接口 ───\n\n/**\n * 数据库 Provider 接口\n *\n * 内部使用,定义各数据库驱动需要实现的接口。\n * 每个数据库类型(SQLite、PostgreSQL、MySQL)都有对应的 Provider 实现。\n */\nexport interface ReldbProvider {\n /** DDL 操作(表结构管理) */\n readonly ddl: DdlOperations\n /** SQL 操作(数据查询和修改) */\n readonly sql: DmlOperations\n /** CRUD 管理器 */\n readonly crud: CrudManager\n /** 事务管理器 */\n readonly tx: TxManager\n /** 连接数据库 */\n connect: (config: ReldbConfig) => Promise<HaiResult<void>>\n /** 关闭连接 */\n close: () => Promise<HaiResult<void>>\n /** 是否已连接 */\n isConnected: () => boolean\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 *\n * @example\n * ```ts\n * class UserRepository extends BaseReldbCrudRepository<User> {\n * constructor(db: ReldbFunctions) {\n * super(db, {\n * table: 'users',\n * fields: [\n * { fieldName: 'id', columnName: 'id', def: { type: 'INTEGER', primaryKey: true, autoIncrement: true }, select: true, create: false, update: false },\n * { fieldName: 'name', columnName: 'name', def: { type: 'TEXT', notNull: true }, select: true, create: true, update: true },\n * { fieldName: 'createdAt', columnName: 'created_at', def: { type: 'TIMESTAMP' }, select: true, create: true, update: false },\n * ],\n * })\n * }\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 => [field.columnName, this.normalizeReldbColumnDef(field.def)] 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) ? undefined : 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) ? value : 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: 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 result[field.fieldName] = value\n }\n // 行映射结果为动态构建的对象,无法通过 TS 静态推导,需强转为 TItem\n return result as unknown as TItem\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 * @returns 初始化结果\n */\n private 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 */\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 */\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 */\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, [...insertValues, ...updateValues])\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 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 */\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 */\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 */\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 */\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 */\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 */\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 */\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 */\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 * 路径格式遵循 SQL/JSON Path 标准(`$.key` / `$.key.subkey` / `$[0]`)。\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 | \\|\\| ::jsonb | JSON_MERGE_PATCH + CAST |\n *\n * @module reldb-json\n */\n\n// ─── 类型定义 ───\n\n/**\n * JSON SQL 表达式结果\n *\n * 包含可嵌入 SQL 语句的表达式片段与对应参数列表。\n * 参数占位符统一使用 `?`,各 Provider 会在执行前自动转换。\n *\n * @example\n * ```ts\n * const { sql, params } = reldb.json.set('settings', '$.theme', 'dark')\n * // 将 sql 和 params 嵌入到完整 SQL 中执行\n * await reldb.sql.execute(\n * `UPDATE users SET settings = ${sql} WHERE id = ?`,\n * [...params, userId],\n * )\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 * 路径格式:遵循 SQL/JSON Path 标准,以 `$` 开头:\n * - 对象字段:`$.key`、`$.key.subkey`\n * - 数组元素:`$[0]`、`$.items[1]`\n *\n * @example\n * ```ts\n * // 提取 JSON 字段值(用于 SELECT 或 WHERE)\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 字段的某个路径(用于 UPDATE SET)\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 */\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 *\n * @example\n * ```ts\n * const { sql, params } = reldb.json.extract('data', '$.status')\n * // SQLite: sql = \"json_extract(data, ?)\", params = [\"$.status\"]\n * // PostgreSQL: sql = \"data #> ?::text[]\", params = [[\"status\"]]\n * // MySQL: sql = \"JSON_EXTRACT(data, ?)\", params = [\"$.status\"]\n * ```\n */\n extract: (column: string, path: string) => JsonSqlExpr\n\n /**\n * JSON 路径设置表达式(创建或替换)\n *\n * 在 JSON 列的指定路径设置新值。若路径不存在则创建,若已存在则替换。\n * 返回修改后的完整 JSON 值,通常用于 `UPDATE SET col = ...`。\n *\n * @param column - 列名(开发者负责安全性,禁止传入用户输入)\n * @param path - JSON 路径\n * @param value - 要设置的值(支持任意 JSON 兼容类型)\n * @returns SQL 表达式与参数\n *\n * @example\n * ```ts\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, id],\n * )\n * ```\n */\n set: (column: string, path: string, value: unknown) => JsonSqlExpr\n\n /**\n * JSON 路径插入表达式(仅当路径不存在时)\n *\n * 仅在指定路径不存在时插入新值,已存在的路径不会被覆盖。\n * 返回修改后的完整 JSON 值。\n *\n * @param column - 列名(开发者负责安全性,禁止传入用户输入)\n * @param path - JSON 路径\n * @param value - 要插入的值\n * @returns SQL 表达式与参数\n *\n * @example\n * ```ts\n * const { sql, params } = reldb.json.insert('data', '$.newField', 'value')\n * await reldb.sql.execute(\n * `UPDATE items SET data = ${sql} WHERE id = ?`,\n * [...params, id],\n * )\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 *\n * @example\n * ```ts\n * const { sql, params } = reldb.json.remove('settings', '$.deprecated')\n * await reldb.sql.execute(\n * `UPDATE users SET settings = ${sql} WHERE id = ?`,\n * [...params, id],\n * )\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 *\n * @example\n * ```ts\n * const { sql, params } = reldb.json.merge('profile', { bio: 'new bio', avatar: null })\n * await reldb.sql.execute(\n * `UPDATE users SET profile = ${sql} WHERE id = ?`,\n * [...params, id],\n * )\n * ```\n */\n merge: (column: string, patch: Record<string, unknown>) => JsonSqlExpr\n}\n\n// ─── 路径解析工具 ───\n\n/**\n * 解析 JSON Path 为路径段数组\n *\n * 将 `$.key.subkey[0]` 格式的路径解析为 `['key', 'subkey', '0']`。\n *\n * @param path - JSON 路径(以 `$` 开头)\n * @returns 路径段数组\n *\n * @example\n * ```ts\n * parseJsonPath('$.user.name') // ['user', 'name']\n * parseJsonPath('$.items[0]') // ['items', '0']\n * parseJsonPath('$[1]') // ['1']\n * ```\n */\nexport function parseJsonPath(path: string): string[] {\n // 移除前缀 $\n let remaining = path.startsWith('$') ? path.slice(1) : 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(/^([^.[]+)/)\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: [path, JSON.stringify(value)],\n }\n },\n\n insert(column, path, value) {\n return {\n sql: `json_insert(${column}, ?, json(?))`,\n params: [path, JSON.stringify(value)],\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: [JSON.stringify(patch)],\n }\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: [segments, JSON.stringify(value)],\n }\n },\n\n insert(column, path, value) {\n const segments = parseJsonPath(path)\n return {\n sql: `jsonb_insert(${column}, ?::text[], ?::jsonb)`,\n params: [segments, JSON.stringify(value)],\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 {\n sql: `${column} || ?::jsonb`,\n params: [JSON.stringify(patch)],\n }\n },\n }\n}\n\n/**\n * 创建 MySQL 的 JSON 操作实现\n *\n * 使用 MySQL 内置 JSON 函数(需 MySQL 5.7.8+ 或 MariaDB 10.2+)。\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: [path, JSON.stringify(value)],\n }\n },\n\n insert(column, path, value) {\n return {\n sql: `JSON_INSERT(${column}, ?, CAST(? AS JSON))`,\n params: [path, JSON.stringify(value)],\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: [JSON.stringify(patch)],\n }\n },\n }\n}\n\n// ─── 工厂函数 ───\n\n/**\n * 创建指定数据库类型的 JSON 操作实例\n *\n * @param dbType - 数据库类型(来自 `reldb.config?.type`)\n * @returns JSON 操作实例\n *\n * @example\n * ```ts\n * // 通过 reldb.json 直接使用(推荐)\n * const { sql, params } = reldb.json.extract('data', '$.key')\n *\n * // 手动创建(用于测试或特殊场景)\n * const jsonOps = createJsonOps('sqlite')\n * const { sql, params } = jsonOps.set('data', '$.key', 'value')\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 *\n * @example\n * ```ts\n * // 使用默认值\n * normalizePagination() // { page: 1, pageSize: 20, offset: 0, limit: 20 }\n *\n * // 自定义分页\n * normalizePagination({ page: 3, pageSize: 10 }) // { page: 3, pageSize: 10, offset: 20, limit: 10 }\n *\n * // 覆盖默认值\n * normalizePagination(undefined, { defaultPageSize: 50, maxPageSize: 100 })\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 *\n * @example\n * ```ts\n * const result = buildPaginatedResult(\n * [{ id: 1, name: '张三' }],\n * 100,\n * { page: 1, pageSize: 20 }\n * )\n * // { items: [...], total: 100, page: 1, pageSize: 20 }\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 *\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * const pag = reldb.pagination.normalize({ page: 2, pageSize: 10 })\n * // pag.offset = 10, pag.limit = 10\n *\n * const result = reldb.pagination.build(items, total, pag)\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 *\n * @example\n * ```ts\n * parseCount({ cnt: 42 }) // 42\n * parseCount({ total: 10 }) // 10\n * parseCount(null) // 0\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 *\n * @example\n * ```ts\n * const result = validateIdentifier('users')\n * // result.success === true\n *\n * const bad = validateIdentifier('users; DROP TABLE')\n * // bad.success === false\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', { params: { name } }))\n}\n\n/**\n * 批量校验多个 SQL 标识符\n *\n * 逐个校验,遇到第一个不合法的立即返回错误。\n *\n * @param names - 待校验的标识符数组\n * @returns 全部合法时返回 ok(undefined);否则返回第一个不合法项的错误\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 *\n * @example\n * ```ts\n * quoteIdentifier('users') // '\"users\"'\n * quoteIdentifier('order') // '\"order\"' (安全引用 SQL 保留字)\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 *\n * @example\n * ```ts\n * escapeSqlString(\"it's\") // \"it''s\"\n * escapeSqlString(\"normal\") // \"normal\"\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' })\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 ? keys.filter(key => allowList.includes(key)) : 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 */\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 ? ` WHERE ${where}` : '')\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(/^(\\w+)(?:\\s+(ASC|DESC))?$/i)\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 ? `${colName} ${direction.toUpperCase()}` : 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 ? mapRow(result.data) : 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', { params: { id: String(id) } }))\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 ? allowList : 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 = [...filtered.map(column => data[column]), id]\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 */\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 */\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 try {\n await callbacks.commit()\n active = false\n return ok(undefined)\n }\n catch (error) {\n active = false\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 try {\n await callbacks.rollback()\n active = false\n return ok(undefined)\n }\n catch (error) {\n active = false\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 */\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', { params: { error: String(error) } }), 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 { HaiErrorDef, HaiResult, PaginatedResult } from '@h-ai/core'\n\nimport type {\n CrudManager,\n DdlOperations,\n DmlOperations,\n PaginationQueryOptions,\n TxManager,\n} from '../reldb-types.js'\n\nimport { err } 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 */\nexport interface ReldbOpsContext {\n /** 连接状态检查 */\n isConnected: () => boolean\n /** Logger 实例(用于运行时异常的错误日志) */\n logger: {\n error: (msg: string, meta?: Record<string, unknown>) => void\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 try {\n return await fn()\n }\n catch (error) {\n ctx.logger.error(errorLabel, { ...errorMeta, error })\n return err(errorDef, reldbM('reldb_queryFailed', { params: { error: String(error) } }), error)\n }\n}\n\n// ─── DDL 操作工厂 ───\n\n/**\n * 创建标准 DDL 操作\n *\n * 各 Provider 只需提供 raw DdlOperations,base 层统一处理标识符校验、连接守卫与运行时异常。\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 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 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 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 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 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 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 return wrapOp(ctx, () => raw.dropIndex(indexName, ifExists), HaiReldbError.DDL_FAILED, 'DDL: dropIndex failed', { indexName })\n },\n\n raw(sql) {\n return wrapOp(ctx, () => raw.raw(sql), HaiReldbError.DDL_FAILED, 'DDL: raw failed')\n },\n }\n}\n\n// ─── DML 操作工厂 ───\n\n/**\n * 创建标准 DML 操作\n *\n * 各 Provider 只需提供 raw DmlOperations,base 层统一处理连接守卫与运行时异常。\n */\nexport function createBaseDmlOps(ctx: ReldbOpsContext, raw: DmlOperations): DmlOperations {\n return {\n query: (sql, params) => wrapOp(ctx, () => raw.query(sql, params), HaiReldbError.QUERY_FAILED, 'DML: query failed'),\n get: (sql, params) => wrapOp(ctx, () => raw.get(sql, params), HaiReldbError.QUERY_FAILED, 'DML: get failed'),\n execute: (sql, params) => wrapOp(ctx, () => raw.execute(sql, params), HaiReldbError.QUERY_FAILED, 'DML: execute failed'),\n batch: stmts => wrapOp(ctx, () => raw.batch(stmts), HaiReldbError.QUERY_FAILED, 'DML: batch failed'),\n queryPage: options => wrapOp(ctx, () => raw.queryPage(options), HaiReldbError.QUERY_FAILED, 'DML: queryPage failed'),\n }\n}\n\n// ─── 事务管理器工厂 ───\n\n/**\n * 创建标准事务管理器\n *\n * 各 Provider 只需提供 beginTx 函数,base 层统一处理连接守卫 + tx.wrap 语法糖。\n */\nexport function createBaseTxManager(ctx: ReldbOpsContext, beginTx: TxManager['begin']): TxManager {\n const begin: TxManager['begin'] = () => wrapOp(ctx, beginTx, HaiReldbError.TRANSACTION_FAILED, 'TX: begin failed')\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 */\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 */\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 = [...(options.params ?? []), pagination.limit, pagination.offset]\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 */\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 */\nexport function buildColumnSqlBase(\n name: string,\n def: ReldbColumnDef,\n options: ColumnSqlOptions,\n): string {\n const parts: string[] = [options.quoteId(name)]\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 */\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 */\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 ? ` WHERE ${indexDef.where}` : ''\n return `CREATE ${uniqueClause}INDEX IF NOT EXISTS ${quotedIndex} ON ${quotedTable} (${columns})${whereClause}`\n}\n\n/**\n * 默认 RENAME TABLE SQL 生成(SQLite / PostgreSQL 通用)\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 */\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 { ReldbConfig } from '../reldb-config.js'\nimport type {\n DdlOperations,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n PaginationQueryOptions,\n ReldbColumnDef,\n ReldbProvider,\n} from '../reldb-types.js'\nimport type { ReldbOpsContext } from './reldb-provider-base.js'\n\nimport { core, err, ok } from '@h-ai/core'\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// ─── mysql2 类型定义(避免强依赖) ───\n\n/** MySQL 连接池接口 */\ninterface MysqlPool {\n query: (sql: string, values?: unknown[]) => Promise<[unknown[], unknown]>\n execute: (sql: string, values?: unknown[]) => Promise<[MysqlResult, unknown]>\n getConnection: () => Promise<MysqlConnection>\n end: () => Promise<void>\n}\n\n/** MySQL 连接接口 */\ninterface MysqlConnection {\n query: (sql: string, values?: unknown[]) => Promise<[unknown[], unknown]>\n execute: (sql: string, values?: unknown[]) => Promise<[MysqlResult, unknown]>\n beginTransaction: () => Promise<void>\n commit: () => Promise<void>\n rollback: () => Promise<void>\n release: () => void\n}\n\n/** MySQL 执行结果 */\ninterface MysqlResult {\n affectedRows: number\n insertId: number\n}\n\n// ─── MySQL Provider 实现 ───\n\n/**\n * 创建 MySQL Provider 实例\n *\n * @returns MySQL Provider\n */\nexport function createMysqlProvider(): ReldbProvider {\n /** 连接池实例 */\n let pool: MysqlPool | null = null\n\n // ─── 操作上下文 ───\n\n const ctx: ReldbOpsContext = {\n isConnected: () => pool !== null,\n logger,\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', { params: { error: detail } })\n }\n\n /**\n * 根据索引名解析所在表\n *\n * MySQL 的 `DROP INDEX` 语句需要表名,因此通过 INFORMATION_SCHEMA\n * 在当前数据库中查找索引所属表。\n */\n async function findIndexTableName(\n queryFn: (sql: string, values?: unknown[]) => Promise<[unknown[], unknown]>,\n indexName: string,\n ): Promise<HaiResult<string | null>> {\n try {\n const [rows] = await queryFn(\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 catch (error) {\n return err(HaiReldbError.QUERY_FAILED, reldbM('reldb_queryFailed', { params: { error: String(error) } }), error)\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 '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 const rawDdl: DdlOperations = {\n async createTable(name, columns, ifNotExists = true) {\n const quotedTable = mysqlQuoteId(name)\n const sql = mysqlBuildCreateTableSql(quotedTable, columns, ifNotExists)\n await pool!.query(sql)\n return ok(undefined)\n },\n async dropTable(name, ifExists) {\n const ifExistsClause = ifExists ? 'IF EXISTS ' : ''\n await pool!.query(`DROP TABLE ${ifExistsClause}${mysqlQuoteId(name)}`)\n return ok(undefined)\n },\n async addColumn(table, column, def) {\n const colSql = mysqlBuildColumnSql(column, def)\n await pool!.query(`ALTER TABLE ${mysqlQuoteId(table)} ADD COLUMN ${colSql}`)\n return ok(undefined)\n },\n async dropColumn(table, column) {\n await pool!.query(`ALTER TABLE ${mysqlQuoteId(table)} DROP COLUMN ${mysqlQuoteId(column)}`)\n return ok(undefined)\n },\n async renameTable(oldName, newName) {\n await pool!.query(`RENAME TABLE ${mysqlQuoteId(oldName)} TO ${mysqlQuoteId(newName)}`)\n return ok(undefined)\n },\n async createIndex(table, index, def) {\n const uniqueClause = def.unique ? 'UNIQUE ' : ''\n const columns = def.columns.map(c => mysqlQuoteId(c)).join(', ')\n await pool!.query(`CREATE ${uniqueClause}INDEX ${mysqlQuoteId(index)} ON ${mysqlQuoteId(table)} (${columns})`)\n return ok(undefined)\n },\n async dropIndex(index, ifExists) {\n const tableResult = await findIndexTableName((s, v) => pool!.query(s, v), 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', { params: { error: `index not found: ${index}` } }))\n }\n\n await pool!.query(`DROP INDEX ${mysqlQuoteId(index)} ON ${mysqlQuoteId(tableResult.data)}`)\n return ok(undefined)\n },\n async raw(sql) {\n await pool!.query(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 pool!.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] = await pool!.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 pool!.execute(sql, params)\n return ok({ changes: result.affectedRows, lastInsertRowid: result.insertId })\n },\n async batch(statements) {\n let connection: MysqlConnection | null = null\n try {\n connection = await pool!.getConnection()\n await connection.beginTransaction()\n for (const { sql: s, params } of statements) {\n await connection.execute(s, params)\n }\n await connection.commit()\n return ok(undefined)\n }\n catch (error) {\n if (connection) {\n await connection.rollback().catch(() => { })\n }\n return err(HaiReldbError.QUERY_FAILED, reldbM('reldb_batchFailed', { params: { error: String(error) } }), error)\n }\n finally {\n if (connection) {\n connection.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 [rows] = await pool!.query(sql, params)\n return rows as unknown[]\n },\n options,\n )\n return ok(result)\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] = 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] = 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(sql, 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(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 [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 let connection: MysqlConnection | null = null\n\n try {\n connection = await pool!.getConnection()\n await connection.beginTransaction()\n }\n catch (error) {\n if (connection) {\n connection.release()\n }\n return err(HaiReldbError.TRANSACTION_FAILED, mysqlTxErrorMessage(String(error)), error)\n }\n\n const txDmlOps = createMysqlTxDmlOps(connection)\n return ok(createTxHandle(txDmlOps, {\n commit: async () => { await connection!.commit() },\n rollback: async () => { await connection!.rollback() },\n release: () => connection!.release(),\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\n try {\n // eslint-disable-next-line ts/no-require-imports -- 按需加载\n const mysql = require('mysql2/promise')\n\n pool = mysql.createPool({\n uri: 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 connectionLimit: config.pool?.max ?? 10,\n waitForConnections: true,\n queueLimit: 0,\n charset: config.mysql?.charset ?? 'utf8mb4',\n }) as MysqlPool\n\n // 验证连接可用性\n await pool.query('SELECT 1')\n\n logger.info('Connected to MySQL', { host: config.host, port: config.port, database: config.database })\n return ok(undefined)\n }\n catch (error) {\n pool = null\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_mysqlConnectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n if (pool) {\n try {\n await pool.end()\n }\n catch (error) {\n pool = null\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_mysqlConnectionFailed', { params: { error: String(error) } }), error)\n }\n pool = null\n logger.info('Disconnected from MySQL')\n }\n return ok(undefined)\n },\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 ReldbProvider,\n} from '../reldb-types.js'\nimport type { ReldbOpsContext } from './reldb-provider-base.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'\n\nconst logger = core.logger.child({ module: 'reldb', scope: 'postgres' })\n\n// ─── pg 类型定义(避免强依赖) ───\n\n/** PostgreSQL 连接池接口 */\ninterface PgPool {\n query: (text: string, values?: unknown[]) => Promise<{ rows: unknown[], rowCount: number }>\n connect: () => Promise<PgClient>\n end: () => Promise<void>\n}\n\n/** PostgreSQL 客户端接口 */\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 */\nexport function createPostgresProvider(): ReldbProvider {\n /** 连接池实例 */\n let pool: PgPool | null = null\n\n // ─── 操作上下文 ───\n\n const ctx: ReldbOpsContext = {\n isConnected: () => pool !== null,\n logger,\n }\n\n // ─── 辅助函数 ───\n\n /**\n * 将 ? 占位符转换为 PostgreSQL 的 $1, $2, ... 格式\n */\n function convertPlaceholders(sql: string): string {\n let index = 0\n return sql.replace(/\\?/g, () => `$${++index}`)\n }\n\n /** 事务错误消息生成 */\n function pgTxErrorMessage(detail: string): string {\n return reldbM('reldb_postgresTxFailed', { params: { error: detail } })\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 '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 // ─── 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 pool!.query(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 pool!.query(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 pool!.query(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 pool!.query(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', { params: { error: String(error) } }), 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 try {\n client = await pool!.connect()\n await client.query('BEGIN')\n }\n catch (error) {\n if (client) {\n client.release()\n }\n return err(HaiReldbError.TRANSACTION_FAILED, pgTxErrorMessage(String(error)), error)\n }\n\n const txDmlOps = createPgTxDmlOps(client)\n return ok(createTxHandle(txDmlOps, {\n commit: async () => { await client!.query('COMMIT') },\n rollback: async () => { await client!.query('ROLLBACK') },\n release: () => client!.release(),\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\n try {\n // eslint-disable-next-line ts/no-require-imports -- 按需加载\n const { Pool } = require('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 // 验证连接可用性\n await pool.query('SELECT 1')\n\n logger.info('Connected to PostgreSQL', { host: config.host, port: config.port, database: config.database })\n return ok(undefined)\n }\n catch (error) {\n pool = null\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_postgresConnectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n if (pool) {\n try {\n await pool.end()\n }\n catch (error) {\n pool = null\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_postgresConnectionFailed', { params: { error: String(error) } }), error)\n }\n pool = null\n logger.info('Disconnected from PostgreSQL')\n }\n return ok(undefined)\n },\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 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 Database from 'better-sqlite3'\nimport type { ReldbConfig } from '../reldb-config.js'\nimport type {\n DdlOperations,\n DmlOperations,\n DmlWithTxOperations,\n ExecuteResult,\n PaginationQueryOptions,\n ReldbColumnDef,\n ReldbProvider,\n} from '../reldb-types.js'\nimport type { ReldbOpsContext } from './reldb-provider-base.js'\n\nimport { createRequire } from 'node:module'\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'\n\nconst require = createRequire(import.meta.url)\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 */\nexport function createSqliteProvider(): ReldbProvider {\n /** 数据库实例 */\n let database: Database.Database | null = null\n /** 串行化 SQLite 事务,避免并发 BEGIN 导致 \"cannot start a transaction within a transaction\" */\n let txChain: Promise<void> = Promise.resolve()\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: () => database !== null && database.open,\n logger,\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 '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', { params: { error: detail } })\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 database!.exec(sql)\n return ok(undefined)\n },\n async dropTable(name, ifExists) {\n const ifExistsClause = ifExists ? 'IF EXISTS ' : ''\n database!.exec(`DROP TABLE ${ifExistsClause}${quoteIdentifier(name)}`)\n return ok(undefined)\n },\n async addColumn(table, column, def) {\n const colSql = sqliteBuildColumnSql(column, def)\n database!.exec(`ALTER TABLE ${quoteIdentifier(table)} ADD COLUMN ${colSql}`)\n return ok(undefined)\n },\n async dropColumn(table, column) {\n database!.exec(`ALTER TABLE ${quoteIdentifier(table)} DROP COLUMN ${quoteIdentifier(column)}`)\n return ok(undefined)\n },\n async renameTable(oldName, newName) {\n database!.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 database!.exec(sql)\n return ok(undefined)\n },\n async dropIndex(index, ifExists = true) {\n const sql = buildDefaultDropIndexSql(quoteIdentifier, index, ifExists)\n database!.exec(sql)\n return ok(undefined)\n },\n async raw(sql) {\n database!.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 stmt = database!.prepare(sql)\n const rows = params ? stmt.all(...params) : stmt.all()\n return ok(rows as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const stmt = database!.prepare(sql)\n const row = params ? stmt.get(...params) : stmt.get()\n return ok((row as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const stmt = database!.prepare(sql)\n const result = params ? stmt.run(...params) : stmt.run()\n return ok({ changes: result.changes, lastInsertRowid: result.lastInsertRowid })\n },\n async batch(statements) {\n const releaseTxLock = await acquireTxLock()\n try {\n const db = database!\n const transaction = db.transaction(() => {\n for (const { sql: s, params } of statements) {\n const stmt = db.prepare(s)\n if (params)\n stmt.run(...params)\n else stmt.run()\n }\n })\n transaction()\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.QUERY_FAILED, reldbM('reldb_sqliteBatchFailed', { params: { error: String(error) } }), 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 async (sqlStr, params) => {\n const stmt = database!.prepare(sqlStr)\n return params ? stmt.all(...params) : stmt.all()\n },\n options,\n )\n return ok(result)\n },\n }\n\n // ─── 事务 ───\n\n /** 创建事务连接上的 DML 操作(无守卫,由 createTxHandle 统一守卫) */\n function createSqliteTxDmlOps(db: Database.Database): DmlOperations {\n return {\n async query<T>(sql: string, params?: unknown[]): Promise<HaiResult<T[]>> {\n const stmt = db.prepare(sql)\n return ok((params ? stmt.all(...params) : stmt.all()) as T[])\n },\n async get<T>(sql: string, params?: unknown[]): Promise<HaiResult<T | null>> {\n const stmt = db.prepare(sql)\n return ok(((params ? stmt.get(...params) : stmt.get()) as T) ?? null)\n },\n async execute(sql: string, params?: unknown[]): Promise<HaiResult<ExecuteResult>> {\n const stmt = db.prepare(sql)\n const result = params ? stmt.run(...params) : stmt.run()\n return ok({ changes: result.changes, lastInsertRowid: result.lastInsertRowid })\n },\n async batch(statements) {\n for (const { sql: s, params } of statements) {\n const stmt = db.prepare(s)\n if (params)\n stmt.run(...params)\n else stmt.run()\n }\n return ok(undefined)\n },\n async queryPage<T>(options: PaginationQueryOptions): Promise<HaiResult<PaginatedResult<T>>> {\n const result = await queryPageAsync<T>(\n async (sqlStr, params) => {\n const stmt = db.prepare(sqlStr)\n return params ? stmt.all(...params) : stmt.all()\n },\n options,\n )\n return ok(result)\n },\n }\n }\n\n async function beginTx(): Promise<HaiResult<DmlWithTxOperations>> {\n const db = database!\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 db.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(db)\n return ok(createTxHandle(txDmlOps, {\n commit: async () => { db.exec('COMMIT') },\n rollback: async () => { db.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 try {\n const Database = require('better-sqlite3')\n\n const sqliteOptions: { walMode: boolean, readonly: boolean } = {\n walMode: true,\n readonly: false,\n ...(config.sqlite ?? {}),\n }\n database = new Database(config.database, {\n readonly: sqliteOptions.readonly ?? false,\n }) as Database.Database\n\n // 启用 WAL 模式(提高并发性能)\n if (sqliteOptions.walMode !== false) {\n database.pragma('journal_mode = WAL')\n }\n\n logger.info('Connected to SQLite', { database: config.database })\n return ok(undefined)\n }\n catch (error) {\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_sqliteConnectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n if (database) {\n try {\n database.close()\n }\n catch (error) {\n database = null\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_sqliteConnectionFailed', { params: { error: String(error) } }), error)\n }\n database = null\n logger.info('Disconnected from SQLite')\n }\n return ok(undefined)\n },\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 — 数据库服务主入口\n *\n * 本文件提供统一的 `reldb` 对象,聚合所有数据库操作功能。\n * @module reldb-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ReldbConfig, ReldbConfigInput } from './reldb-config.js'\nimport type {\n CrudManager,\n DdlOperations,\n DmlOperations,\n ReldbFunctions,\n ReldbJsonOps,\n ReldbProvider,\n TxManager,\n} from './reldb-types.js'\n\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 { 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 工厂 ───\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 *\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n *\n * // 初始化\n * await reldb.init({ type: 'sqlite', database: ':memory:' })\n *\n * // DDL 操作\n * await reldb.ddl.createTable('users', {\n * id: { type: 'INTEGER', primaryKey: true, autoIncrement: true },\n * name: { type: 'TEXT', notNull: true }\n * })\n *\n * // SQL 操作\n * await reldb.sql.execute('INSERT INTO users (name) VALUES (?)', ['张三'])\n * const users = await reldb.sql.query('SELECT * FROM users')\n *\n * // 事务操作\n * await reldb.tx.wrap(async (tx) => {\n * await tx.execute('INSERT INTO users (name) VALUES (?)', ['用户1'])\n * await tx.execute('INSERT INTO users (name) VALUES (?)', ['用户2'])\n * return 'done'\n * })\n *\n * // 关闭连接\n * await reldb.close()\n * ```\n */\nexport const reldb: ReldbFunctions = {\n /**\n * 初始化数据库连接\n *\n * @param config - 数据库配置(允许部分字段,内部会补齐默认值)\n * @returns 初始化结果,失败时包含错误信息\n */\n async init(config: ReldbConfigInput): Promise<HaiResult<void>> {\n if (initInProgress) {\n logger.warn('RelDB module init is already in progress, skipping concurrent call')\n return err(HaiReldbError.CONFIG_ERROR, reldbM('reldb_configError', { params: { error: 'init already in progress' } }))\n }\n\n initInProgress = true\n try {\n if (currentProvider) {\n logger.warn('RelDB module is already initialized, reinitializing')\n await reldb.close()\n }\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', { params: { error: parseResult.error.message } }), parseResult.error)\n }\n const parsed = parseResult.data\n\n try {\n const provider = createProvider(parsed)\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 connectResult\n }\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 err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_initFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n }\n finally {\n initInProgress = false\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 /** 获取当前配置(未初始化时为 null) */\n get config(): ReldbConfig | null {\n return currentConfig\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 * 多次调用安全,未初始化时直接返回。\n */\n async close(): Promise<HaiResult<void>> {\n if (!currentProvider) {\n currentConfig = null\n currentJsonOps = null\n logger.info('RelDB module already closed, skipping')\n return ok(undefined)\n }\n\n logger.info('Closing RelDB module')\n\n try {\n const closeResult = await currentProvider.close()\n if (!closeResult.success) {\n logger.error('RelDB module close failed', { code: closeResult.error.code, message: closeResult.error.message })\n return closeResult\n }\n logger.info('RelDB module closed')\n return ok(undefined)\n }\n catch (error) {\n logger.error('RelDB module close failed', { error })\n return err(HaiReldbError.CONNECTION_FAILED, reldbM('reldb_closeFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n finally {\n currentProvider = null\n currentConfig = null\n currentJsonOps = null\n }\n },\n}\n"]}