1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
package commands
import (
"errors"
"redisClone/pkg/core"
)
func SingleKey(args []string) []string {
return []string{args[1]}
}
func AllSubsequentKeys(args []string) []string {
return args[1:]
}
func NoKeys(args []string) []string {
return nil
}
type CommandDef struct{
MinArgs int
ExtractKeys func(args []string)[]string
Execute func(args []string, getShard func(k string) *core.Shard) interface{}
}
func DispatchBaseCommand(db core.RedisDB ,commandName string, args []string) interface{} {
cmd, exists := Registry[commandName]
if !exists {
return nil
}
if len(args) < cmd.MinArgs {
return errors.New("wrong number of arguments")
}
keys := cmd.ExtractKeys(args)
db.Lock(keys)
defer db.Unlock(keys)
return cmd.Execute(args, db.GetShard)
}
var Registry = map[string]CommandDef{
"GET": {
MinArgs: 2,
ExtractKeys: SingleKey,
Execute: Get,
},
"SET": {
MinArgs: 3,
ExtractKeys: SingleKey,
Execute: Set,
},
"DEL": {
MinArgs: 2,
ExtractKeys: AllSubsequentKeys,
Execute: Del,
},
"EXISTS": {
MinArgs: 2,
ExtractKeys: SingleKey,
Execute: Exists,
},
"INCR": {
MinArgs: 2,
ExtractKeys: SingleKey,
Execute: Incr,
},
"DECR": {
MinArgs: 2,
ExtractKeys: SingleKey,
Execute: Decr,
},
"RENAME": {
MinArgs: 3,
ExtractKeys: SingleKey,
Execute: Rename,
},
"RPUSH": {
MinArgs: 3,
ExtractKeys: SingleKey,
Execute: Rpush,
},
"LPUSH": {
MinArgs: 3,
ExtractKeys: SingleKey,
Execute: Lpush,
},
"RPOP": {
MinArgs: 2,
ExtractKeys: SingleKey,
Execute: Rpop,
},
"LPOP": {
MinArgs: 2,
ExtractKeys: SingleKey,
Execute: Lpop,
},
}
|