influxdb/tsdb/tsm1/reader_block_iterator.go

56 lines
1.4 KiB
Go

package tsm1
// BlockIterator allows iterating over each block in a TSM file in order. It provides
// raw access to the block bytes without decoding them.
type BlockIterator struct {
r *TSMReader
iter *TSMIndexIterator
entries []IndexEntry
}
// PeekNext returns the next key to be iterated or an empty string.
func (b *BlockIterator) PeekNext() []byte {
if len(b.entries) > 1 {
return b.iter.Key()
}
return b.iter.Peek()
}
// Next returns true if there are more blocks to iterate through.
func (b *BlockIterator) Next() bool {
if b.iter.Err() != nil {
return false
}
if len(b.entries) > 0 {
b.entries = b.entries[1:]
if len(b.entries) > 0 {
return true
}
}
if !b.iter.Next() {
return false
}
b.entries = b.iter.Entries()
return len(b.entries) > 0
}
// Read reads information about the next block to be iterated.
func (b *BlockIterator) Read() (key []byte, minTime int64, maxTime int64, typ byte, checksum uint32, buf []byte, err error) {
if err := b.iter.Err(); err != nil {
return nil, 0, 0, 0, 0, nil, err
}
checksum, buf, err = b.r.ReadBytes(&b.entries[0], nil)
if err != nil {
return nil, 0, 0, 0, 0, nil, err
}
return b.iter.Key(), b.entries[0].MinTime, b.entries[0].MaxTime, b.iter.Type(), checksum, buf, err
}
// Err returns any errors encounter during iteration.
func (b *BlockIterator) Err() error {
return b.iter.Err()
}