]> git.saurik.com Git - redis.git/commitdiff
SETNX and MSETNX now respect the delete-on-write operation of EXPIREing keys
authorantirez <antirez@gmail.com>
Sun, 6 Dec 2009 00:09:15 +0000 (01:09 +0100)
committerantirez <antirez@gmail.com>
Sun, 6 Dec 2009 00:09:15 +0000 (01:09 +0100)
redis.c

diff --git a/redis.c b/redis.c
index c6f7b57501eb3ef25634b90befe4c12bb2aaece6..650c7a5c488f3f84aedc9e065ecd5a66bf1f2a80 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -2978,6 +2978,7 @@ static void echoCommand(redisClient *c) {
 static void setGenericCommand(redisClient *c, int nx) {
     int retval;
 
 static void setGenericCommand(redisClient *c, int nx) {
     int retval;
 
+    lookupKeyWrite(c->db,c->argv[1]);
     retval = dictAdd(c->db->dict,c->argv[1],c->argv[2]);
     if (retval == DICT_ERR) {
         if (!nx) {
     retval = dictAdd(c->db->dict,c->argv[1],c->argv[2]);
     if (retval == DICT_ERR) {
         if (!nx) {
@@ -3053,7 +3054,7 @@ static void mgetCommand(redisClient *c) {
 }
 
 static void msetGenericCommand(redisClient *c, int nx) {
 }
 
 static void msetGenericCommand(redisClient *c, int nx) {
-    int j;
+    int j, busykeys = 0;
 
     if ((c->argc % 2) == 0) {
         addReplySds(c,sdsnew("-ERR wrong number of arguments\r\n"));
 
     if ((c->argc % 2) == 0) {
         addReplySds(c,sdsnew("-ERR wrong number of arguments\r\n"));
@@ -3063,12 +3064,15 @@ static void msetGenericCommand(redisClient *c, int nx) {
      * set nothing at all if at least one already key exists. */
     if (nx) {
         for (j = 1; j < c->argc; j += 2) {
      * set nothing at all if at least one already key exists. */
     if (nx) {
         for (j = 1; j < c->argc; j += 2) {
-            if (dictFind(c->db->dict,c->argv[j]) != NULL) {
-                addReply(c, shared.czero);
-                return;
+            if (lookupKeyWrite(c->db,c->argv[j]) != NULL) {
+                busykeys++;
             }
         }
     }
             }
         }
     }
+    if (busykeys) {
+        addReply(c, shared.czero);
+        return;
+    }
 
     for (j = 1; j < c->argc; j += 2) {
         int retval;
 
     for (j = 1; j < c->argc; j += 2) {
         int retval;