From a431eb74ba7162f575792efc1586b0eaf62eaca7 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 28 Apr 2009 14:42:55 +0200 Subject: [PATCH] GETSET implemented --- redis-cli.c | 1 + redis.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/redis-cli.c b/redis-cli.c index 78173c14..2d5eda98 100644 --- a/redis-cli.c +++ b/redis-cli.c @@ -85,6 +85,7 @@ static struct redisCommand cmdTable[] = { {"smembers",2,REDIS_CMD_INLINE}, {"incrby",3,REDIS_CMD_INLINE}, {"decrby",3,REDIS_CMD_INLINE}, + {"getset",3,REDIS_CMD_BULK}, {"randomkey",1,REDIS_CMD_INLINE}, {"select",2,REDIS_CMD_INLINE}, {"move",3,REDIS_CMD_INLINE}, diff --git a/redis.c b/redis.c index b40320de..15589be7 100644 --- a/redis.c +++ b/redis.c @@ -356,6 +356,7 @@ static void infoCommand(redisClient *c); static void mgetCommand(redisClient *c); static void monitorCommand(redisClient *c); static void expireCommand(redisClient *c); +static void getSetCommand(redisClient *c); /*================================= Globals ================================= */ @@ -391,6 +392,7 @@ static struct redisCommand cmdTable[] = { {"smembers",sinterCommand,2,REDIS_CMD_INLINE}, {"incrby",incrbyCommand,3,REDIS_CMD_INLINE}, {"decrby",decrbyCommand,3,REDIS_CMD_INLINE}, + {"getset",getSetCommand,3,REDIS_CMD_BULK}, {"randomkey",randomkeyCommand,1,REDIS_CMD_INLINE}, {"select",selectCommand,2,REDIS_CMD_INLINE}, {"move",moveCommand,3,REDIS_CMD_INLINE}, @@ -2174,6 +2176,18 @@ static void getCommand(redisClient *c) { } } +static void getSetCommand(redisClient *c) { + getCommand(c); + if (dictAdd(c->db->dict,c->argv[1],c->argv[2]) == DICT_ERR) { + dictReplace(c->db->dict,c->argv[1],c->argv[2]); + } else { + incrRefCount(c->argv[1]); + } + incrRefCount(c->argv[2]); + server.dirty++; + removeExpire(c->db,c->argv[1]); +} + static void mgetCommand(redisClient *c) { int j;