code wiki / _hdl_build / nx_meet_store.nx
nx_meet_store.nx source
↩ module page · 76 lines · 3291 B
1// nx_meet_store.nx -- P4: durable MEMBER / APPLICATION store for the NISHI MEET PLATFORM (LIBRARY, no main), over
2// the sovereign seg-store (knowledge/store/meet-*) -- NO TSV, NO SQL (operator's emphatic directive). The home for
3// R7 curation states + the processor's records, so a membership survives a restart. Mirrors the proven
4// nx_known_issue_store pattern: records keyed `meet:<id>`, a `meet:ids` TAB index for the walk order, latest-value
5// wins (additive), idempotent. license_tier: ORIGINAL
6import "nx_syscalls.nx"
7import "nx_seg_store.nx"
8import "nx_meet_lib.nx"
9
10// next segment id under the meet prefix = 1 + current segment count (the ki_seg_next_p pattern, generic).
11func meet_seg_next() -> i64 {
12 let segs: *i64 = sys_mmap(8 * 260) as *i64
13 let nseg: i64 = ss_manifest("knowledge/store/meet-" as *u8, segs)
14 if nseg < 0 { return 1 }
15 return 1 + nseg
16}
17
18// 1 if `id` is a TAB-delimited token in idx[0..ilen).
19func meet_idx_has(idx: *u8, ilen: i64, id: *u8) -> i64 {
20 let il: i64 = mlen(id)
21 var i: i64 = 0
22 while i < ilen {
23 var le: i64 = i
24 while le < ilen { if idx[le] == (9 as u8) { break } le = le + 1 }
25 if (le - i) == il {
26 var k: i64 = 0; var eq: i64 = 1
27 while k < il { if idx[i+k] != id[k] { eq = 0; k = il } else { k = k + 1 } }
28 if eq == 1 { return 1 }
29 }
30 i = le + 1
31 }
32 return 0
33}
34
35// store `record` under key "meet:<id>" + keep the "meet:ids" TAB index (append id if new). 0 ok, <0 err. Idempotent.
36func meet_store_put(id: *u8, record: *u8) -> i64 {
37 let PFX: *u8 = "knowledge/store/meet-" as *u8
38 let key: *u8 = sys_mmap(256)
39 var ko: i64 = mcat(key, 0, "meet:" as *u8); ko = mcat(key, ko, id)
40
41 // read current index (if any) into a working buffer
42 let pq: *i64 = sys_mmap(16) as *i64
43 let lq: *i64 = sys_mmap(16) as *i64
44 let idx: *u8 = sys_mmap(262144); var ilen: i64 = 0
45 if ss_get(PFX, "meet:ids" as *u8, pq, lq) == 1 {
46 let src: *u8 = pq[0] as *u8; let sl: i64 = lq[0]
47 var c: i64 = 0; while c < sl { idx[c] = src[c]; c = c + 1 } ilen = sl
48 }
49 // append "<id>\t" only if absent (idempotent index)
50 if meet_idx_has(idx, ilen, id) == 0 {
51 let il: i64 = mlen(id); var c: i64 = 0
52 while c < il { idx[ilen] = id[c]; ilen = ilen + 1; c = c + 1 }
53 idx[ilen] = 9 as u8; ilen = ilen + 1
54 }
55 // commit the updated index + the record in one segment
56 let w: *i64 = ss_begin()
57 ss_add(w, 1, "meet:ids" as *u8, idx, ilen)
58 ss_add(w, 1, key, record, mlen(record))
59 let segid: i64 = meet_seg_next()
60 return ss_commit(PFX, w, segid)
61}
62
63// latest record for `id` -> ptrout[0]/lenout[0]. 1 found, 0 tombstoned, -1 absent.
64func meet_store_get(id: *u8, ptrout: *i64, lenout: *i64) -> i64 {
65 let key: *u8 = sys_mmap(256)
66 var ko: i64 = mcat(key, 0, "meet:" as *u8); ko = mcat(key, ko, id)
67 return ss_get("knowledge/store/meet-" as *u8, key, ptrout, lenout)
68}
69
70// 1 if `id` is present in the meet:ids index, else 0.
71func meet_store_indexed(id: *u8) -> i64 {
72 let pq: *i64 = sys_mmap(16) as *i64
73 let lq: *i64 = sys_mmap(16) as *i64
74 if ss_get("knowledge/store/meet-" as *u8, "meet:ids" as *u8, pq, lq) != 1 { return 0 }
75 return meet_idx_has(pq[0] as *u8, lq[0], id)
76}