@@ -83,7 +83,7 @@ func (dec *Decoder) Close() error {
8383 dec .writeToHash (remainingBytes [:len (remainingBytes )- ChecksumSize ])
8484
8585 // Read page index.
86- if err := dec . decodePageIndex (remaining ); err != nil {
86+ if dec . pageIndex , err = DecodePageIndex (remaining , 0 , dec . header . MinTXID , dec . header . MaxTXID ); err != nil {
8787 return fmt .Errorf ("read page index: %w" , err )
8888 }
8989
@@ -115,42 +115,6 @@ func (dec *Decoder) Close() error {
115115 return nil
116116}
117117
118- func (dec * Decoder ) decodePageIndex (r io.ByteReader ) error {
119- pageIndex := make (map [uint32 ]PageIndexElem )
120-
121- for {
122- pgno , err := binary .ReadUvarint (r )
123- if err != nil {
124- return fmt .Errorf ("read page index pgno: %w" , err )
125- } else if pgno == 0 {
126- break // End when we hit the end marker.
127- }
128-
129- offset , err := binary .ReadUvarint (r )
130- if err != nil {
131- return fmt .Errorf ("read page index offset: %w" , err )
132- }
133- size , err := binary .ReadUvarint (r )
134- if err != nil {
135- return fmt .Errorf ("read page index size: %w" , err )
136- }
137-
138- pageIndex [uint32 (pgno )] = PageIndexElem {
139- Offset : int64 (offset ),
140- Size : int64 (size ),
141- }
142- }
143-
144- // Read size of page index.
145- var size uint64
146- if err := binary .Read (r .(io.Reader ), binary .BigEndian , & size ); err != nil {
147- return fmt .Errorf ("read page index size: %w" , err )
148- }
149-
150- dec .pageIndex = pageIndex
151- return nil
152- }
153-
154118// DecodeHeader reads the LTX file header frame and stores it internally.
155119// Call Header() to retrieve the header after this is successfully called.
156120func (dec * Decoder ) DecodeHeader () error {
@@ -341,3 +305,42 @@ func DecodePageData(b []byte) (hdr PageHeader, data []byte, err error) {
341305 data , err = io .ReadAll (zr )
342306 return hdr , data , err
343307}
308+
309+ // DecodePageIndex decodes the page index from r.
310+ func DecodePageIndex (r io.ByteReader , level int , minTXID , maxTXID TXID ) (map [uint32 ]PageIndexElem , error ) {
311+ pageIndex := make (map [uint32 ]PageIndexElem )
312+
313+ for {
314+ pgno , err := binary .ReadUvarint (r )
315+ if err != nil {
316+ return nil , fmt .Errorf ("read page index pgno: %w" , err )
317+ } else if pgno == 0 {
318+ break // End when we hit the end marker.
319+ }
320+
321+ offset , err := binary .ReadUvarint (r )
322+ if err != nil {
323+ return nil , fmt .Errorf ("read page index offset: %w" , err )
324+ }
325+ size , err := binary .ReadUvarint (r )
326+ if err != nil {
327+ return nil , fmt .Errorf ("read page index size: %w" , err )
328+ }
329+
330+ pageIndex [uint32 (pgno )] = PageIndexElem {
331+ Level : level ,
332+ MinTXID : minTXID ,
333+ MaxTXID : maxTXID ,
334+ Offset : int64 (offset ),
335+ Size : int64 (size ),
336+ }
337+ }
338+
339+ // Read size of page index.
340+ var size uint64
341+ if err := binary .Read (r .(io.Reader ), binary .BigEndian , & size ); err != nil {
342+ return nil , fmt .Errorf ("read page index size: %w" , err )
343+ }
344+
345+ return pageIndex , nil
346+ }
0 commit comments