code wiki / _hdl_build / nx_algo_registry_migrate.nx
nx_algo_registry_migrate.nx source
↩ module page · 117 lines · 5380 B
1// nx_algo_registry_migrate.nx -- migrate specs/algo_registry/<algo>/meta.json (the 3,282 JSON algorithm cards)
2// into ONE sovereign seg_store (knowledge/store/algo-registry-), key = algo name, value = meta.json bytes
3// (byte-faithful, content-addressed). The cards total ~1.4MB, so the writer is sized to hold them all in a
4// SINGLE segment -> one commit (no multi-commit segid collision). Self-verifies: re-opens the store, round-trips
5// a known card byte-for-byte + checks the count key. This is the "get the JSON onto the nishi ecosystem" win;
6// repointing the consumer (nx_bundle_gen) + retiring the derived JSON is the NEXT (gated) step.
7// expect_exit: 0 license_tier: ORIGINAL
8import "nx_seg_store.nx"
9import "nx_syscalls.nx"
10const AM_MAGIC_131072: i64 = 131072
11const AM_MAGIC_6291456: i64 = 6291456
12const AM_MAGIC_1024: i64 = 1024
13
14func am_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
15func am_putn(v: i64) -> i64 {
16 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 }
17 var m: i64 = v
18 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
19 let d: *u8 = sys_mmap(24); var k: i64 = 0
20 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
21 var j: i64 = k - 1
22 while j >= 0 { sys_write(1, ((d as i64)+j) as *u8, 1); j = j - 1 }
23 return 0
24}
25// decimal string of v into out (NUL-term); returns length
26func am_itoa(v: i64, out: *u8) -> i64 {
27 let t: *u8 = sys_mmap(28); var m: i64 = v; var k: i64 = 0
28 if m == 0 { t[0] = 48 as u8; k = 1 }
29 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
30 var i: i64 = 0
31 while i < k { out[i] = t[k - 1 - i]; i = i + 1 }
32 out[k] = 0 as u8; return k
33}
34func am_eq(a: *u8, an: i64, b: *u8, bn: i64) -> i64 {
35 if an != bn { return 0 }
36 var i: i64 = 0; while i < an { if a[i] != b[i] { return 0 } i = i + 1 }
37 return 1
38}
39// build "specs/algo_registry/<nm>/meta.json" into out
40func am_metapath(nm: *u8, out: *u8) -> i64 {
41 var o: i64 = 0
42 o = ss_cat(out, o, "specs/algo_registry/" as *u8)
43 o = ss_cat(out, o, nm)
44 o = ss_cat(out, o, "/meta.json" as *u8)
45 out[o] = 0 as u8; return o
46}
47
48const AM_PREFIX: *u8 = "knowledge/store/algo-registry-" as *u8
49
50func main() -> i64 {
51 am_puts("ALGO-REGISTRY MIGRATE: specs/algo_registry/*/meta.json -> seg_store (byte-faithful, name-keyed)\n" as *u8)
52 let fd: i64 = sys_openat_rd("specs/algo_registry" as *u8)
53 if fd < 0 { am_puts(" open algo_registry FAILED\n" as *u8); return 1 }
54 let dbuf: *u8 = sys_mmap(AM_MAGIC_131072)
55 let szp: *i64 = sys_mmap(16) as *i64
56 // writer sized to hold ALL cards in ONE segment (~1.4MB of cards -> 6MB cap)
57 let w: *i64 = sys_mmap(32) as *i64
58 let cap: i64 = AM_MAGIC_6291456
59 w[0] = sys_mmap(cap) as i64
60 w[1] = 0
61 w[2] = cap
62 var count: i64 = 0
63 var overflow: i64 = 0
64 var go: i64 = 1
65 while go == 1 {
66 let nb: i64 = sys_getdents64(fd, dbuf, AM_MAGIC_131072)
67 if nb <= 0 { go = 0 } else {
68 var off: i64 = 0
69 while off < nb {
70 let rec: *u8 = (dbuf as i64 + off) as *u8
71 let rl: i64 = dirent_reclen(rec)
72 if rl <= 0 { off = nb } else {
73 let nm: *u8 = dirent_name(rec)
74 var skip: i64 = 0
75 if nm[0] == (46 as u8) {
76 if nm[1] == (0 as u8) { skip = 1 }
77 if nm[1] == (46 as u8) { if nm[2] == (0 as u8) { skip = 1 } }
78 }
79 if skip == 0 {
80 let p: *u8 = sys_mmap(AM_MAGIC_1024)
81 am_metapath(nm, p)
82 let bytes: *u8 = ss_readall(p, szp)
83 let blen: i64 = szp[0]
84 if blen > 0 {
85 let rc: i64 = ss_add(w, 1, nm, bytes, blen)
86 if rc < 0 { overflow = overflow + 1 } else { count = count + 1 }
87 }
88 }
89 off = off + rl
90 }
91 }
92 }
93 }
94 sys_close(fd)
95 // store the count key, then commit the single segment
96 let cb: *u8 = sys_mmap(28)
97 let cl: i64 = am_itoa(count, cb)
98 ss_add(w, 1, "__count" as *u8, cb, cl)
99 ss_commit(AM_PREFIX, w, sys_now_ms())
100 am_puts(" migrated cards="); am_putn(count); am_puts(" overflow="); am_putn(overflow); am_puts("\n" as *u8)
101 // SELF-VERIFY: re-open, round-trip a known card byte-for-byte + count key present
102 let h: *i64 = ss_open(AM_PREFIX)
103 if (h as i64) == 0 { am_puts(" reopen FAILED\n" as *u8); return 1 }
104 let pp: *i64 = sys_mmap(16) as *i64
105 let ll: *i64 = sys_mmap(16) as *i64
106 var pass: i64 = 0
107 if ss_hget(h, "abs_diff_pair" as *u8, pp, ll) == 1 {
108 let p2: *u8 = sys_mmap(AM_MAGIC_1024); am_metapath("abs_diff_pair" as *u8, p2)
109 let orig: *u8 = ss_readall(p2, szp)
110 if am_eq(pp[0] as *u8, ll[0], orig, szp[0]) == 1 { pass = pass + 1 }
111 }
112 if ss_hget(h, "__count" as *u8, pp, ll) == 1 { pass = pass + 1 }
113 am_puts(" self-verify (abs_diff_pair byte-faithful + __count present) = "); am_putn(pass); am_puts("/2\n" as *u8)
114 if overflow == 0 { if pass == 2 { am_puts("ALGO-REGISTRY-MIGRATE: GREEN\n" as *u8); return 0 } }
115 am_puts("ALGO-REGISTRY-MIGRATE: RED\n" as *u8)
116 return 1
117}