package kv
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/google/orderedcode"
|
|
"github.com/tendermint/tendermint/libs/pubsub/query"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
func intInSlice(a int, list []int) bool {
|
|
for _, b := range list {
|
|
if b == a {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func int64FromBytes(bz []byte) int64 {
|
|
v, _ := binary.Varint(bz)
|
|
return v
|
|
}
|
|
|
|
func int64ToBytes(i int64) []byte {
|
|
buf := make([]byte, binary.MaxVarintLen64)
|
|
n := binary.PutVarint(buf, i)
|
|
return buf[:n]
|
|
}
|
|
|
|
func heightKey(height int64) ([]byte, error) {
|
|
return orderedcode.Append(
|
|
nil,
|
|
types.BlockHeightKey,
|
|
height,
|
|
)
|
|
}
|
|
|
|
func eventKey(compositeKey, typ, eventValue string, height int64) ([]byte, error) {
|
|
return orderedcode.Append(
|
|
nil,
|
|
compositeKey,
|
|
eventValue,
|
|
height,
|
|
typ,
|
|
)
|
|
}
|
|
|
|
func parseValueFromPrimaryKey(key []byte) (string, error) {
|
|
var (
|
|
compositeKey string
|
|
height int64
|
|
)
|
|
|
|
remaining, err := orderedcode.Parse(string(key), &compositeKey, &height)
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to parse event key: %w", err)
|
|
}
|
|
|
|
if len(remaining) != 0 {
|
|
return "", fmt.Errorf("unexpected remainder in key: %s", remaining)
|
|
}
|
|
|
|
return strconv.FormatInt(height, 10), nil
|
|
}
|
|
|
|
func parseValueFromEventKey(key []byte) (string, error) {
|
|
var (
|
|
compositeKey, typ, eventValue string
|
|
height int64
|
|
)
|
|
|
|
remaining, err := orderedcode.Parse(string(key), &compositeKey, &eventValue, &height, &typ)
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to parse event key: %w", err)
|
|
}
|
|
|
|
if len(remaining) != 0 {
|
|
return "", fmt.Errorf("unexpected remainder in key: %s", remaining)
|
|
}
|
|
|
|
return eventValue, nil
|
|
}
|
|
|
|
func lookForHeight(conditions []query.Condition) (int64, bool) {
|
|
for _, c := range conditions {
|
|
if c.CompositeKey == types.BlockHeightKey && c.Op == query.OpEqual {
|
|
return c.Operand.(int64), true
|
|
}
|
|
}
|
|
|
|
return 0, false
|
|
}
|