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}