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}