code wiki / _hdl_build / _sqlite_read_authored.nx

_sqlite_read_authored.nx source

↩ module page · 158 lines · 6336 B

1// AUTHORED BY THE NISHI BUILDER (nx_module_author_data sqlite-read template) -- ELDERMIG E1 rung 1. 2// Sovereign READ-ONLY SQLite reader: header check, table-btree walk (leaf 0x0D / interior 0x05), 3// sqlite_master record decode (type/name/rootpage), per-table row counts. Additive law: read-only. 4// HONEST LIMIT (raised hand for rung 2): local payload only -- overflow pages not followed yet; 5// fine for sqlite_master scans of Elder DBs; full row/column reads = rung 2. 6import "nx_syscalls.nx" 7func _sq_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 } 8func _sq_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 } 9func _sq_be16(p: *u8, off: i64) -> i64 { let a: i64=p[off]; let b: i64=p[off+1]; return (a<<8)|b } 10func _sq_be32(p: *u8, off: i64) -> i64 { let a: i64=p[off]; let b: i64=p[off+1]; let c: i64=p[off+2]; let d: i64=p[off+3]; return (((((a<<8)|b)<<8)|c)<<8)|d } 11func _sq_varint(p: *u8, off: i64, lenout: *i64) -> i64 { 12 var v: i64=0 13 var i: i64=0 14 while i<8 { 15 let b: i64=p[off+i] 16 if b<128 { v=(v<<7)|b; lenout[0]=i+1; return v } 17 v=(v<<7)|(b-128) 18 i=i+1 19 } 20 let b9: i64=p[off+8] 21 v=(v<<8)|b9 22 lenout[0]=9 23 return v 24} 25func _sq_stsize(st: i64) -> i64 { 26 if st==0 { return 0 } if st==1 { return 1 } if st==2 { return 2 } if st==3 { return 3 } 27 if st==4 { return 4 } if st==5 { return 6 } if st==6 { return 8 } if st==7 { return 8 } 28 if st==8 { return 0 } if st==9 { return 0 } 29 if st>=12 { let m: i64=st%2; if m==0 { return (st-12)/2 } return (st-13)/2 } 30 return 0 31} 32func _sq_page(db: *u8, ps: i64, pgno: i64) -> *u8 { let base: i64 = db as i64; return (base + (pgno-1)*ps) as *u8 } 33func _sq_rowcount(db: *u8, ps: i64, pgno: i64) -> i64 { 34 let pg: *u8 = _sq_page(db, ps, pgno) 35 var hdr: i64 = 0 36 if pgno==1 { hdr=100 } 37 let pt: i64 = pg[hdr] 38 let ncell: i64 = _sq_be16(pg, hdr+3) 39 if pt==13 { return ncell } 40 if pt==5 { 41 var tot: i64=0 42 var i: i64=0 43 while i<ncell { 44 let cp: i64 = _sq_be16(pg, hdr+12+2*i) 45 tot = tot + _sq_rowcount(db, ps, _sq_be32(pg, cp)) 46 i=i+1 47 } 48 tot = tot + _sq_rowcount(db, ps, _sq_be32(pg, hdr+8)) 49 return tot 50 } 51 return 0-1 52} 53func _sq_master(db: *u8, ps: i64, pgno: i64, names: *u8, npos: *i64, noff: *i64, roots: *i64, cnt: *i64) -> i64 { 54 let pg: *u8 = _sq_page(db, ps, pgno) 55 var hdr: i64=0 56 if pgno==1 { hdr=100 } 57 let pt: i64 = pg[hdr] 58 let ncell: i64 = _sq_be16(pg, hdr+3) 59 if pt==5 { 60 var ii: i64=0 61 while ii<ncell { 62 let cp: i64 = _sq_be16(pg, hdr+12+2*ii) 63 _sq_master(db, ps, _sq_be32(pg, cp), names, npos, noff, roots, cnt) 64 ii=ii+1 65 } 66 _sq_master(db, ps, _sq_be32(pg, hdr+8), names, npos, noff, roots, cnt) 67 return 0 68 } 69 if pt!=13 { return 0-1 } 70 var i2: i64=0 71 let lp: *i64 = sys_mmap(8) as *i64 72 while i2<ncell { 73 let cp2: i64 = _sq_be16(pg, hdr+8+2*i2) 74 var off: i64 = cp2 75 let payl: i64 = _sq_varint(pg, off, lp) 76 off = off + lp[0] 77 let rid: i64 = _sq_varint(pg, off, lp) 78 off = off + lp[0] 79 let rstart: i64 = off 80 let hlen: i64 = _sq_varint(pg, off, lp) 81 off = off + lp[0] 82 let st1: i64 = _sq_varint(pg, off, lp) 83 off = off + lp[0] 84 let st2: i64 = _sq_varint(pg, off, lp) 85 off = off + lp[0] 86 let st3: i64 = _sq_varint(pg, off, lp) 87 off = off + lp[0] 88 let st4: i64 = _sq_varint(pg, off, lp) 89 off = off + lp[0] 90 var c: i64 = rstart + hlen 91 let sz1: i64 = _sq_stsize(st1) 92 var istable: i64 = 0 93 if sz1==5 { if pg[c]==(116 as u8) { if pg[c+1]==(97 as u8) { if pg[c+2]==(98 as u8) { if pg[c+3]==(108 as u8) { if pg[c+4]==(101 as u8) { istable=1 } } } } } } 94 c = c + sz1 95 let sz2: i64 = _sq_stsize(st2) 96 if istable==1 { 97 let k: i64 = cnt[0] 98 noff[k] = npos[0] 99 var j: i64=0 100 while j<sz2 { names[npos[0]+j] = pg[c+j]; j=j+1 } 101 names[npos[0]+sz2] = 0 102 npos[0] = npos[0] + sz2 + 1 103 let sz3: i64 = _sq_stsize(st3) 104 var rp: i64 = 0 105 let c4: i64 = c + sz2 + sz3 106 if st4==9 { rp=1 } 107 if st4>=1 { if st4<=6 { 108 let n4: i64 = _sq_stsize(st4) 109 var j4: i64=0 110 while j4<n4 { let vb: i64 = pg[c4+j4]; rp=(rp<<8)|vb; j4=j4+1 } 111 } } 112 roots[k] = rp 113 cnt[0] = k+1 114 } 115 i2=i2+1 116 } 117 return 0 118} 119func main(argc: i64, argv: *i64) -> i64 { 120 var path: *u8 = "/mnt/c/Users/elder/elder-ai-platform/data-vault/wardrobe.db" as *u8 121 if argc>=2 { path = argv[1] as *u8 } 122 let lenp: *i64 = sys_mmap(8) as *i64 123 let db: *u8 = sys_read_file(path, lenp) 124 if lenp[0] < 512 { _sq_w(1, "SQLITE-GATE FAIL unreadable\n" as *u8); sys_exit(1); return 1 } 125 if _sq_be16(db,0)!=21329 { _sq_w(1, "SQLITE-GATE FAIL bad-magic\n" as *u8); sys_exit(1); return 1 } 126 if db[15]!=(0 as u8) { _sq_w(1, "SQLITE-GATE FAIL bad-magic-tail\n" as *u8); sys_exit(1); return 1 } 127 var ps: i64 = _sq_be16(db, 16) 128 if ps==1 { ps=65536 } 129 let names: *u8 = sys_mmap(65536) 130 let noff: *i64 = sys_mmap(8192) as *i64 131 let roots: *i64 = sys_mmap(8192) as *i64 132 let cnt: *i64 = sys_mmap(8) as *i64 133 let npos: *i64 = sys_mmap(8) as *i64 134 cnt[0]=0 135 npos[0]=0 136 _sq_master(db, ps, 1, names, npos, noff, roots, cnt) 137 var i: i64=0 138 while i<cnt[0] { 139 _sq_w(1, "TABLE " as *u8) 140 let nb: i64 = names as i64 141 _sq_w(1, (nb+noff[i]) as *u8) 142 _sq_w(1, "\n" as *u8) 143 i=i+1 144 } 145 _sq_w(1, "COUNT " as *u8); _sq_wn(1, cnt[0]); _sq_w(1, "\n" as *u8) 146 var i3: i64=0 147 while i3<cnt[0] { 148 _sq_w(1, "ROWS " as *u8) 149 let nb2: i64 = names as i64 150 _sq_w(1, (nb2+noff[i3]) as *u8) 151 _sq_w(1, " " as *u8) 152 _sq_wn(1, _sq_rowcount(db, ps, roots[i3])) 153 _sq_w(1, "\n" as *u8) 154 i3=i3+1 155 } 156 sys_exit(0) 157 return 0 158}