]> git.saurik.com Git - redis.git/commitdiff
GETSET implemented
authorantirez <antirez@gmail.com>
Tue, 28 Apr 2009 12:42:55 +0000 (14:42 +0200)
committerantirez <antirez@gmail.com>
Tue, 28 Apr 2009 12:42:55 +0000 (14:42 +0200)
redis-cli.c
redis.c

index 78173c143acf059038b285a0a688a2ed5af22c23..2d5eda9850b5508f59184d99e059a8bdd9de2bb8 100644 (file)
@@ -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 b40320de5f67b32066ea204f96e57341469cf0e2..15589be7c222085d3baa47ee8333d6ec91608d26 100644 (file)
--- 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;