ledisdb/server/http/cmd_kv.go

279 lines
5.8 KiB
Go

package http
import (
"fmt"
"github.com/siddontang/ledisdb/ledis"
"strconv"
)
func getCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 1 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "get")
}
key := []byte(args[0])
if v, err := db.Get(key); err != nil {
return nil, err
} else {
if v == nil {
return nil, nil
}
return ledis.String(v), nil
}
}
func setCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 2 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "set")
}
key := []byte(args[0])
val := []byte(args[1])
if err := db.Set(key, val); err != nil {
return nil, err
} else {
return []interface{}{true, MSG_OK}, nil
}
}
func getsetCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 2 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "getset")
}
key := []byte(args[0])
val := []byte(args[1])
if v, err := db.GetSet(key, val); err != nil {
return nil, err
} else {
if v == nil {
return nil, nil
}
return ledis.String(v), nil
}
}
func setnxCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 2 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "setnx")
}
key := []byte(args[0])
val := []byte(args[1])
if n, err := db.SetNX(key, val); err != nil {
return nil, err
} else {
return n, nil
}
}
func existsCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 1 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "exists")
}
if n, err := db.Exists([]byte(args[0])); err != nil {
return nil, err
} else {
return n, nil
}
}
func incrCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 1 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "incr")
}
key := []byte(args[0])
if n, err := db.Incr(key); err != nil {
return nil, err
} else {
return n, nil
}
}
func decrCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 1 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "decr")
}
key := []byte(args[0])
if n, err := db.Decr(key); err != nil {
return nil, err
} else {
return n, nil
}
}
func incrbyCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 2 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "incrby")
}
delta, err := strconv.ParseInt(args[1], 10, 64)
if err != nil {
return nil, ErrValue
}
key := []byte(args[0])
if n, err := db.IncryBy(key, delta); err != nil {
return nil, err
} else {
return n, nil
}
}
func decrbyCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 2 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "decrby")
}
delta, err := strconv.ParseInt(args[1], 10, 64)
if err != nil {
return nil, ErrValue
}
key := []byte(args[0])
if n, err := db.DecrBy(key, delta); err != nil {
return nil, err
} else {
return n, nil
}
}
func delCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) == 0 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "del")
}
keys := make([][]byte, len(args))
if n, err := db.Del(keys...); err != nil {
return nil, err
} else {
return n, nil
}
}
func msetCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) == 0 || len(args)%2 != 0 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "mset")
}
kvs := make([]ledis.KVPair, len(args)/2)
for i := 0; i < len(kvs); i++ {
kvs[i].Key = []byte(args[2*i])
kvs[i].Value = []byte(args[2*i+1])
}
if err := db.MSet(kvs...); err != nil {
return nil, err
} else {
return []interface{}{true, MSG_OK}, nil
}
}
func mgetCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) == 0 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "mget")
}
keys := make([][]byte, len(args))
for i, arg := range args {
keys[i] = []byte(arg)
}
if vals, err := db.MGet(keys...); err != nil {
return nil, err
} else {
arr := make([]interface{}, len(vals))
for i, v := range vals {
if v == nil {
arr[i] = nil
} else {
arr[i] = ledis.String(v)
}
}
return arr, nil
}
}
func expireCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 2 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "expire")
}
duration, err := strconv.ParseInt(args[1], 10, 64)
if err != nil {
return nil, ErrValue
}
key := []byte(args[0])
if v, err := db.Expire(key, duration); err != nil {
return nil, err
} else {
return v, nil
}
}
func expireAtCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 2 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "expireat")
}
when, err := strconv.ParseInt(args[1], 10, 64)
if err != nil {
return nil, ErrValue
}
key := []byte(args[0])
if v, err := db.ExpireAt(key, when); err != nil {
return nil, err
} else {
return v, nil
}
}
func ttlCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 1 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "ttl")
}
key := []byte(args[0])
if v, err := db.TTL(key); err != nil {
return nil, err
} else {
return v, nil
}
}
func persistCommand(db *ledis.DB, args ...string) (interface{}, error) {
if len(args) != 1 {
return nil, fmt.Errorf(ERR_ARGUMENT_FORMAT, "persist")
}
key := []byte(args[0])
if n, err := db.Persist(key); err != nil {
return nil, err
} else {
return n, nil
}
}
func init() {
register("decr", decrCommand)
register("decrby", decrbyCommand)
register("del", delCommand)
register("exists", existsCommand)
register("get", getCommand)
register("getset", getsetCommand)
register("incr", incrCommand)
register("incrby", incrbyCommand)
register("mget", mgetCommand)
register("mset", msetCommand)
register("set", setCommand)
register("setnx", setnxCommand)
register("expire", expireCommand)
register("expireat", expireAtCommand)
register("ttl", ttlCommand)
register("persist", persistCommand)
}