code wiki / (root) / nx_box_lib.nx

nx_box_lib.nx source

↩ module page · 104 lines · 3939 B

1// nx_box_lib.nx -- Nishi Box (F503): matter-scoped LEGAL DMS on the immutable CID plane. 2// Adds the LEGAL layer ON TOP of the existing /office doc suite (nx_docx/xlsx/pptx storage): 3// matter-scoping, privilege/work-product tags, PRIVILEGE LOG generation (e-discovery), and 4// BATES numbering. Versioned by construction (CID plane). DRY: reuses nx_matter_lib helpers 5// (mt_field/mt_streq/mt_catcopy + reg_*/canon_encode). LIB (no main). license_tier: ORIGINAL 6 7import "nx_matter_lib.nx" 8const K_MAGIC_100000: i64 = 100000 9const K_MAGIC_2048: i64 = 2048 10const K_MAGIC_1048576: i64 = 1048576 11 12// Bates: "<PREFIX>-000001" (zero-padded 6 digits, per-matter sequential). 13func box_bates(prefix: *u8, seq: i64, out: *u8) -> i64 { 14 var o: i64 = mt_catcopy(out, 0, prefix) 15 out[o] = 45 as u8 16 o = o + 1 17 var d: i64 = K_MAGIC_100000 18 while d >= 1 { 19 out[o] = (48 + ((seq / d) % 10)) as u8 20 o = o + 1 21 d = d / 10 22 } 23 out[o] = 0 as u8 24 return o 25} 26 27// put a document scoped to a matter, with privilege tag + Bates. Key = "<matter>:<docid>". 28func box_doc_put(prefix: *u8, matter: *u8, docid: *u8, title: *u8, cid: *u8, priv: *u8, bates: *u8) -> i64 { 29 let did: *u8 = sys_mmap(128) 30 var o: i64 = mt_catcopy(did, 0, matter) 31 did[o] = 58 as u8 32 o = o + 1 33 o = mt_catcopy(did, o, docid) 34 did[o] = 0 as u8 35 let k: *i64 = sys_mmap(8 * 5) as *i64 36 let v: *i64 = sys_mmap(8 * 5) as *i64 37 k[0] = ("matter" as *u8) as i64 38 v[0] = matter as i64 39 k[1] = ("title" as *u8) as i64 40 v[1] = title as i64 41 k[2] = ("cid" as *u8) as i64 42 v[2] = cid as i64 43 k[3] = ("privilege" as *u8) as i64 44 v[3] = priv as i64 45 k[4] = ("bates" as *u8) as i64 46 v[4] = bates as i64 47 let rec: *u8 = sys_mmap(K_MAGIC_2048) 48 let rl: i64 = canon_encode(k, v, 5, rec) 49 return reg_put(prefix, "doc:" as *u8, "doc:__idx__" as *u8, did, rec, rl) 50} 51 52// scan a matter's documents: returns total; priv_out[0]=privileged count; batesbuf gets the 53// PRIVILEGE LOG (newline-sep Bates numbers of privileged docs = the e-discovery deliverable). 54func box_matter_scan(prefix: *u8, matter: *u8, priv_out: *i64, batesbuf: *u8) -> i64 { 55 let idx: *u8 = sys_mmap(K_MAGIC_1048576) 56 let ilen: i64 = reg_index(prefix, "doc:__idx__" as *u8, idx, K_MAGIC_1048576) 57 let mp: *u8 = sys_mmap(128) 58 var mpl: i64 = mt_catcopy(mp, 0, matter) 59 mp[mpl] = 58 as u8 60 mpl = mpl + 1 61 mp[mpl] = 0 as u8 62 let idb: *u8 = sys_mmap(256) 63 let po: *i64 = sys_mmap(16) as *i64 64 let lo: *i64 = sys_mmap(16) as *i64 65 let pf: *u8 = sys_mmap(128) 66 var total: i64 = 0 67 var npriv: i64 = 0 68 var bo: i64 = 0 69 var ls: i64 = 0 70 var i: i64 = 0 71 while i <= ilen { 72 var eol: i64 = 0 73 if i == ilen { eol = 1 } 74 if i < ilen { if idx[i] == 10 as u8 { eol = 1 } } 75 if eol == 1 { 76 if i > ls { 77 var c: i64 = 0 78 while ls + c < i { idb[c] = idx[ls + c]; c = c + 1 } 79 idb[c] = 0 as u8 80 var mtch: i64 = 1 81 var x: i64 = 0 82 while mp[x] != (0 as u8) { if idb[x] != mp[x] { mtch = 0 } x = x + 1 } 83 if mtch == 1 { 84 if reg_get(prefix, "doc:" as *u8, idb, po, lo) == 1 { 85 total = total + 1 86 mt_field(po[0] as *u8, lo[0], "privilege" as *u8, 9, pf) 87 if mt_streq(pf, "yes" as *u8) == 1 { 88 npriv = npriv + 1 89 mt_field(po[0] as *u8, lo[0], "bates" as *u8, 5, pf) 90 bo = mt_catcopy(batesbuf, bo, pf) 91 batesbuf[bo] = 10 as u8 92 bo = bo + 1 93 } 94 } 95 } 96 } 97 ls = i + 1 98 } 99 i = i + 1 100 } 101 batesbuf[bo] = 0 as u8 102 priv_out[0] = npriv 103 return total 104}