forked from mirror/ledisdb
add some base set function
This commit is contained in:
parent
ff40b2ec80
commit
3ff3dc3323
|
@ -16,6 +16,8 @@ const (
|
||||||
ZScoreType byte = 8
|
ZScoreType byte = 8
|
||||||
BitType byte = 9
|
BitType byte = 9
|
||||||
BitMetaType byte = 10
|
BitMetaType byte = 10
|
||||||
|
SetType byte = 11
|
||||||
|
SSizeType byte = 12
|
||||||
|
|
||||||
maxDataType byte = 100
|
maxDataType byte = 100
|
||||||
|
|
||||||
|
@ -35,6 +37,8 @@ var (
|
||||||
ZScoreType: "zscore",
|
ZScoreType: "zscore",
|
||||||
BitType: "bit",
|
BitType: "bit",
|
||||||
BitMetaType: "bitmeta",
|
BitMetaType: "bitmeta",
|
||||||
|
SetType: "set",
|
||||||
|
SSizeType: "ssize",
|
||||||
ExpTimeType: "exptime",
|
ExpTimeType: "exptime",
|
||||||
ExpMetaType: "expmeta",
|
ExpMetaType: "expmeta",
|
||||||
}
|
}
|
||||||
|
@ -48,6 +52,7 @@ var (
|
||||||
errKeySize = errors.New("invalid key size")
|
errKeySize = errors.New("invalid key size")
|
||||||
errValueSize = errors.New("invalid value size")
|
errValueSize = errors.New("invalid value size")
|
||||||
errHashFieldSize = errors.New("invalid hash field size")
|
errHashFieldSize = errors.New("invalid hash field size")
|
||||||
|
errSetMemberSize = errors.New("invalid set member size")
|
||||||
errZSetMemberSize = errors.New("invalid zset member size")
|
errZSetMemberSize = errors.New("invalid zset member size")
|
||||||
errExpireValue = errors.New("invalid expire value")
|
errExpireValue = errors.New("invalid expire value")
|
||||||
)
|
)
|
||||||
|
@ -65,6 +70,9 @@ const (
|
||||||
//max zset member size
|
//max zset member size
|
||||||
MaxZSetMemberSize int = 1024
|
MaxZSetMemberSize int = 1024
|
||||||
|
|
||||||
|
//max set member size
|
||||||
|
MaxSetMemberSize int = 1024
|
||||||
|
|
||||||
//max value size
|
//max value size
|
||||||
MaxValueSize int = 10 * 1024 * 1024
|
MaxValueSize int = 10 * 1024 * 1024
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
package ledis
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
var errSetKey = errors.New("invalid set key")
|
||||||
|
var errSSizeKey = errors.New("invalid ssize key")
|
||||||
|
|
||||||
|
const (
|
||||||
|
setStartSep byte = ':'
|
||||||
|
setStopSep byte = setStartSep + 1
|
||||||
|
)
|
||||||
|
|
||||||
|
func checkSetKeyMember(key []byte, member []byte) error {
|
||||||
|
if len(key) > MaxKeySize || len(key) == 0 {
|
||||||
|
return errKeySize
|
||||||
|
} else if len(member) > MaxSetMemberSize || len(member) == 0 {
|
||||||
|
return errSetMemberSize
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *DB) sEncodeSizeKey(key []byte) []byte {
|
||||||
|
buf := make([]byte, len(key)+2)
|
||||||
|
|
||||||
|
buf[0] = db.index
|
||||||
|
buf[1] = SSizeType
|
||||||
|
|
||||||
|
copy(buf[2:], key)
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *DB) sDecodeSizeKey(ek []byte) ([]byte, error) {
|
||||||
|
if len(ek) < 2 || ek[0] != db.index || ek[1] != SSizeType {
|
||||||
|
return nil, errSSizeKey
|
||||||
|
}
|
||||||
|
|
||||||
|
return ek[2:], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *DB) sEncodeSetKey(key []byte, member []byte) []byte {
|
||||||
|
buf := make([]byte, len(key)+len(member)+1+1+2+1)
|
||||||
|
|
||||||
|
pos := 0
|
||||||
|
buf[pos] = db.index
|
||||||
|
pos++
|
||||||
|
buf[pos] = SetType
|
||||||
|
pos++
|
||||||
|
|
||||||
|
binary.BigEndian.PutUint16(buf[pos:], uint16(len(key)))
|
||||||
|
pos += 2
|
||||||
|
|
||||||
|
copy(buf[pos:], key)
|
||||||
|
pos += len(key)
|
||||||
|
|
||||||
|
buf[pos] = setStartSep
|
||||||
|
pos++
|
||||||
|
copy(buf[pos:], member)
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *DB) sDecodeSetKey(ek []byte) ([]byte, []byte, error) {
|
||||||
|
if len(ek) < 5 || ek[0] != db.index || ek[1] != SetType {
|
||||||
|
return nil, nil, errSetKey
|
||||||
|
}
|
||||||
|
|
||||||
|
pos := 2
|
||||||
|
keyLen := int(binary.BigEndian.Uint16(ek[pos:]))
|
||||||
|
pos += 2
|
||||||
|
|
||||||
|
if keyLen+5 > len(ek) {
|
||||||
|
return nil, nil, errSetKey
|
||||||
|
}
|
||||||
|
|
||||||
|
key := ek[pos : pos+keyLen]
|
||||||
|
pos += keyLen
|
||||||
|
|
||||||
|
if ek[pos] != hashStartSep {
|
||||||
|
return nil, nil, errSetKey
|
||||||
|
}
|
||||||
|
|
||||||
|
pos++
|
||||||
|
member := ek[pos:]
|
||||||
|
return key, member, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *DB) sEncodeStartKey(key []byte) []byte {
|
||||||
|
return db.sEncodeSetKey(key, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *DB) sEncodeStopKey(key []byte) []byte {
|
||||||
|
k := db.sEncodeSetKey(key, nil)
|
||||||
|
|
||||||
|
k[len(k)-1] = setStopSep
|
||||||
|
|
||||||
|
return k
|
||||||
|
}
|
Loading…
Reference in New Issue