import type { PgQueryFn } from "./pg-query.js"; /** 录制的方言。`mysql` = MySQL 协议(TiDB / InnoDB 同腿),`pg` = PostgreSQL。 */ export type SchemaDialect = "mysql" | "pg"; /** advisory lock 语句 —— 与 schema 无关,录制时跳过(但要答成功,否则 ensure* 走降级告警路径)。 */ export declare const LOCK_RE: RegExp; /** * **「一个新库对 ensure 探针怎么答」的唯一属主**(合并复审 车HB 后收口:此前生成器录制器、`test/ensure-schema.test.ts` * 的假池、`test/schema-baseline-generated.test.ts` ③c 的假驱动各抄一份,S-287 加了索引探针 + PG 锁改 `got === true` * 之后三份各漂一处 —— 假池答零行诱发 68 条 ALTER、③c 答 `got: 1` 让 PG 锁永远拿不到)。 * 返回 `undefined` = 不是探针,由调用方录制 / 执行;三条例外的理由见上面三条正则的注。 */ export declare function answerEnsureProbe(text: string): { rows: Record[]; } | undefined; /** 基线内容:建表/建索引/建扩展 + 种子行。其余一律视为**增量 seam**(违反 SCHEMA POLICY)。 */ /** * 一条 `ensure*` 腿真正需要的三个句柄面。**录制**驱动(基线生成,下面的 {@link recorder})与**真库**驱动 * (`scripts/db-lane-warm.ts` 的按车分库暖库)实现同一组签名 ⇒ {@link MYSQL_LEGS} / {@link PG_LEGS} 是这 * 两条用途的**单源**:加一条 boot ensure 腿只改那两个数组一处,基线生成与车道库暖库同时跟上。 * * 为什么必须单源(S-285/S-256/S-343 真案):暖库此前手抄了「中央两条」(`ensureSchema`/`ensurePgSchema`), * 其余 per-store 腿(现值 mysql 10 / pg 11)在**新建的**车道库上从没被建过 ⇒ 新车道首跑几十格红,而发车机那只老库因为历史上 * 被跑过一次就有表,于是这个缺口在老库上**恒绿**。两张手抄清单迟早分叉,正是本仓反复吃的亏。 */ export interface EnsureDriver { /** mysql2 Pool 形(`getConnection()` + `query`)。 */ readonly mysqlPool: unknown; /** node-pg Pool 形(`connect()` + `query`)。 */ readonly pgPool: unknown; /** 裸 {@link PgQueryFn} 形(per-store 的 PG ensure 直接收这个)。 */ readonly pgQuery: PgQueryFn; } /** * 一条 `ensure*` 腿。`name` 不是装饰:`test/schema-baseline-generated.test.ts` 判据 ③b 拿它与 * `src/boot/stores.ts` 里真被 await 的 ensure 名对账,抓"boot 会建、录制没录"的漏族(usage_window * 就是这么漏掉一整张表的 —— 那种漏在两条方言上**同时**发生,判据 ④ 的方言对拍完美对称 ⇒ 永不报警)。 * ⇒ 遍历与自报清单必须同一份数组,否则清单会自己腐掉,对账就成了自说自话。 * * 第三个消费方(S-285/S-256/S-343):`scripts/db-lane-warm.ts` 拿**同一份数组**对真库跑一遍 ⇒ 按车分库的 * 新库与生产 boot 建出同一套表。判据 ③c 钉住「warm 跑过的腿名 == 本清单」,任何人把它抄成第二份就当场红。 */ export interface EnsureLeg { readonly name: string; readonly run: (d: EnsureDriver) => Promise; } export declare const MYSQL_LEGS: readonly EnsureLeg[]; export declare const PG_LEGS: readonly EnsureLeg[]; /** 生成器自报的驱动清单(判据 ③b 的对账一侧)。与上面两个数组同源 ⇒ 加腿不改这里就不会漏报。 */ export declare const DRIVEN_ENSURES: { readonly mysql: readonly string[]; readonly pg: readonly string[]; }; /** 跑一遍一条方言的真 `ensure*` 全腿,返回**录制到的语句流**(顺序即执行顺序)。纯内存,不碰数据库。 */ export declare function recordEnsureStatements(dialect: SchemaDialect): Promise; //# sourceMappingURL=schema-ensure-legs.d.ts.map