// read reads the current key and value from the current block. func (c *cursor) read() (key int64, value interface{}) { // Return nil if the offset is at the end of the buffer. if c.off >= len(c.buf) { return -1, nil } // Otherwise read the current entry. buf := c.buf[c.off:] dataSize := entryDataSize(buf) return tsdb.DecodeKeyValue(c.field, c.dec, buf[0:8], buf[entryHeaderSize:entryHeaderSize+dataSize]) }
// Next returns the next key/value pair from the cursor. func (c *cursor) Next() (key int64, value interface{}) { for { k, v := func() (int64, interface{}) { if c.keyBuf != -2 { k, v := c.keyBuf, c.valBuf c.keyBuf = -2 return k, v } k, v := c.cursor.Next() if k == nil { return -1, nil } return tsdb.DecodeKeyValue(c.field, c.dec, k, v) }() if k != -1 && v == nil { // There is a point in the series at the next timestamp, // but not for this cursor's field. Go to the next point. continue } return k, v } }
// Seek moves the cursor to a position. func (c *cursor) SeekTo(seek int64) { var seekBytes [8]byte binary.BigEndian.PutUint64(seekBytes[:], uint64(seek)) k, v := c.cursor.Seek(seekBytes[:]) c.keyBuf, c.valBuf = tsdb.DecodeKeyValue(c.field, c.dec, k, v) }