Hi,
I have been looking at structuring the command processing in memcached
slightly.
I am thinking about creating an array with info about available commands:
static struct {
char *cmdword; /* Command word string */
int cmd; /* Command shorthand */
int mintokens; /* Minimum number of tokens (required) */
int maxtokens; /* Maximum number of tokens (zero means no
limit) */
} cmds[] = {
{"get", CMD_GET, 3, 0},
{"delete", CMD_DELETE, 3, 5},
{"add", CMD_ADD, 6, 7},
{"set", CMD_SET, 6, 7},
{"replace", CMD_REPLACE, 6, 7},
{"prepend", CMD_PREPEND, 6, 7},
{"append", CMD_APPEND, 6, 7},
{"gets", CMD_GETS, 3, 0},
{"cas", CMD_CAS, 7, 8},
{"incr", CMD_INCR, 4, 5},
{"decr", CMD_DECR, 4, 5},
{"bget", CMD_BGET, 3, 0},
{"own", CMD_OWN, 3, 3},
{"disown", CMD_DISOWN, 3, 3},
{"bg", CMD_BG, 3, 3},
{"stats", CMD_STATS, 2, 0},
{"flush_all", CMD_FLUSH, 2, 4},
{"version", CMD_VERSION, 2, 2},
{"quit", CMD_QUIT, 2, 2},
{"slabs", CMD_SLABS, 5, 5}, /* Next token should be
"reassign" */
{"verbosity", CMD_VERBOSITY, 3, 4},
{NULL, -1, 0, 0} /* Terminate with a NULL
string pointer */
};
I have tried to sort the presumably most frequent commands first.
process_commands() will then do:
ntokens = tokenize_command(command, tokens, MAX_TOKENS);
for (i = 0; cmds[i].cmdword != NULL; i++) {
if (strcmp(tokens[COMMAND_TOKEN].value, cmds[i].cmdword) == 0) {
cmd = cmds[i].cmd;
break;
}
}
if (cmd < 0) {
out_string(c, "ERROR"); /* Token not matched */
return;
}
if (ntokens < cmds[i].mintokens ||
(cmds[i].maxtokens > 0 && ntokens > cmds[i].maxtokens)) {
out_string(c, "ERROR"); /* Invalid number of
tokens for this cmd */
return;
}
c->item_comm = cmd; /* Command being
processed on connection */
switch (cmd) {
case CMD_GET:
case CMD_BGET:
process_get_command(c, tokens, ntokens, false);
break;
...
Does this look interesting to you guys?
Before I go any further with this, is there any other information that
should be used to characterize commands?
Are there commands that are not in use (BGET?)
More?
Thanks,
Roy