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}