github.com/hdt3213/godis@v1.2.9/database/commandinfo.go (about) 1 package database 2 3 import ( 4 "github.com/hdt3213/godis/interface/redis" 5 "github.com/hdt3213/godis/redis/protocol" 6 "strings" 7 ) 8 9 const ( 10 redisFlagWrite = "write" 11 redisFlagReadonly = "readonly" 12 redisFlagDenyOOM = "denyoom" 13 redisFlagAdmin = "admin" 14 redisFlagPubSub = "pubsub" 15 redisFlagNoScript = "noscript" 16 redisFlagRandom = "random" 17 redisFlagSortForScript = "sortforscript" 18 redisFlagLoading = "loading" 19 redisFlagStale = "stale" 20 redisFlagSkipMonitor = "skip_monitor" 21 redisFlagAsking = "asking" 22 redisFlagFast = "fast" 23 redisFlagMovableKeys = "movablekeys" 24 ) 25 26 func execCommand(args [][]byte) redis.Reply { 27 if len(args) == 0 { 28 return getAllGodisCommandReply() 29 } 30 subCommand := strings.ToLower(string(args[0])) 31 if subCommand == "info" { 32 return getCommands(args[1:]) 33 } else if subCommand == "count" { 34 return protocol.MakeIntReply(int64(len(cmdTable))) 35 } else if subCommand == "getkeys" { 36 if len(args) < 2 { 37 return protocol.MakeErrReply("wrong number of arguments for 'command|" + subCommand + "'") 38 } 39 return getKeys(args[1:]) 40 } else { 41 return protocol.MakeErrReply("Unknown subcommand '" + subCommand + "'") 42 } 43 } 44 45 func getKeys(args [][]byte) redis.Reply { 46 cmdName := string(args[0]) 47 cmd, ok := cmdTable[cmdName] 48 if !ok { 49 return protocol.MakeErrReply("Invalid command specified") 50 } 51 if !validateArity(cmd.arity, args[1:]) { 52 return protocol.MakeArgNumErrReply(cmdName) 53 } 54 55 if cmd.prepare == nil { 56 return protocol.MakeErrReply("The command has no key arguments") 57 } 58 writeKeys, readKeys := cmd.prepare(args[1:]) 59 keys := append(writeKeys, readKeys...) 60 resp := make([][]byte, len(keys)) 61 for i, key := range keys { 62 resp[i] = []byte(key) 63 } 64 return protocol.MakeMultiBulkReply(resp) 65 } 66 67 func getCommands(args [][]byte) redis.Reply { 68 replies := make([]redis.Reply, len(args)) 69 for i, v := range args { 70 cmd, ok := cmdTable[string(v)] 71 if ok { 72 replies[i] = cmd.toDescReply() 73 } else { 74 replies[i] = protocol.MakeNullBulkReply() 75 } 76 } 77 return protocol.MakeMultiRawReply(replies) 78 } 79 80 func getAllGodisCommandReply() redis.Reply { 81 replies := make([]redis.Reply, 0, len(cmdTable)) 82 for _, v := range cmdTable { 83 replies = append(replies, v.toDescReply()) 84 } 85 return protocol.MakeMultiRawReply(replies) 86 } 87 88 func init() { 89 registerSpecialCommand("Command", 0, 0). 90 attachCommandExtra([]string{redisFlagRandom, redisFlagLoading, redisFlagStale}, 0, 0, 0) 91 registerSpecialCommand("Keys", 2, 0). 92 attachCommandExtra([]string{redisFlagReadonly, redisFlagSortForScript}, 0, 0, 0) 93 registerSpecialCommand("Auth", 2, 0). 94 attachCommandExtra([]string{redisFlagNoScript, redisFlagLoading, redisFlagStale, redisFlagSkipMonitor, redisFlagFast}, 0, 0, 0) 95 registerSpecialCommand("Info", -1, 0). 96 attachCommandExtra([]string{redisFlagRandom, redisFlagLoading, redisFlagStale}, 0, 0, 0) 97 registerSpecialCommand("SlaveOf", 3, 0). 98 attachCommandExtra([]string{redisFlagAdmin, redisFlagNoScript, redisFlagStale}, 0, 0, 0) 99 registerSpecialCommand("Subscribe", -2, 0). 100 attachCommandExtra([]string{redisFlagPubSub, redisFlagNoScript, redisFlagLoading, redisFlagStale}, 0, 0, 0) 101 registerSpecialCommand("Publish", 3, 0). 102 attachCommandExtra([]string{redisFlagPubSub, redisFlagNoScript, redisFlagLoading, redisFlagFast}, 0, 0, 0) 103 registerSpecialCommand("FlushAll", -1, 0). 104 attachCommandExtra([]string{redisFlagWrite}, 0, 0, 0) 105 registerSpecialCommand("FlushDB", -1, 0). 106 attachCommandExtra([]string{redisFlagWrite}, 0, 0, 0) 107 registerSpecialCommand("Save", -1, 0). 108 attachCommandExtra([]string{redisFlagAdmin, redisFlagNoScript}, 0, 0, 0) 109 registerSpecialCommand("BgSave", 1, 0). 110 attachCommandExtra([]string{redisFlagAdmin, redisFlagNoScript}, 0, 0, 0) 111 registerSpecialCommand("Select", 2, 0). 112 attachCommandExtra([]string{redisFlagLoading, redisFlagFast}, 0, 0, 0) 113 registerSpecialCommand("ReplConf", -1, 0). 114 attachCommandExtra([]string{redisFlagAdmin, redisFlagNoScript, redisFlagLoading, redisFlagStale}, 0, 0, 0) 115 //attachCommandExtra("ReplConf", 3, []string{redisFlagReadonly, redisFlagAdmin, redisFlagNoScript}, 0, 0, 0, nil) 116 117 // transaction command 118 registerSpecialCommand("Multi", 1, 0). 119 attachCommandExtra([]string{redisFlagNoScript, redisFlagFast}, 0, 0, 0) 120 registerSpecialCommand("Discard", 1, 0). 121 attachCommandExtra([]string{redisFlagNoScript, redisFlagFast}, 0, 0, 0) 122 registerSpecialCommand("Exec", 1, 0). 123 attachCommandExtra([]string{redisFlagNoScript, redisFlagSkipMonitor}, 0, 0, 0) 124 registerSpecialCommand("Watch", 1, 0). 125 attachCommandExtra([]string{redisFlagNoScript, redisFlagFast}, 1, -1, 1) 126 }