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  }