]> git.saurik.com Git - redis.git/commitdiff
ZREM implemented
authorantirez <antirez@gmail.com>
Mon, 26 Oct 2009 11:04:42 +0000 (12:04 +0100)
committerantirez <antirez@gmail.com>
Mon, 26 Oct 2009 11:04:42 +0000 (12:04 +0100)
TODO
client-libraries/tcl/redis.tcl
redis-cli.c
redis.c

diff --git a/TODO b/TODO
index bb2c7f9186f5b475f6dc204bfb07cd7092b7625d..62a28a83d0bde5e30e75b6be48c1891b83a9b2af 100644 (file)
--- a/TODO
+++ b/TODO
@@ -3,7 +3,7 @@ Pre 1.1 todo
 * For now only the last argument gets integer encoded, so make sure that: 1) every multi bulk commands implemented will have the last arg that is indeed a value, and not used otherwise. 2) to explicitly call the function to encode the object in MSET and other commands where there are multiple "values".
 * Man pages for MSET MSETNX and SRANDMEMBER.
 * Hashes (HSET, HGET, HEXISTS, HLEN, ...).
-* ZSETs
+* ZSETs: ZADD, ZRANGE, ZDEL, ZINCRBY, ZSCORE.
 * An utility able to export an .rdb file into a text-only JSON dump, we can't live anymore without such a tool. Probably an extension to redis-cli.
 
 After 1.1 todo
index 86b7eb485588a22600d974de816f97a184d8e89e..8bca7886b28471f89b9616cacffd607c968bf7e2 100644 (file)
@@ -20,7 +20,7 @@ array set ::redis::multibulkarg {}
 
 # Flag commands requiring last argument as a bulk write operation
 foreach redis_bulk_cmd {
-    set setnx rpush lpush lset lrem sadd srem sismember echo getset smove zadd
+    set setnx rpush lpush lset lrem sadd srem sismember echo getset smove zadd zrem
 } {
     set ::redis::bulkarg($redis_bulk_cmd) {}
 }
index dc16617f61f1c44c964b573c88ed1843e5a8147f..a5608cad5f9afdaac7010fdebf11737278180e67 100644 (file)
@@ -90,6 +90,7 @@ static struct redisCommand cmdTable[] = {
     {"sdiffstore",-3,REDIS_CMD_INLINE},
     {"smembers",2,REDIS_CMD_INLINE},
     {"zadd",4,REDIS_CMD_BULK},
+    {"zrem",3,REDIS_CMD_BULK},
     {"zrange",4,REDIS_CMD_INLINE},
     {"zlen",2,REDIS_CMD_INLINE},
     {"incrby",3,REDIS_CMD_INLINE},
diff --git a/redis.c b/redis.c
index ee99792bbd084d91e6be38e9083733e1c9cb6535..83318443171228bfe700088940f37f430c5e08c4 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -436,6 +436,7 @@ static void msetnxCommand(redisClient *c);
 static void zaddCommand(redisClient *c);
 static void zrangeCommand(redisClient *c);
 static void zlenCommand(redisClient *c);
+static void zremCommand(redisClient *c);
 
 /*================================= Globals ================================= */
 
@@ -475,6 +476,7 @@ static struct redisCommand cmdTable[] = {
     {"sdiffstore",sdiffstoreCommand,-3,REDIS_CMD_INLINE|REDIS_CMD_DENYOOM},
     {"smembers",sinterCommand,2,REDIS_CMD_INLINE},
     {"zadd",zaddCommand,4,REDIS_CMD_BULK|REDIS_CMD_DENYOOM},
+    {"zrem",zremCommand,3,REDIS_CMD_BULK},
     {"zrange",zrangeCommand,4,REDIS_CMD_INLINE},
     {"zlen",zlenCommand,2,REDIS_CMD_INLINE},
     {"incrby",incrbyCommand,3,REDIS_CMD_INLINE|REDIS_CMD_DENYOOM},
@@ -3853,6 +3855,41 @@ static void zaddCommand(redisClient *c) {
     }
 }
 
+static void zremCommand(redisClient *c) {
+    robj *zsetobj;
+    zset *zs;
+
+    zsetobj = lookupKeyWrite(c->db,c->argv[1]);
+    if (zsetobj == NULL) {
+        addReply(c,shared.czero);
+    } else {
+        dictEntry *de;
+        double *oldscore;
+        int deleted;
+
+        if (zsetobj->type != REDIS_ZSET) {
+            addReply(c,shared.wrongtypeerr);
+            return;
+        }
+        zs = zsetobj->ptr;
+        de = dictFind(zs->dict,c->argv[2]);
+        if (de == NULL) {
+            addReply(c,shared.czero);
+            return;
+        }
+        /* Delete from the skiplist */
+        oldscore = dictGetEntryVal(de);
+        deleted = zslDelete(zs->zsl,*oldscore,c->argv[2]);
+        assert(deleted != 0);
+
+        /* Delete from the hash table */
+        dictDelete(zs->dict,c->argv[2]);
+        if (htNeedsResize(zs->dict)) dictResize(zs->dict);
+        server.dirty++;
+        addReply(c,shared.cone);
+    }
+}
+
 static void zrangeCommand(redisClient *c) {
     robj *o;
     int start = atoi(c->argv[2]->ptr);
@@ -4980,6 +5017,7 @@ static struct redisFunctionSym symsTable[] = {
 {"createZsetObject",(unsigned long)createZsetObject},
 {"zaddCommand",(unsigned long)zaddCommand},
 {"zrangeCommand",(unsigned long)zrangeCommand},
+{"zremCommand",(unsigned long)zremCommand},
 {NULL,0}
 };