mirror of
https://gitee.com/milvus-io/milvus.git
synced 2025-12-30 15:35:33 +08:00
62 lines
1.6 KiB
Go
62 lines
1.6 KiB
Go
package codec
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"errors"
|
|
"github.com/tikv/client-go/codec"
|
|
)
|
|
|
|
var (
|
|
Delimiter = byte('_')
|
|
DelimiterPlusOne = Delimiter + 0x01
|
|
DeleteMark = byte('d')
|
|
SegmentIndexMark = byte('i')
|
|
SegmentDLMark = byte('d')
|
|
)
|
|
|
|
// EncodeKey append timestamp, delimiter, and suffix string
|
|
// to one slice key.
|
|
// Note: suffix string should not contains Delimiter
|
|
func EncodeKey(key []byte, timestamp uint64, suffix string) []byte {
|
|
//TODO: should we encode key to memory comparable
|
|
ret := EncodeDelimiter(key, Delimiter)
|
|
ret = codec.EncodeUintDesc(ret, timestamp)
|
|
return append(ret, suffix...)
|
|
}
|
|
|
|
func DecodeKey(key []byte) ([]byte, uint64, string, error) {
|
|
if len(key) < 8 {
|
|
return nil, 0, "", errors.New("insufficient bytes to decode value")
|
|
}
|
|
|
|
lenDeKey := 0
|
|
for i := len(key) - 1; i > 0; i-- {
|
|
if key[i] == Delimiter {
|
|
lenDeKey = i
|
|
break
|
|
}
|
|
}
|
|
|
|
if lenDeKey == 0 || lenDeKey+8 > len(key) {
|
|
return nil, 0, "", errors.New("insufficient bytes to decode value")
|
|
}
|
|
|
|
tsBytes := key[lenDeKey+1 : lenDeKey+9]
|
|
ts := binary.BigEndian.Uint64(tsBytes)
|
|
suffix := string(key[lenDeKey+9:])
|
|
key = key[:lenDeKey-1]
|
|
return key, ^ts, suffix, nil
|
|
}
|
|
|
|
// EncodeDelimiter append a delimiter byte to slice b, and return the appended slice.
|
|
func EncodeDelimiter(b []byte, delimiter byte) []byte {
|
|
return append(b, delimiter)
|
|
}
|
|
|
|
func EncodeSegment(segName []byte, segType byte) []byte {
|
|
segmentKey := []byte("segment")
|
|
segmentKey = append(segmentKey, Delimiter)
|
|
segmentKey = append(segmentKey, segName...)
|
|
return append(segmentKey, Delimiter, segType)
|
|
}
|