db.rowmap
since: std-0.5 stability: experimental
运行时行→struct 绑定面(P5-E;§12.5)
════════════════════════════════════════════════════════════════════
D-P5-1 设计偏差(登记;§8.4 语言决策裁定的不可达承诺):
设计稿 §12.5 承诺"comptime 行映射,列缺失/类型不符编译期报
(负例锚 r7d_db_rowmap.neg.ct)"——§8.4 明文禁止泛型反射(类型产出
函数预留 v2),该承诺在现行语言下不可达。本文件落运行时绑定:
列缺失/类型不符 = 运行时 Err 面(RmVal.kind 1/2;负例锚
tests/db/rowmap/ 按运行时 Err 语义断言——锚语义自本波起从"编译期报"
改"运行时 Err",COVERAGE 口径随 Task 6 同步)。@derive(DbRow) 编译器
插件(编译器已知 derive 集扩展)= 列编译泳道志向;落地后本文件的
OID 表/列名匹配面即其运行时回落(v2 演进位,API 保持)。
════════════════════════════════════════════════════════════════════
═══ API 面(v1 诚实形)═══
rm_col(rows, name) → 列名→下标(缺失 → -1,经 RowDescription 查找);
rm_i64/rm_f64/rm_bool/rm_str(rows, row, name) → RmVal(struct 通道):
kind 0 ok / 1 列缺失(noent)/ 2 类型不符(声明 OID 与访问器族违)/
3 NULL(调用方经 wrapper 映射 Option:kind 3 → None,否则 Some)/
4 行越界 / 5 值域坏(文本解析溢出/非数值形态)。
正向绑定演示(结构体字面量显式字段装配)= tests/db/rowmap(r7d 正例钉)。
═══ 类型分派表(声明 OID;v1 子集 = 基本面常型)═══
bool 16 / int8 20 / int2 21 / int4 23 / text 25 / float4 700 /
float8 701 / varchar 1043。整族访问器收 {20,21,23};文本族收
{25,1043};浮族收 {700,701};布尔收 {16}。族外 OID → kind 2
(fail-closed;新常型随消费面扩表)。
═══ 依赖与发射面纪律(divergences (f)-(i);全镜像 pg.ct 族)═══
单子扩展 db.pg(PgRows getter 面消费;(h) 跨模块数值载荷禁
Result ⇒ RmVal struct 通道,P5-A 裁定同源;Err-Str 载荷虽绿,统一
struct 通道口径)。NULL → kind 3 显式面,无隐式零值(§12.5)。
文本解码 = pg ASCII 表切片口径(utf8_enc 解释器坏,pg.ct 头注③
登记;非 ASCII 格 fail-closed 空串)。i64 解析乘 10 前哨兵界门;
f64 解析镜像 json jf64(尾数 ≤17 有效位 + 升降幂逐次界门,C10)。
inline test 不落本文件;行为面 tests/db/rowmap。
pub struct
struct RmVal
| Field | Type |
|---|---|
var ok |
I64 |
var kind |
I64 |
var v |
I64 |
var d |
F64 |
var s |
Str |
var oid |
I64 |
var col |
I64 |
struct PgRecv
| Field | Type |
|---|---|
var rc |
I64 |
var err |
I64 |
var next |
I64 |
var mtype |
I32 |
var body |
List[I32] |
struct PgErrData
| Field | Type |
|---|---|
var ok |
I64 |
var sev |
Str |
var code |
Str |
var msg |
Str |
struct PgRows
| Field | Type |
|---|---|
var rc |
I64 |
var err |
I64 |
var nrows |
I64 |
var ncols |
I64 |
var tag |
Str |
var cols |
List[Str] |
var oids |
List[I32] |
var cells |
List[Str] |
var nulls |
List[I32] |
var cbytes |
List[I32] |
var coffs |
List[I32] |
var esev |
Str |
var ecode |
Str |
var emsg |
Str |
var next |
I64 |
var status |
I64 |
pub fn
| Signature | Returns | Description |
|---|---|---|
rm_query(frames: List[Str], cur: I64, sql: Str) |
PgRows |
— |
rm_rc(r: PgRows) |
I64 |
— |
rm_nrows(r: PgRows) |
I64 |
— |
rm_ncols(r: PgRows) |
I64 |
— |
rm_colname(r: PgRows, i: I64) |
Str |
— |
rm_tag(r: PgRows) |
Str |
— |
rm_oid_name(oid: I64) |
Str |
类型 OID → 名(v1 子集;表外 → "") |
rm_is_bool_oid(oid: I64) |
I64 |
— |
rm_is_int_oid(oid: I64) |
I64 |
— |
rm_is_text_oid(oid: I64) |
I64 |
— |
rm_is_float_oid(oid: I64) |
I64 |
— |
rm_col(r: PgRows, name: Str) |
I64 |
— |
rm_ok(x: RmVal) |
I64 |
— |
rm_kind(x: RmVal) |
I64 |
0 ok / 1 noent / 2 type / 3 null / 4 row-oob / 5 val-domain |
rm_val(x: RmVal) |
I64 |
— |
rm_f64v(x: RmVal) |
F64 |
— |
rm_strv(x: RmVal) |
Str |
— |
rm_oid(x: RmVal) |
I64 |
— |
rm_coli(x: RmVal) |
I64 |
— |
rm_i64(r: PgRows, row: I64, name: Str) |
RmVal |
— |
rm_f64(r: PgRows, row: I64, name: Str) |
RmVal |
— |
rm_bool(r: PgRows, row: I64, name: Str) |
RmVal |
— |
rm_str(r: PgRows, row: I64, name: Str) |
RmVal |
— |
pg_frame_max() |
I64 |
— |
pg_err_frame() |
I64 |
— |
pg_err_proto() |
I64 |
— |
pg_err_eof() |
I64 |
— |
pg_err_response() |
I64 |
— |
pg_hex_decode(s: Str) |
List[I32] |
— |
pg_recv_frame_script(frames: List[Str], cur: I64) |
PgRecv |
— |
pg_ready_status(body: List[I32]) |
I64 |
— |
pg_tag(body: List[I32]) |
Str |
— |
pg_err_data(body: List[I32]) |
PgErrData |
— |
pgr_rc(r: PgRows) |
I64 |
— |
pgr_rows(r: PgRows) |
I64 |
— |
pgr_cols(r: PgRows) |
I64 |
— |
pgr_tag(r: PgRows) |
Str |
— |
pgr_colname(r: PgRows, i: I64) |
Str |
— |
pgr_oid(r: PgRows, i: I64) |
I64 |
— |
pgr_isnull(r: PgRows, row: I64, col: I64) |
I64 |
— |
pgr_cell(r: PgRows, row: I64, col: I64) |
Str |
— |
pg_query_script(frames: List[Str], cur: I64, sql: Str) |
PgRows |
— |
sha256_hex(msg: Str) |
Str |
— |
sha1_hex(msg: Str) |
Str |
— |
sha256_bytes(msg: List[I32]) |
List[I32] |
— |
hmac_sha256(key: List[I32], msg: List[I32]) |
List[I32] |
— |
bytes_to_hex(b: List[I32]) |
Str |
— |
bytes_from_hex(s: Str) |
List[I32] |
— |