1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.1 KiB
Go

package wal
import (
"io"
)
// FullScanner implements WALIterator to iterate over all frames in a WAL file.
type FullScanner struct {
reader *Reader
header *WALHeader
}
// NewFullScanner creates a new FullScanner with the given io.Reader.
func NewFullScanner(r io.ReadSeeker) (*FullScanner, error) {
wr := NewReader(r)
err := wr.ReadHeader()
if err != nil {
return nil, err
}
hdr := &WALHeader{
Magic: wr.magic,
Version: WALSupportedVersion,
PageSize: wr.PageSize(),
Seq: wr.seq,
Salt1: wr.salt1,
Salt2: wr.salt2,
Checksum1: wr.chksum1,
Checksum2: wr.chksum2,
}
return &FullScanner{
reader: wr,
header: hdr,
}, nil
}
// Header returns the header of the WAL file.
func (f *FullScanner) Header() (*WALHeader, error) {
return f.header, nil
}
// Next reads the next frame from the WAL file.
func (f *FullScanner) Next() (*Frame, error) {
data := make([]byte, f.reader.PageSize())
pgno, commit, err := f.reader.ReadFrame(data)
if err != nil {
return nil, err
}
frame := &Frame{
Pgno: pgno,
Commit: commit,
Data: data,
}
return frame, nil
}