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}