add some base set function

This commit is contained in:
siddontang 2014-08-11 14:52:43 +08:00
parent ff40b2ec80
commit 3ff3dc3323
2 changed files with 108 additions and 0 deletions

View File

@ -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
) )

100
ledis/t_set.go Normal file
View File

@ -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
}