mirror of
https://github.com/fluencelabs/redis
synced 2025-03-17 16:10:50 +00:00
COMMAND: fix argument parsing.
This fixes detection of wrong subcommand (that resulted in the default all-commands output instead) and allows COMMAND INFO to be called without arguments (resulting into an empty array) which is useful in programmtically generated calls like the following (in Ruby): redis.commands("command","info",*mycommands) Note: mycommands may be empty.
This commit is contained in:
parent
7fd0149d34
commit
a92ae77740
23
src/redis.c
23
src/redis.c
@ -2403,6 +2403,7 @@ void timeCommand(redisClient *c) {
|
||||
}
|
||||
|
||||
|
||||
/* Helper function for addReplyCommand() to output flags. */
|
||||
int addReplyCommandFlag(redisClient *c, struct redisCommand *cmd, int f, char *reply) {
|
||||
if (cmd->flags & f) {
|
||||
addReplyStatus(c, reply);
|
||||
@ -2411,6 +2412,7 @@ int addReplyCommandFlag(redisClient *c, struct redisCommand *cmd, int f, char *r
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Output the representation of a Redis command. Used by the COMMAND command. */
|
||||
void addReplyCommand(redisClient *c, struct redisCommand *cmd) {
|
||||
if (!cmd) {
|
||||
addReply(c, shared.nullbulk);
|
||||
@ -2446,26 +2448,27 @@ void addReplyCommand(redisClient *c, struct redisCommand *cmd) {
|
||||
}
|
||||
}
|
||||
|
||||
/* COMMAND <subcommand> <args> */
|
||||
void commandCommand(redisClient *c) {
|
||||
dictIterator *di;
|
||||
dictEntry *de;
|
||||
|
||||
if (c->argc > 2 && !strcasecmp(c->argv[1]->ptr, "info")) {
|
||||
int i;
|
||||
addReplyMultiBulkLen(c, c->argc-2);
|
||||
for (i = 2; i < c->argc; i++) {
|
||||
addReplyCommand(c, dictFetchValue(server.commands, c->argv[i]->ptr));
|
||||
}
|
||||
} else if (c->argc > 2) {
|
||||
addReplyError(c, "Unknown subcommand.");
|
||||
return;
|
||||
} else {
|
||||
if (c->argc == 1) {
|
||||
addReplyMultiBulkLen(c, dictSize(server.commands));
|
||||
di = dictGetIterator(server.commands);
|
||||
while ((de = dictNext(di)) != NULL) {
|
||||
addReplyCommand(c, dictGetVal(de));
|
||||
}
|
||||
dictReleaseIterator(di);
|
||||
} else if (!strcasecmp(c->argv[1]->ptr, "info")) {
|
||||
int i;
|
||||
addReplyMultiBulkLen(c, c->argc-2);
|
||||
for (i = 2; i < c->argc; i++) {
|
||||
addReplyCommand(c, dictFetchValue(server.commands, c->argv[i]->ptr));
|
||||
}
|
||||
} else {
|
||||
addReplyError(c, "Unknown subcommand.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user