Skip to content

Commit 2af9b0c

Browse files
authored
Standalone page encoding/decoding (#66)
1 parent 9717266 commit 2af9b0c

File tree

3 files changed

+46
-39
lines changed

3 files changed

+46
-39
lines changed

decoder.go

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
156120
func (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+
}

decoder_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ func TestDecoder(t *testing.T) {
6666
// Verify page index.
6767
index := dec.PageIndex()
6868
if got, want := index, map[uint32]ltx.PageIndexElem{
69-
1: {Offset: 100, Size: 49},
70-
2: {Offset: 149, Size: 49},
69+
1: {MinTXID: 1, MaxTXID: 1, Offset: 100, Size: 49},
70+
2: {MinTXID: 1, MaxTXID: 1, Offset: 149, Size: 49},
7171
}; !reflect.DeepEqual(got, want) {
7272
t.Fatalf("page index mismatch:\ngot=%#v\nwant=%#v", got, want)
7373
}

encoder.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,10 @@ func (enc *Encoder) writeToHash(b []byte) {
307307
}
308308

309309
type PageIndexElem struct {
310+
Level int
311+
MinTXID TXID
312+
MaxTXID TXID
313+
310314
Offset int64
311315
Size int64
312316
}

0 commit comments

Comments
 (0)