code wiki / _hdl_build / nx_library.nx

nx_library.nx source

↩ module page · 82 lines · 4134 B

1// nx_library.nx -- the SOVEREIGN NISHI LIBRARY: a content-addressed corpus of ingested external documents 2// (science-body papers/tables/pages) so we OWN the bytes and NEVER suffer link rot. Each document is stored 3// by its CID (nx_canon_cid via nx_asset_catalog -> dedup + a running index for free), with a metadata record 4// (source URL, title, fetch date, size) in a parallel seg_store. Retrieval is by CID, so it works forever even 5// after the external source disappears -- that IS the no-link-rot guarantee, by construction. 6// 7// Reuses (DRY): nx_asset_catalog (cat_ingest_cid = store-by-CID + dedup + index; cat_get; cat_count; cat_list) 8// + nx_seg_store + nx_canon_cid. Pairs with nx_ingest_foundation (each doc is also CID+ed25519-provenance+ 9// lineage-to-god). No main -- library. license_tier: ORIGINAL 10import "nx_syscalls.nx" 11import "nx_asset_catalog.nx" 12import "nx_seg_store.nx" 13import "nx_canon_cid.nx" 14import "nx_uxf_decode.nx" 15const K_MAGIC_4194304: i64 = 4194304 16const K_MAGIC_2048: i64 = 2048 17 18const LIB: *u8 = "knowledge/store/scilib-" 19const LIBMETA: *u8 = "knowledge/store/scilib-meta-" 20 21func lib_itoa(v: i64, dst: *u8) -> i64 { var m: i64=v; let t: *u8=sys_mmap(24); var k: i64=0; if m==0{t[0]=48 as u8;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{dst[i]=t[k-1-i];i=i+1} dst[k]=0 as u8; return k } 22 23func lib_read(path: *u8, buf: *u8, cap: i64) -> i64 { 24 let fd: i64 = sys_openat_rd(path) 25 if fd < 0 { return 0 } 26 var n: i64 = 0 27 var r: i64 = sys_read(fd, buf, cap - 1) 28 while r > 0 { n = n + r; if n >= cap - 1 { r = 0 } else { r = sys_read(fd, buf + n, cap - 1 - n) } } 29 sys_close(fd) 30 return n 31} 32 33// ingest a document from disk into the library. fills cidout. returns 1 NEW / 0 DUP / -1 error. 34func lib_ingest(raw_path: *u8, source: *u8, title: *u8, date: *u8, cidout: *u8) -> i64 { 35 let buf: *u8 = sys_mmap(K_MAGIC_4194304) 36 let n: i64 = lib_read(raw_path, buf, K_MAGIC_4194304) 37 if n <= 0 { return 0 - 1 } 38 let out2: *i64 = sys_mmap(8) as *i64 39 if cat_ingest_cid(LIB, buf, n, cidout, out2) != 0 { return 0 - 1 } 40 if out2[0] == CAT_NEW() { 41 let ns: *u8 = sys_mmap(24); lib_itoa(n, ns) 42 let keys: *i64 = sys_mmap(64) as *i64; let vals: *i64 = sys_mmap(64) as *i64 43 keys[0] = "source" as *u8 as i64; vals[0] = source as i64 44 keys[1] = "title" as *u8 as i64; vals[1] = title as i64 45 keys[2] = "date" as *u8 as i64; vals[2] = date as i64 46 keys[3] = "bytes" as *u8 as i64; vals[3] = ns as i64 47 let meta: *u8 = sys_mmap(K_MAGIC_2048); let ml: i64 = canon_encode(keys, vals, 4, meta) 48 let w: *i64 = ss_begin() 49 ss_add(w, 1, cidout, meta, ml) 50 ss_commit(LIBMETA, w, sys_now_ms()) 51 return 1 52 } 53 return 0 54} 55 56// retrieve a document's bytes by CID (no-link-rot access). 1 found / 0 / -1. 57func lib_get(cid: *u8, ptrout: *i64, lenout: *i64) -> i64 { return cat_get(LIB, cid, ptrout, lenout) } 58 59// number of documents in the library (the running index size). 60func lib_count() -> i64 { return cat_count(LIB) } 61 62// list the library's CIDs into out_cids (ptrs). returns count. 63func lib_list(out_cids: *i64, cap: i64) -> i64 { return cat_list(LIB, out_cids, cap) } 64 65// retrieve a document's metadata value by key (source/title/date/bytes). copies into out. 1/0. 66func lib_meta(cid: *u8, key: *u8, out: *u8, cap: i64) -> i64 { 67 let gp: *i64 = sys_mmap(8) as *i64; let gl: *i64 = sys_mmap(8) as *i64 68 if ss_get(LIBMETA, cid, gp, gl) != 1 { return 0 } 69 let dk: *i64 = sys_mmap(64) as *i64; let dv: *i64 = sys_mmap(64) as *i64 70 let nf: i64 = canon_decode(gp[0] as *u8, gl[0], dk, dv, 16) 71 if nf < 0 { return 0 } 72 var f: i64 = 0 73 while f < nf { 74 var i: i64 = 0; var eq: i64 = 1 75 let dkf: *u8 = dk[f] as *u8 76 while key[i] != (0 as u8) { if dkf[i] != key[i] { eq = 0 } i = i + 1 } 77 if dkf[i] != (0 as u8) { eq = 0 } 78 if eq == 1 { var z: i64 = 0; let vp: *u8 = dv[f] as *u8; while vp[z] != (0 as u8) { if z < cap-1 { out[z] = vp[z] } z = z + 1 } out[z] = 0 as u8; return 1 } 79 f = f + 1 80 } 81 return 0 82}