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) {
|
int addReplyCommandFlag(redisClient *c, struct redisCommand *cmd, int f, char *reply) {
|
||||||
if (cmd->flags & f) {
|
if (cmd->flags & f) {
|
||||||
addReplyStatus(c, reply);
|
addReplyStatus(c, reply);
|
||||||
@ -2411,6 +2412,7 @@ int addReplyCommandFlag(redisClient *c, struct redisCommand *cmd, int f, char *r
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Output the representation of a Redis command. Used by the COMMAND command. */
|
||||||
void addReplyCommand(redisClient *c, struct redisCommand *cmd) {
|
void addReplyCommand(redisClient *c, struct redisCommand *cmd) {
|
||||||
if (!cmd) {
|
if (!cmd) {
|
||||||
addReply(c, shared.nullbulk);
|
addReply(c, shared.nullbulk);
|
||||||
@ -2446,26 +2448,27 @@ void addReplyCommand(redisClient *c, struct redisCommand *cmd) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* COMMAND <subcommand> <args> */
|
||||||
void commandCommand(redisClient *c) {
|
void commandCommand(redisClient *c) {
|
||||||
dictIterator *di;
|
dictIterator *di;
|
||||||
dictEntry *de;
|
dictEntry *de;
|
||||||
|
|
||||||
if (c->argc > 2 && !strcasecmp(c->argv[1]->ptr, "info")) {
|
if (c->argc == 1) {
|
||||||
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 {
|
|
||||||
addReplyMultiBulkLen(c, dictSize(server.commands));
|
addReplyMultiBulkLen(c, dictSize(server.commands));
|
||||||
di = dictGetIterator(server.commands);
|
di = dictGetIterator(server.commands);
|
||||||
while ((de = dictNext(di)) != NULL) {
|
while ((de = dictNext(di)) != NULL) {
|
||||||
addReplyCommand(c, dictGetVal(de));
|
addReplyCommand(c, dictGetVal(de));
|
||||||
}
|
}
|
||||||
dictReleaseIterator(di);
|
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