Documentation
¶
Overview ¶
Package ltx reads and writes Liteserver Transaction (LTX) files.
Index ¶
- Constants
- Variables
- func ChecksumPage(pgno uint32, data []byte) uint64
- func FormatFilename(minTXID, maxTXID uint64) string
- func FormatTXID(id uint64) string
- func FormatTXIDRange(min, max uint64) string
- func IsValidHeaderFlags(flags uint32) bool
- func IsValidPageSize(sz uint32) bool
- func PageAlign(v int64, pageSize uint32) int64
- func ParseFilename(name string) (minTXID, maxTXID uint64, err error)
- func UniquePageN(filenames []string) (pageN uint32, err error)
- type Compactor
- type EventHeader
- type FileSpec
- type Header
- type HeaderBlockReader
- func (r *HeaderBlockReader) Checksum() uint64
- func (r *HeaderBlockReader) Close() error
- func (r *HeaderBlockReader) Read(p []byte) (n int, err error)
- func (r *HeaderBlockReader) ReadEventHeader(hdr *EventHeader) error
- func (r *HeaderBlockReader) ReadHeader(hdr *Header) error
- func (r *HeaderBlockReader) ReadPageHeader(hdr *PageHeader) error
- type HeaderBlockWriter
- func (w *HeaderBlockWriter) Close() error
- func (w *HeaderBlockWriter) Header() Header
- func (w *HeaderBlockWriter) SetPageBlockChecksum(chksum uint64)
- func (w *HeaderBlockWriter) SetPostChecksum(chksum uint64)
- func (w *HeaderBlockWriter) Write(p []byte) (n int, err error)
- func (w *HeaderBlockWriter) WriteEventHeader(hdr EventHeader) (err error)
- func (w *HeaderBlockWriter) WriteHeader(hdr Header) error
- func (w *HeaderBlockWriter) WritePageHeader(hdr PageHeader) (err error)
- type PageBlockReader
- type PageBlockWriter
- type PageHeader
Constants ¶
const ( // Magic is the first 4 bytes of every LTX file. Magic = "LTX1" // Version is the current version of the LTX file format. Version = 1 )
const ( HeaderSize = 96 PageHeaderSize = 32 EventHeaderSize = 32 )
Header size constants.
const ( ChecksumSize = 8 HeaderChecksumOffset = HeaderSize - ChecksumSize PageBlockChecksumOffset = HeaderChecksumOffset - ChecksumSize HeaderBlockChecksumOffset = PageBlockChecksumOffset - ChecksumSize )
Checksum size & positions.
const ( // ChecksumFlag is a flag on the checksum to ensure it is non-zero. ChecksumFlag uint64 = 1 << 63 // ChecksumMask is the mask of the bits used for the page checksum. ChecksumMask uint64 = (1 << 63) - 1 )
Variables ¶
var ( ErrInvalidFile = errors.New("invalid LTX file") ErrReaderClosed = errors.New("reader closed") ErrWriterClosed = errors.New("writer closed") ErrNoHeaderChecksum = errors.New("no header checksum") ErrInvalidHeaderChecksumFormat = errors.New("invalid header checksum format") ErrHeaderChecksumMismatch = errors.New("header checksum mismatch") ErrHeaderBlockChecksumMismatch = errors.New("header block checksum mismatch") ErrPageBlockChecksumMismatch = errors.New("header page checksum mismatch") )
Errors
Functions ¶
func ChecksumPage ¶
ChecksumPage returns a CRC64 checksum that combines the page number & page data.
func FormatFilename ¶
FormatFilename returns an LTX filename representing a range of transactions.
func FormatTXID ¶
FormatTXID returns id formatted as a fixed-width hex number.
func FormatTXIDRange ¶
FormatTXIDRange returns min & max formatted as a single number if equal or a range if different.
func IsValidHeaderFlags ¶
IsValidHeaderFlags returns true if flags are unset. Flags are reserved.
func IsValidPageSize ¶
IsValidPageSize returns true if sz is between 512 and 64K and a power of two.
func PageAlign ¶
PageAlign returns v if it a multiple of pageSize. Otherwise returns next multiple of pageSize.
func ParseFilename ¶
ParseFilename parses a transaction range from an LTX file.
func UniquePageN ¶
UniquePageN returns the unique page number count of a set of LTX files.
Types ¶
type Compactor ¶
type Compactor struct {
// If true, the compactor calls fsync() after a successful compaction.
Sync bool
// If true, the output file will include all events from input files.
IncludeEvents bool
}
Compactor represents a compactor of LTX files.
func NewCompactor ¶
func NewCompactor() *Compactor
NewCompactor returns a new instance of Compactor with default settings.
type EventHeader ¶
EventHeader represents the header for a single event frame in an LTX file.
func (*EventHeader) MarshalBinary ¶
func (h *EventHeader) MarshalBinary() ([]byte, error)
MarshalBinary encodes h to a byte slice.
func (*EventHeader) UnmarshalBinary ¶
func (h *EventHeader) UnmarshalBinary(b []byte) error
UnmarshalBinary decodes h from a byte slice.
func (*EventHeader) Validate ¶
func (h *EventHeader) Validate() error
Validate returns an error if h is invalid.
type FileSpec ¶
type FileSpec struct {
Header Header
PageHeaders []PageHeader
EventHeaders []EventHeader
EventData [][]byte
PageData [][]byte
}
FileSpec is an in-memory representation of an LTX file. Typically used for testing.
type Header ¶
type Header struct {
Version int // based on magic
Flags uint32 // reserved flags
PageSize uint32 // page size, in bytes
PageN uint32 // page count in ltx file
EventN uint32 // event count in ltx file
EventDataSize uint32 // total size of all event data
Commit uint32 // db size after transaction, in pages
DBID uint32 // database ID
MinTXID uint64 // minimum transaction ID
MaxTXID uint64 // maximum transaction ID
Timestamp uint64 // seconds since unix epoch
PreChecksum uint64 // checksum of database at previous transaction
PostChecksum uint64 // checksum of database after this LTX file is applied
HeaderBlockChecksum uint64 // crc64 checksum of header block, excluding header
PageBlockChecksum uint64 // crc64 checksum of page block
HeaderChecksum uint64 // crc64 checksum of header
}
Header represents the header frame of an LTX file.
func (*Header) HeaderBlockSize ¶
HeaderBlockSize returns the total size of the header block, in bytes. Must be a valid header frame.
func (*Header) IsSnapshot ¶
IsSnapshot returns true if header represents a complete database snapshot. This is true if the header includes the initial transaction. Snapshots must include all pages in the database.
func (*Header) MarshalBinary ¶
MarshalBinary encodes h to a byte slice.
func (*Header) Prevalidate ¶
Prevalidate returns an error if h is invalid. This function does not check calculated fields, which includes most of the checksums. It is called when initializing a writer so that we can perform basic validation before writing a lot of data.
func (*Header) UnmarshalBinary ¶
UnmarshalBinary decodes h from a byte slice.
type HeaderBlockReader ¶
type HeaderBlockReader struct {
// contains filtered or unexported fields
}
func NewHeaderBlockReader ¶
func NewHeaderBlockReader(r io.Reader) *HeaderBlockReader
func (*HeaderBlockReader) Checksum ¶
func (r *HeaderBlockReader) Checksum() uint64
Checksum returns the checksum of the file. Only valid after close.
func (*HeaderBlockReader) Close ¶
func (r *HeaderBlockReader) Close() error
Close verifies the reader is at the end of the file and that the checksum matches.
func (*HeaderBlockReader) Read ¶
func (r *HeaderBlockReader) Read(p []byte) (n int, err error)
Read reads bytes for an event or page data frame. Only valid after a call to ReadEventHeader() or ReadPageHeader().
func (*HeaderBlockReader) ReadEventHeader ¶
func (r *HeaderBlockReader) ReadEventHeader(hdr *EventHeader) error
ReadEventHeader returns true if more events are available.
func (*HeaderBlockReader) ReadHeader ¶
func (r *HeaderBlockReader) ReadHeader(hdr *Header) error
ReadHeader returns the LTX file header frame.
func (*HeaderBlockReader) ReadPageHeader ¶
func (r *HeaderBlockReader) ReadPageHeader(hdr *PageHeader) error
ReadPageHeader reads the next page header into hdr and initializes reader to read associated page data.
type HeaderBlockWriter ¶
type HeaderBlockWriter struct {
// contains filtered or unexported fields
}
HeaderBlockWriter implements a writer for the header block of an LTX file.
func NewHeaderBlockWriter ¶
func NewHeaderBlockWriter(w io.WriteSeeker) *HeaderBlockWriter
NewHeaderBlockWriter returns a new instance of HeaderBlockWriter.
func (*HeaderBlockWriter) Close ¶
func (w *HeaderBlockWriter) Close() error
Close flushes the checksum to the header.
func (*HeaderBlockWriter) Header ¶
func (w *HeaderBlockWriter) Header() Header
Header returns the header. Checksums are only applied after Close().
func (*HeaderBlockWriter) SetPageBlockChecksum ¶
func (w *HeaderBlockWriter) SetPageBlockChecksum(chksum uint64)
SetPageBlockChecksum sets the checksum of the page block. Must call after WriteHeaderFrame() & before Close().
func (*HeaderBlockWriter) SetPostChecksum ¶
func (w *HeaderBlockWriter) SetPostChecksum(chksum uint64)
SetPostChecksum sets the post-apply checksum of the database. Must call after WriteHeaderFrame() & before Close().
func (*HeaderBlockWriter) Write ¶
func (w *HeaderBlockWriter) Write(p []byte) (n int, err error)
Write writes data to a single event. Should only be called after a successful call to WriteEventHeader().
func (*HeaderBlockWriter) WriteEventHeader ¶
func (w *HeaderBlockWriter) WriteEventHeader(hdr EventHeader) (err error)
WriteEventHeader writes hdr to the file's event block.
func (*HeaderBlockWriter) WriteHeader ¶
func (w *HeaderBlockWriter) WriteHeader(hdr Header) error
WriteHeader writes hdr to the file's header block.
func (*HeaderBlockWriter) WritePageHeader ¶
func (w *HeaderBlockWriter) WritePageHeader(hdr PageHeader) (err error)
WritePageHeader writes hdr to the file's page header block.
type PageBlockReader ¶
type PageBlockReader struct {
// contains filtered or unexported fields
}
func NewPageBlockReader ¶
func NewPageBlockReader(r io.Reader, pageN, pageSize uint32, checksum uint64) *PageBlockReader
func (*PageBlockReader) Checksum ¶
func (r *PageBlockReader) Checksum() uint64
Checksum returns the calculated checksum of the page data read.
func (*PageBlockReader) Close ¶
func (r *PageBlockReader) Close() error
Close verifies the reader is at the end of the file and that the checksum matches.
func (*PageBlockReader) Remaining ¶
func (r *PageBlockReader) Remaining() int64
Remaining returns the number of bytes to be read from the reader.
func (*PageBlockReader) Size ¶
func (r *PageBlockReader) Size() int64
Size returns the expected number of bytes to be read from the reader.
type PageBlockWriter ¶
type PageBlockWriter struct {
// contains filtered or unexported fields
}
PageBlockWriter implements a writer for the page data block of the LTX file format.
func NewPageBlockWriter ¶
func NewPageBlockWriter(w io.Writer, pageN, pageSize uint32) *PageBlockWriter
NewPageBlockWriter returns a new instance of PageBlockWriter.
func (*PageBlockWriter) Checksum ¶
func (w *PageBlockWriter) Checksum() uint64
Checksum returns the checksum of the header. Only valid after close.
func (*PageBlockWriter) Close ¶
func (w *PageBlockWriter) Close() error
Close returns an error if all bytes have not been written to the writer.
func (*PageBlockWriter) Remaining ¶
func (w *PageBlockWriter) Remaining() int64
Remaining returns the number of bytes to be written to the writer.
func (*PageBlockWriter) Size ¶
func (w *PageBlockWriter) Size() int64
Size returns the expected number of bytes to be written to the writer.
type PageHeader ¶
PageHeader represents the header for a single page in an LTX file.
func (*PageHeader) MarshalBinary ¶
func (h *PageHeader) MarshalBinary() ([]byte, error)
MarshalBinary encodes h to a byte slice.
func (*PageHeader) UnmarshalBinary ¶
func (h *PageHeader) UnmarshalBinary(b []byte) error
UnmarshalBinary decodes h from a byte slice.
func (*PageHeader) Validate ¶
func (h *PageHeader) Validate() error
Validate returns an error if h is invalid.