mirror of
https://gitee.com/pnoker/iot-dc3.git
synced 2026-09-19 10:11:36 +08:00
R2c of docs/design/storage-abstraction.md §3. dc3-db-tck runs one set of mapper-level assertions against both engines with the real mapper XML — the databaseIdProvider routing is part of what gets certified, not just the SQL: the fenced latest-value upsert's three-level tiebreak (fencing token, then time, then sequence, then message id), the state upsert + same-transaction re-select shape, the three-step expired-lease claim (lock-and-read FOR UPDATE SKIP LOCKED, flip offline, derive the post-update view), the lease upserts' row-local increments (token moves only on ownership change), the row-level revision triggers (insert and meaningful update bump, trivial update does not), and the tool-catalog query's encoded-JSON double-hop. Harness notes worth keeping: one SqlSessionFactory per database mirrors the production @DS wiring (state/latest/leases/catalog span four databases with unqualified table names); the mapper XML loads through XMLMapperBuilder with the affectData mybatis-plus DTD extension stripped; postgres registers the timestamptz type handler. Both harnesses learned to distrust podman: log-following never fires, so mysql waits on the listening TCP port and postgres polls a real JDBC handshake (the port opens during initdb's local-only phase and closes again for the restart). The postgres harness mounts seed files 01..07 individually — 00's age/pgvector extensions exist only in the production base image — with 05 trimmed at runtime to the dc3_point_latest projection (the hypertable half needs the base image's TimescaleDB function set; the dialect contract doesn't touch it). The catalog fixture plants its api row through a parameterized insert: the escaped-JSON value must not travel through SQL text (MySQL's default backslash escapes eat the \" the value depends on) nor bind uniformly (PG rejects varchar->json, MySQL rejects the binary Types.OTHER binding) — the fixture branches on the engine. Selection guide published at docs/db-dialects.md (dialect matrix, swap procedure, the semantic decisions the suite locks); the storage design's status header moves to Implemented with an R1/R2 closeout note. Gates: db-tck 16/16 (8 postgres + 8 mysql), data/auth/manager suites green (274 in data), e2e 26/26, full-repo compile green.