Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
500ece7c
Commit
500ece7c
authored
Mar 24, 2010
by
antirez
Browse files
CONFIG command implemened -- just a start but already useful
parent
bc86d88e
Changes
2
Show whitespace changes
Inline
Side-by-side
redis-cli.c
View file @
500ece7c
...
@@ -157,6 +157,7 @@ static struct redisCommand cmdTable[] = {
...
@@ -157,6 +157,7 @@ static struct redisCommand cmdTable[] = {
{
"hvals"
,
2
,
REDIS_CMD_INLINE
},
{
"hvals"
,
2
,
REDIS_CMD_INLINE
},
{
"hgetall"
,
2
,
REDIS_CMD_INLINE
},
{
"hgetall"
,
2
,
REDIS_CMD_INLINE
},
{
"hexists"
,
3
,
REDIS_CMD_BULK
},
{
"hexists"
,
3
,
REDIS_CMD_BULK
},
{
"config"
,
-
2
,
REDIS_CMD_BULK
},
{
NULL
,
0
,
0
}
{
NULL
,
0
,
0
}
};
};
...
...
redis.c
View file @
500ece7c
...
@@ -696,6 +696,7 @@ static void hkeysCommand(redisClient *c);
...
@@ -696,6 +696,7 @@ static void hkeysCommand(redisClient *c);
static void hvalsCommand(redisClient *c);
static void hvalsCommand(redisClient *c);
static void hgetallCommand(redisClient *c);
static void hgetallCommand(redisClient *c);
static void hexistsCommand(redisClient *c);
static void hexistsCommand(redisClient *c);
static void configCommand(redisClient *c);
/*================================= Globals ================================= */
/*================================= Globals ================================= */
...
@@ -797,6 +798,7 @@ static struct redisCommand cmdTable[] = {
...
@@ -797,6 +798,7 @@ static struct redisCommand cmdTable[] = {
{"ttl",ttlCommand,2,REDIS_CMD_INLINE,NULL,1,1,1},
{"ttl",ttlCommand,2,REDIS_CMD_INLINE,NULL,1,1,1},
{"slaveof",slaveofCommand,3,REDIS_CMD_INLINE,NULL,0,0,0},
{"slaveof",slaveofCommand,3,REDIS_CMD_INLINE,NULL,0,0,0},
{"debug",debugCommand,-2,REDIS_CMD_INLINE,NULL,0,0,0},
{"debug",debugCommand,-2,REDIS_CMD_INLINE,NULL,0,0,0},
{"config",configCommand,-2,REDIS_CMD_BULK,NULL,0,0,0},
{NULL,NULL,0,0,NULL,0,0,0}
{NULL,NULL,0,0,NULL,0,0,0}
};
};
...
@@ -805,7 +807,7 @@ static void usage();
...
@@ -805,7 +807,7 @@ static void usage();
/*============================ Utility functions ============================ */
/*============================ Utility functions ============================ */
/* Glob-style pattern matching. */
/* Glob-style pattern matching. */
int
stringmatchlen
(
const
char
*
pattern
,
int
patternLen
,
static
int stringmatchlen(const char *pattern, int patternLen,
const char *string, int stringLen, int nocase)
const char *string, int stringLen, int nocase)
{
{
while(patternLen) {
while(patternLen) {
...
@@ -927,6 +929,10 @@ int stringmatchlen(const char *pattern, int patternLen,
...
@@ -927,6 +929,10 @@ int stringmatchlen(const char *pattern, int patternLen,
return 0;
return 0;
}
}
static int stringmatch(const char *pattern, const char *string, int nocase) {
return stringmatchlen(pattern,strlen(pattern),string,strlen(string),nocase);
}
static void redisLog(int level, const char *fmt, ...) {
static void redisLog(int level, const char *fmt, ...) {
va_list ap;
va_list ap;
FILE *fp;
FILE *fp;
...
@@ -1495,9 +1501,9 @@ static void initServerConfig() {
...
@@ -1495,9 +1501,9 @@ static void initServerConfig() {
server.lastfsync = time(NULL);
server.lastfsync = time(NULL);
server.appendfd = -1;
server.appendfd = -1;
server.appendseldb = -1; /* Make sure the first time will not match */
server.appendseldb = -1; /* Make sure the first time will not match */
server
.
pidfile
=
"/var/run/redis.pid"
;
server.pidfile =
zstrdup(
"/var/run/redis.pid"
)
;
server
.
dbfilename
=
"dump.rdb"
;
server.dbfilename =
zstrdup(
"dump.rdb"
)
;
server
.
appendfilename
=
"appendonly.aof"
;
server.appendfilename =
zstrdup(
"appendonly.aof"
)
;
server.requirepass = NULL;
server.requirepass = NULL;
server.shareobjects = 0;
server.shareobjects = 0;
server.rdbcompression = 1;
server.rdbcompression = 1;
...
@@ -1762,8 +1768,10 @@ static void loadServerConfig(char *filename) {
...
@@ -1762,8 +1768,10 @@ static void loadServerConfig(char *filename) {
} else if (!strcasecmp(argv[0],"requirepass") && argc == 2) {
} else if (!strcasecmp(argv[0],"requirepass") && argc == 2) {
server.requirepass = zstrdup(argv[1]);
server.requirepass = zstrdup(argv[1]);
} else if (!strcasecmp(argv[0],"pidfile") && argc == 2) {
} else if (!strcasecmp(argv[0],"pidfile") && argc == 2) {
zfree(server.pidfile);
server.pidfile = zstrdup(argv[1]);
server.pidfile = zstrdup(argv[1]);
} else if (!strcasecmp(argv[0],"dbfilename") && argc == 2) {
} else if (!strcasecmp(argv[0],"dbfilename") && argc == 2) {
zfree(server.dbfilename);
server.dbfilename = zstrdup(argv[1]);
server.dbfilename = zstrdup(argv[1]);
} else if (!strcasecmp(argv[0],"vm-enabled") && argc == 2) {
} else if (!strcasecmp(argv[0],"vm-enabled") && argc == 2) {
if ((server.vm_enabled = yesnotoi(argv[1])) == -1) {
if ((server.vm_enabled = yesnotoi(argv[1])) == -1) {
...
@@ -2560,6 +2568,17 @@ static void addReplyBulk(redisClient *c, robj *obj) {
...
@@ -2560,6 +2568,17 @@ static void addReplyBulk(redisClient *c, robj *obj) {
addReply(c,shared.crlf);
addReply(c,shared.crlf);
}
}
/* In the CONFIG command we need to add vanilla C string as bulk replies */
static void addReplyBulkCString(redisClient *c, char *s) {
if (s == NULL) {
addReply(c,shared.nullbulk);
} else {
robj *o = createStringObject(s,strlen(s));
addReplyBulk(c,o);
decrRefCount(o);
}
}
static void acceptHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
static void acceptHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
int cport, cfd;
int cport, cfd;
char cip[128];
char cip[128];
...
@@ -6126,6 +6145,10 @@ static void flushdbCommand(redisClient *c) {
...
@@ -6126,6 +6145,10 @@ static void flushdbCommand(redisClient *c) {
static void flushallCommand(redisClient *c) {
static void flushallCommand(redisClient *c) {
server.dirty += emptyDb();
server.dirty += emptyDb();
addReply(c,shared.ok);
addReply(c,shared.ok);
if (server.bgsavechildpid != -1) {
kill(server.bgsavechildpid,SIGKILL);
rdbRemoveTempFile(server.bgsavechildpid);
}
rdbSave(server.dbfilename);
rdbSave(server.dbfilename);
server.dirty++;
server.dirty++;
}
}
...
@@ -9043,6 +9066,94 @@ static void handleClientsBlockedOnSwappedKey(redisDb *db, robj *key) {
...
@@ -9043,6 +9066,94 @@ static void handleClientsBlockedOnSwappedKey(redisDb *db, robj *key) {
}
}
}
}
/* =========================== Remote Configuration ========================= */
static void configSetCommand(redisClient *c) {
robj *o = getDecodedObject(c->argv[3]);
if (!strcasecmp(c->argv[2]->ptr,"dbfilename")) {
zfree(server.dbfilename);
server.dbfilename = zstrdup(o->ptr);
} else if (!strcasecmp(c->argv[2]->ptr,"requirepass")) {
zfree(server.requirepass);
server.requirepass = zstrdup(o->ptr);
} else if (!strcasecmp(c->argv[2]->ptr,"masterauth")) {
zfree(server.masterauth);
server.masterauth = zstrdup(o->ptr);
} else if (!strcasecmp(c->argv[2]->ptr,"maxmemory")) {
server.maxmemory = strtoll(o->ptr, NULL, 10);
} else {
addReplySds(c,sdscatprintf(sdsempty(),
"-ERR not supported CONFIG parameter %s\r\n",
(char*)c->argv[2]->ptr));
decrRefCount(o);
return;
}
decrRefCount(o);
addReply(c,shared.ok);
}
static void configGetCommand(redisClient *c) {
robj *o = getDecodedObject(c->argv[2]);
robj *lenobj = createObject(REDIS_STRING,NULL);
char *pattern = o->ptr;
int matches = 0;
addReply(c,lenobj);
decrRefCount(lenobj);
if (stringmatch(pattern,"dbfilename",0)) {
addReplyBulkCString(c,"dbfilename");
addReplyBulkCString(c,server.dbfilename);
matches++;
}
if (stringmatch(pattern,"requirepass",0)) {
addReplyBulkCString(c,"requirepass");
addReplyBulkCString(c,server.requirepass);
matches++;
}
if (stringmatch(pattern,"masterauth",0)) {
addReplyBulkCString(c,"masterauth");
addReplyBulkCString(c,server.masterauth);
matches++;
}
if (stringmatch(pattern,"maxmemory",0)) {
char buf[128];
snprintf(buf,128,"%llu\n",server.maxmemory);
addReplyBulkCString(c,"maxmemory");
addReplyBulkCString(c,buf);
matches++;
}
decrRefCount(o);
lenobj->ptr = sdscatprintf(sdsempty(),"*%d\r\n",matches*2);
}
static void configCommand(redisClient *c) {
if (!strcasecmp(c->argv[1]->ptr,"set")) {
if (c->argc != 4) goto badarity;
configSetCommand(c);
} else if (!strcasecmp(c->argv[1]->ptr,"get")) {
if (c->argc != 3) goto badarity;
configGetCommand(c);
} else if (!strcasecmp(c->argv[1]->ptr,"resetstat")) {
if (c->argc != 2) goto badarity;
server.stat_numcommands = 0;
server.stat_numconnections = 0;
server.stat_expiredkeys = 0;
server.stat_starttime = time(NULL);
addReply(c,shared.ok);
} else {
addReplySds(c,sdscatprintf(sdsempty(),
"-ERR CONFIG subcommand must be one of GET, SET, RESETSTAT\r\n"));
}
return;
badarity:
addReplySds(c,sdscatprintf(sdsempty(),
"-ERR Wrong number of arguments for CONFIG %s\r\n",
(char*) c->argv[1]->ptr));
}
/* ================================= Debugging ============================== */
/* ================================= Debugging ============================== */
static void debugCommand(redisClient *c) {
static void debugCommand(redisClient *c) {
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment