@@ -62,6 +62,21 @@ func init() {
62
62
})
63
63
}
64
64
65
+ type intStack struct {
66
+ s []int
67
+ }
68
+
69
+ func (s * intStack ) Push (n int ) { s .s = append (s .s , n ) }
70
+
71
+ func (s * intStack ) Pop () (int , bool ) {
72
+ if len (s .s ) == 0 {
73
+ return 0 , false
74
+ }
75
+ var n int
76
+ n , s .s = s .s [0 ], s .s [1 :]
77
+ return n , true
78
+ }
79
+
65
80
const sqlite3HeaderSize = 100
66
81
67
82
const (
@@ -106,12 +121,14 @@ var serialTypeMapper = scalar.Fn(func(s scalar.S) (scalar.S, error) {
106
121
return s , nil
107
122
})
108
123
124
+ type pageType int
125
+
109
126
const (
110
- pageTypePtrmap = 0x00
111
- pageTypeBTreeIndexInterior = 0x02
112
- pageTypeBTreeTableInterior = 0x05
113
- pageTypeBTreeIndexLeaf = 0x0a
114
- pageTypeBTreeTableLeaf = 0x0d
127
+ pageTypePtrmap pageType = 0x00
128
+ pageTypeBTreeIndexInterior = 0x02
129
+ pageTypeBTreeTableInterior = 0x05
130
+ pageTypeBTreeIndexLeaf = 0x0a
131
+ pageTypeBTreeTableLeaf = 0x0d
115
132
)
116
133
117
134
var pageTypeMap = scalar.UToSymStr {
@@ -276,7 +293,7 @@ func sqlite3DecodeTreePage(d *decode.D, h sqlite3Header, x int64, payLoadLen int
276
293
d .FieldStruct ("overflow_page" , func (d * decode.D ) {
277
294
br := d .FieldRawLen ("data" , firstPayLoadLen * 8 )
278
295
nextPage = d .FieldS32 ("next_page" )
279
- d .MustCopyBits (payLoadBB , br )
296
+ d .CopyBits (payLoadBB , br )
280
297
})
281
298
282
299
payLoadLenLeft := payLoadLen - firstPayLoadLen
@@ -287,7 +304,7 @@ func sqlite3DecodeTreePage(d *decode.D, h sqlite3Header, x int64, payLoadLen int
287
304
overflowSize := mathextra .MinInt64 (h .pageSize - 4 , payLoadLenLeft )
288
305
br := d .FieldRawLen ("data" , overflowSize * 8 )
289
306
payLoadLenLeft -= overflowSize
290
- d .MustCopyBits (payLoadBB , br )
307
+ d .CopyBits (payLoadBB , br )
291
308
})
292
309
}
293
310
})
@@ -299,6 +316,14 @@ func sqlite3DecodeTreePage(d *decode.D, h sqlite3Header, x int64, payLoadLen int
299
316
}
300
317
}
301
318
319
+ func sqlite3SeekPage (d * decode.D , h sqlite3Header , i int ) {
320
+ pageOffset := h .pageSize * int64 (i )
321
+ if i == 0 {
322
+ pageOffset += sqlite3HeaderSize
323
+ }
324
+ d .SeekAbs (pageOffset * 8 )
325
+ }
326
+
302
327
func sqlite3Decode (d * decode.D , in interface {}) interface {} {
303
328
var h sqlite3Header
304
329
@@ -340,6 +365,49 @@ func sqlite3Decode(d *decode.D, in interface{}) interface{} {
340
365
}
341
366
})
342
367
368
+ // pageTypes := map[int]pageType{}
369
+ // pageVisitStack := &intStack{}
370
+ // pageVisitStack.Push(0)
371
+
372
+ // for {
373
+ // i, ok := pageVisitStack.Pop()
374
+ // if !ok {
375
+ // break
376
+ // }
377
+ // if _, ok := pageTypes[i]; ok {
378
+ // d.Fatalf("page %d already visited", i)
379
+ // }
380
+
381
+ // sqlite3SeekPage(d, h, i)
382
+ // typ := d.U8()
383
+
384
+ // switch typ {
385
+ // case pageTypeBTreeIndexInterior,
386
+ // pageTypeBTreeTableInterior:
387
+
388
+ // d.U16() // start_free_blocks
389
+ // d.U16() // cell_start
390
+ // d.U8() // cell_fragments
391
+ // rightPointer := d.U32()
392
+
393
+ // pageCells := d.U16()
394
+ // for i := uint64(0); i < pageCells; i++ {
395
+
396
+ // }
397
+
398
+ // switch typ {
399
+ // case pageTypeBTreeIndexInterior:
400
+
401
+ // }
402
+
403
+ // default:
404
+ // d.Fatalf("asd")
405
+ // }
406
+
407
+ // }
408
+
409
+ // return nil
410
+
343
411
d .FieldArray ("pages" , func (d * decode.D ) {
344
412
d .RangeSorted = false
345
413
@@ -348,13 +416,24 @@ func sqlite3Decode(d *decode.D, in interface{}) interface{} {
348
416
d .FieldValueStr ("type" , "page0_index_fill" )
349
417
})
350
418
419
+ // for {
420
+ // i, ok := pageStack.Pop()
421
+ // if !ok {
422
+ // break
423
+ // }
424
+ // if _, ok := pageSeen[i]; ok {
425
+ // d.Fatalf("page %d already visited", i)
426
+ // }
427
+ // pageSeen[i] = struct{}{}
428
+
351
429
for i := 0 ; i < h .databaseSizePages ; i ++ {
352
430
pageOffset := h .pageSize * int64 (i )
353
431
d .SeekAbs (pageOffset * 8 )
354
432
// skip header for first page
355
433
if i == 0 {
356
434
d .SeekRel (sqlite3HeaderSize * 8 )
357
435
}
436
+ sqlite3SeekPage (d , h , i )
358
437
359
438
d .FieldStruct ("page" , func (d * decode.D ) {
360
439
typ := d .FieldU8 ("type" , pageTypeMap )
0 commit comments