aboutsummaryrefslogtreecommitdiff
path: root/pkg/commands/command-registry.go
diff options
context:
space:
mode:
authoralex <[email protected]>2026-07-12 15:00:16 +0200
committeralex <[email protected]>2026-07-12 15:00:16 +0200
commit6cb3313793bf45e197b3048f0abd2f600bf97bb5 (patch)
tree019a0995c7f9422ec9d739c77379ee7cc1a96b9c /pkg/commands/command-registry.go
parentce9d9f8b2183bc0a31bfa40e780ae07182bc7cf8 (diff)
downloadredis-clone-multi/execute.tar.xz
redis-clone-multi/execute.zip
multi exec and discardmulti/execute
Diffstat (limited to 'pkg/commands/command-registry.go')
-rw-r--r--pkg/commands/command-registry.go53
1 files changed, 48 insertions, 5 deletions
diff --git a/pkg/commands/command-registry.go b/pkg/commands/command-registry.go
index 19c8acc..961f5ff 100644
--- a/pkg/commands/command-registry.go
+++ b/pkg/commands/command-registry.go
@@ -24,12 +24,12 @@ func AllSubsequentKeys(args []string) []string {
func NoKeys(args []string) []string {
return nil
}
-
func RenameKeys(args []string) []string {
return []string{args[1], args[2]}
}
type BaseCommand struct{
+ LocksAll bool
MinArgs int
ExtractKeys func(args []string)[]string
Execute func(args []string, getShard func(k string) *core.Shard) interface{}
@@ -41,10 +41,21 @@ func DispatchBaseCommand(db core.RedisDB ,cmd BaseCommand, args []string) interf
return errors.New("wrong number of arguments")
}
- keys := cmd.ExtractKeys(args)
-
- db.Lock(keys)
- defer db.Unlock(keys)
+ if cmd.LocksAll {
+ for _, shard := range db.Shards {
+ shard.Mu.Lock()
+ }
+ defer func() {
+ for i := len(db.Shards) - 1; i >= 0; i-- {
+ db.Shards[i].Mu.Unlock()
+ }
+ }()
+ } else {
+ keys := cmd.ExtractKeys(args)
+ db.Lock(keys)
+ defer db.Unlock(keys)
+ }
+
return cmd.Execute(args, db.GetShard)
}
@@ -63,6 +74,29 @@ func DispatchPubSub(conn net.Conn, h *pubsub.Hub, cmd PubSubCommand, args []stri
}
}
+type SessionCommand struct {
+ MinArgs int
+ Execute func(db core.RedisDB,session *ClientSession, conn net.Conn, args []string) interface{}
+}
+
+func DispatchSession(db core.RedisDB,conn net.Conn, s *ClientSession, cmd SessionCommand, args []string) {
+ if len(args) < cmd.MinArgs {
+ conn.Write(core.SerializeRESP(errors.New("wrong number of arguments")))
+ return
+ }
+ if res := cmd.Execute(db,s, conn, args); res != nil {
+ conn.Write(core.SerializeRESP(res))
+ }
+}
+
+func QueueBaseCommand(conn net.Conn, s *ClientSession, args []string, minArgs int) {
+ if len(args) < minArgs {
+ conn.Write(core.SerializeRESP(errors.New("wrong number of arguments")))
+ return
+ }
+ s.Queue = append(s.Queue, args)
+ conn.Write(core.SerializeRESP(core.SimpleString("QUEUED")))
+}
var BaseRegistry = map[string]BaseCommand{
"GET": {
@@ -126,6 +160,7 @@ var BaseRegistry = map[string]BaseCommand{
Execute: Lrange,
},
"FLUSHALL": {
+ LocksAll: true,
MinArgs: 1,
ExtractKeys: NoKeys,
Execute: Flushall,
@@ -166,11 +201,13 @@ var BaseRegistry = map[string]BaseCommand{
Execute: Type,
},
"DBSIZE": {
+ LocksAll: true,
MinArgs: 1,
ExtractKeys: NoKeys,
Execute: Dbsize,
},
"KEYS": {
+ LocksAll: true,
MinArgs: 2,
ExtractKeys: NoKeys,
Execute: Keys,
@@ -191,4 +228,10 @@ var PubSubRegistry = map[string]PubSubCommand{
"SUBSCRIBE": {MinArgs: 2, Execute: Subscribe},
"UNSUBSCRIBE": {MinArgs: 1, Execute: Unsubscribe},
"PUBLISH": {MinArgs: 3, Execute: Publish},
+}
+
+var SessionRegistry = map[string]SessionCommand{
+ "MULTI": {MinArgs: 1, Execute: Multi},
+ "EXEC": {MinArgs: 1, Execute: Exec},
+ "DISCARD": {MinArgs: 1, Execute: Discard},
} \ No newline at end of file