code wiki / _hdl_build / nx_langintel_gh_fetch.nx

nx_langintel_gh_fetch.nx source

↩ module page · 96 lines · 3869 B

1// nx_langintel_gh_fetch.nx v2 -- LangIntel FETCH stage, FULL-SCALE PAGINATION (no sampling): loops 2// GitHub pages (base_url + &page=N) forking nx_https_get each, accumulates every page body (sliced from 3// the first '['), and STOPS when a response has no Link rel="next". Writes the whole concatenation to a 4// .raw (the anchor-based ingest parser scans across page seams -- concatenated arrays are fine). 5// Composes nx_https_get via dep_run_capture. ORACLE/bench-only (F616). Rule 26. 6// argv: <base-url-with-per_page-but-no-page> <out-raw-path> expect_exit: 0 license_tier: ORACLE-FETCH 7import "nx_ingest_base.nx" 8import "nx_deploy_lib.nx" 9import "nx_syscalls.nx" 10 11const GF_STDERR: i64 = 2 12const GF_CAP: i64 = 16777216 13const GF_ACC: i64 = 16777216 14const GF_MODE: i64 = 420 15const GF_MAXPAGE: i64 = 60 16const GF_URLCAP: i64 = 2048 17const GF_ARGC_MIN: i64 = 3 18const GF_EXIT_USAGE: i64 = 2 19const GF_EXIT_IO: i64 = 1 20const GF_EXIT_RED: i64 = 3 21const GF_HTTPS_ELF: *u8 = "/volume1/homes/elderwesto/nishihost/nx_https_get.elf" as *u8 22const GF_TMP: *u8 = "/tmp/langintel_ghfetch.out" as *u8 23const GF_LBRACK: *u8 = "[" as *u8 24const GF_PAGEARG: *u8 = "&page=" as *u8 25const GF_NEXT: *u8 = "rel=\"next\"" as *u8 26 27func main(argc: i64, argv: *i64) -> i64 { 28 if argc < GF_ARGC_MIN { 29 ib_refuse("LANGINTEL-GH-FETCH" as *u8, "missing args <base-url> <out-raw-path>" as *u8, "seed a plan row: 1 TAB nx_langintel_gh_fetch TAB <github-api-url-with-per_page=100-no-page> TAB knowledge/fetched/<name>.raw" as *u8) 30 sys_exit(GF_EXIT_USAGE) 31 return GF_EXIT_USAGE 32 } 33 let base_url: *u8 = argv[1] as *u8 34 let out: *u8 = argv[2] as *u8 35 let acc: *u8 = sys_mmap(GF_ACC) 36 let buf: *u8 = sys_mmap(GF_CAP) 37 let urlb: *u8 = sys_mmap(GF_URLCAP) 38 let av: *i64 = sys_mmap(16) as *i64 39 var ao: i64 = 0 40 var page: i64 = 1 41 var pages: i64 = 0 42 var go: i64 = 1 43 while go == 1 { 44 if page > GF_MAXPAGE { go = 0 } 45 else { 46 var uo: i64 = ib_bput(urlb, 0, base_url) 47 uo = ib_bput(urlb, uo, GF_PAGEARG) 48 uo = ib_bputn(urlb, uo, page) 49 urlb[uo] = 0 as u8 50 av[0] = urlb as i64 51 let rc: i64 = dep_run_capture(GF_HTTPS_ELF, av, 1, GF_TMP) 52 let n: i64 = ib_read(GF_TMP, buf, GF_CAP) 53 if n <= 0 { go = 0 } 54 else { 55 let bs: i64 = ib_find(buf, n, GF_LBRACK, 0) 56 if bs < 0 { go = 0 } 57 else { 58 var j: i64 = bs 59 while j < n { if ao < GF_ACC - 2 { acc[ao] = buf[j]; ao = ao + 1 } j = j + 1 } 60 pages = pages + 1 61 let hasnext: i64 = ib_find(buf, bs, GF_NEXT, 0) 62 if hasnext < 0 { go = 0 } else { page = page + 1 } 63 } 64 } 65 } 66 } 67 if ao <= 0 { 68 ib_refuse("LANGINTEL-GH-FETCH" as *u8, "no data fetched across pages" as *u8, "check network + URL + X-RateLimit-Remaining; the sovereign fetch writes to /tmp" as *u8) 69 sys_exit(GF_EXIT_IO) 70 return GF_EXIT_IO 71 } 72 let fd: i64 = sys_openat_wr(out, GF_MODE) 73 if fd < 0 { 74 ib_refuse("LANGINTEL-GH-FETCH" as *u8, "cannot open out-raw for write" as *u8, "verify the out dir exists + is writable (knowledge/fetched/)" as *u8) 75 sys_exit(GF_EXIT_IO) 76 return GF_EXIT_IO 77 } 78 var w: i64 = 0 79 var gw: i64 = 1 80 while gw == 1 { 81 let base: i64 = acc as i64 82 let r: i64 = sys_write(fd, (base + w) as *u8, ao - w) 83 if r <= 0 { gw = 0 } else { w = w + r } 84 if w >= ao { gw = 0 } 85 } 86 sys_close(fd) 87 ib_werr("LANGINTEL-GH-FETCH OK verdict=GREEN pages=" as *u8) 88 ib_wn(GF_STDERR, pages) 89 ib_werr(" body_bytes=" as *u8) 90 ib_wn(GF_STDERR, w) 91 ib_werr(" out=" as *u8) 92 ib_werr(out) 93 ib_werr("\n" as *u8) 94 sys_exit(0) 95 return 0 96}