]> git.saurik.com Git - redis.git/commitdiff
Add DISCARD command to discard queued MULTI commands.
authorDamian Janowski <damian.janowski@gmail.com>
Sun, 28 Feb 2010 02:36:19 +0000 (23:36 -0300)
committerantirez <antirez@gmail.com>
Mon, 1 Mar 2010 22:29:48 +0000 (23:29 +0100)
redis.c
test-redis.tcl

diff --git a/redis.c b/redis.c
index 52ada3801afd7895b240fa24bca1e05cb8cee3b2..319a0afff0aea1adb46954e5fb5e022e17e0027d 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -653,6 +653,7 @@ static void zscoreCommand(redisClient *c);
 static void zremrangebyscoreCommand(redisClient *c);
 static void multiCommand(redisClient *c);
 static void execCommand(redisClient *c);
+static void discardCommand(redisClient *c);
 static void blpopCommand(redisClient *c);
 static void brpopCommand(redisClient *c);
 static void appendCommand(redisClient *c);
@@ -733,6 +734,7 @@ static struct redisCommand cmdTable[] = {
     {"type",typeCommand,2,REDIS_CMD_INLINE,1,1,1},
     {"multi",multiCommand,1,REDIS_CMD_INLINE,0,0,0},
     {"exec",execCommand,1,REDIS_CMD_INLINE,0,0,0},
+    {"discard",discardCommand,1,REDIS_CMD_INLINE,0,0,0},
     {"sync",syncCommand,1,REDIS_CMD_INLINE,0,0,0},
     {"flushdb",flushdbCommand,1,REDIS_CMD_INLINE,0,0,0},
     {"flushall",flushallCommand,1,REDIS_CMD_INLINE,0,0,0},
@@ -2141,7 +2143,7 @@ static int processCommand(redisClient *c) {
     }
 
     /* Exec the command */
-    if (c->flags & REDIS_MULTI && cmd->proc != execCommand) {
+    if (c->flags & REDIS_MULTI && cmd->proc != execCommand && cmd->proc != discardCommand) {
         queueMultiCommand(c,cmd);
         addReply(c,shared.queued);
     } else {
@@ -6051,6 +6053,18 @@ static void multiCommand(redisClient *c) {
     addReply(c,shared.ok);
 }
 
+static void discardCommand(redisClient *c) {
+    if (!(c->flags & REDIS_MULTI)) {
+        addReplySds(c,sdsnew("-ERR DISCARD without MULTI\r\n"));
+        return;
+    }
+
+    freeClientMultiState(c);
+    initClientMultiState(c);
+    c->flags &= (~REDIS_MULTI);
+    addReply(c,shared.ok);
+}
+
 static void execCommand(redisClient *c) {
     int j;
     robj **orig_argv;
index 36b82e38156eff1db0d64d51a1c3f508bf5ae566..83dfd0b4a2db6233a33188a1ee313d78ef4f6bba 100644 (file)
@@ -1663,6 +1663,18 @@ proc main {server port} {
         list $v1 $v2 $v3
     } {QUEUED QUEUED {{a b c} PONG}}
 
+    test {DISCARD} {
+        $r del mylist
+        $r rpush mylist a
+        $r rpush mylist b
+        $r rpush mylist c
+        $r multi
+        set v1 [$r del mylist]
+        set v2 [$r discard]
+        set v3 [$r lrange mylist 0 -1]
+        list $v1 $v2 $v3
+    } {QUEUED OK {a b c}}
+
     test {APPEND basics} {
         list [$r append foo bar] [$r get foo] \
              [$r append foo 100] [$r get foo]