Skip to main content

Crate dtmrs_store

Crate dtmrs_store 

Source
Expand description

存储层。TC 本身无状态,所有状态都在这里 —— 所以 TC 可以多实例、可以随时重启。

§一套 SQL 同时跑 sqlite / postgres / mysql

sqlx::Any + dtmrs_core::dialect 的模板渲染,而不是抽 Store trait 写三份实现。方言差异(占位符、冲突忽略、列类型、索引写法)全在 dialect 那层, 各家实测出来的坑也记在那个文件头,这里只遵守它的两条写法约定:

  1. 模板里统一写 ?,由 Backend::q 渲染成各后端能吃的语句 (非 MySQL 转成 $1..$n,MySQL 原样保留)
  2. 模板的字符串字面量里不能出现 ? —— 会被当成占位符

顺带一条只有 sqlite 有的老坑:它把 $4 当命名参数,所以同一个 $N 不能 复用。q() 逐个 ? 顺序编号,天然不会复用。

时间统一用 unix 秒(i64) 存,不用数据库的 datetime 类型 —— 跨库的时间类型映射是反复踩坑的地方,整数没有这个问题。 列类型用 BIGINT:postgres 的 INTEGER 只有 4 字节,装不下时间戳。

Structs§

BranchRow
GlobalRow
SqlStore
Store
存储层的统一入口。按 URL 前缀自动选后端:
TokenRow
访问令牌的展示信息。不含明文 —— 明文只在生成那一刻返回一次

Enums§

Backend
支持的后端
SubmitOutcome
Store::submit_prepared 的结果。

Constants§

BIG
payload 列的字符上限(trans_global.payload
MID
url / reason 一类中等长度列的字符上限

Functions§

hash_token
令牌的哈希。存哈希不存明文:库被看到也拿不到能用的凭据。
is_redis_url
这个 URL 是不是要走 Redis
now

Type Aliases§

Result
StoreError
存储层的错误。