code wiki / _hdl_build / nx_docportal_ingest.nx

nx_docportal_ingest.nx source

↩ module page · 46 lines · 2558 B

1// nx_docportal_ingest.nx -- CLI: UPLOAD one document file into a domain's public|private shard (the operator's 2// "upload documents" entrypoint). Composes nx_docportal_lib: writes the raw bytes content-addressed into the 3// sovereign seg_store and, for a PUBLIC doc, emits the derived BM25 search line so it is findable on 4// <domain>/search. A PRIVATE doc lands in the client vault only. 5// nx_docportal_ingest <domain> <public|private> <doc_path> 6// license_tier: ORIGINAL 7import "nx_docportal_lib.nx" 8 9func dpc_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 10func dpc_num(v: i64) -> i64 { 11 let bb: *u8 = sys_mmap(28); var m: i64 = v 12 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) } 13 let t: *u8 = sys_mmap(28); var k: i64 = 0 14 if m == 0 { t[0] = 48 as u8; k = 1 } 15 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 16 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0 17} 18func dpc_streq(a: *u8, b: *u8) -> i64 { var i: i64 = 0; while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 } if b[i] != (0 as u8) { return 0 } return 1 } 19 20func main(argc: i64, argv: *i64) -> i64 { 21 if argc < 4 { 22 dpc_puts("usage: nx_docportal_ingest <domain> <public|private> <doc_path>\n" as *u8) 23 sys_exit(2); return 2 24 } 25 let domain: *u8 = argv[1] as *u8 26 let vstr: *u8 = argv[2] as *u8 27 let path: *u8 = argv[3] as *u8 28 var vis: i64 = DP_VIS_PUBLIC 29 if dpc_streq(vstr, "private" as *u8) == 1 { vis = DP_VIS_PRIVATE } 30 31 let szp: *i64 = sys_mmap(16) as *i64 32 let buf: *u8 = sys_read_file(path, szp) 33 if (buf as i64) == 0 { dpc_puts("UPLOAD-FAIL: cannot read document file\n" as *u8); sys_exit(1); return 1 } 34 let n: i64 = szp[0] 35 if n <= 0 { dpc_puts("UPLOAD-FAIL: empty document\n" as *u8); sys_exit(1); return 1 } 36 37 let cidp: *i64 = sys_mmap(16) as *i64 38 let rc: i64 = dp_ingest(domain, vis, buf, n, cidp) 39 if rc != 0 { dpc_puts("UPLOAD-FAIL: ingest rc="); dpc_num(rc); dpc_puts("\n" as *u8); sys_exit(1); return 1 } 40 41 dpc_puts("UPLOADED domain="); dpc_puts(domain); dpc_puts(" visibility="); dpc_puts(vstr) 42 dpc_puts(" cid="); dpc_num(cidp[0]); dpc_puts(" bytes="); dpc_num(n); dpc_puts("\n" as *u8) 43 if vis == DP_VIS_PUBLIC { dpc_puts(" -> PUBLIC: searchable on /search (sovereign seg_store .terms postings, no derived tsv)\n" as *u8) } 44 else { dpc_puts(" -> PRIVATE: client vault only (NOT in public search)\n" as *u8) } 45 sys_exit(0); return 0 46}