]> git.saurik.com Git - redis.git/commitdiff
ZSCORE implemented
authorantirez <antirez@gmail.com>
Tue, 27 Oct 2009 00:06:49 +0000 (01:06 +0100)
committerantirez <antirez@gmail.com>
Tue, 27 Oct 2009 00:06:49 +0000 (01:06 +0100)
TODO
redis-cli.c
redis.c

diff --git a/TODO b/TODO
index d95fb898801300f3cd15ca24210b30f086d56d5e..41f30741ae9f6c4b046b5e4ffd892c4f0ec9bb6b 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 missing stuff: ZINCRBY, ZSCORE, ZREVRANGE, ZRANGEBYSCORE
+* ZSETs missing stuff: 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 46450f6b3669057cde0a3fca37271c8b7df4e039..6639e82247681ea09f2741fe43b672dc45e98ef2 100644 (file)
@@ -95,6 +95,7 @@ static struct redisCommand cmdTable[] = {
     {"zrangebyscore",4,REDIS_CMD_INLINE},
     {"zrevrange",4,REDIS_CMD_INLINE},
     {"zlen",2,REDIS_CMD_INLINE},
+    {"zscore",3,REDIS_CMD_BULK},
     {"incrby",3,REDIS_CMD_INLINE},
     {"decrby",3,REDIS_CMD_INLINE},
     {"getset",3,REDIS_CMD_BULK},
diff --git a/redis.c b/redis.c
index 3afceec01e640602e1d144f6068d1846b8e2535e..509d2f0851999a9ba3525f3690e1e30baedc1ac5 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -448,6 +448,7 @@ static void zrangebyscoreCommand(redisClient *c);
 static void zrevrangeCommand(redisClient *c);
 static void zlenCommand(redisClient *c);
 static void zremCommand(redisClient *c);
+static void zscoreCommand(redisClient *c);
 
 /*================================= Globals ================================= */
 
@@ -492,6 +493,7 @@ static struct redisCommand cmdTable[] = {
     {"zrangebyscore",zrangebyscoreCommand,4,REDIS_CMD_INLINE},
     {"zrevrange",zrevrangeCommand,4,REDIS_CMD_INLINE},
     {"zlen",zlenCommand,2,REDIS_CMD_INLINE},
+    {"zscore",zscoreCommand,3,REDIS_CMD_BULK|REDIS_CMD_DENYOOM},
     {"incrby",incrbyCommand,3,REDIS_CMD_INLINE|REDIS_CMD_DENYOOM},
     {"decrby",decrbyCommand,3,REDIS_CMD_INLINE|REDIS_CMD_DENYOOM},
     {"getset",getsetCommand,3,REDIS_CMD_BULK|REDIS_CMD_DENYOOM},
@@ -4159,6 +4161,36 @@ static void zlenCommand(redisClient *c) {
     }
 }
 
+static void zscoreCommand(redisClient *c) {
+    robj *o;
+    zset *zs;
+    
+    o = lookupKeyRead(c->db,c->argv[1]);
+    if (o == NULL) {
+        addReply(c,shared.czero);
+        return;
+    } else {
+        if (o->type != REDIS_ZSET) {
+            addReply(c,shared.wrongtypeerr);
+        } else {
+            dictEntry *de;
+
+            zs = o->ptr;
+            de = dictFind(zs->dict,c->argv[2]);
+            if (!de) {
+                addReply(c,shared.nullbulk);
+            } else {
+                char buf[128];
+                double *score = dictGetEntryVal(de);
+
+                snprintf(buf,sizeof(buf),"%.16g",*score);
+                addReplySds(c,sdscatprintf(sdsempty(),"$%d\r\n%s\r\n",
+                    strlen(buf),buf));
+            }
+        }
+    }
+}
+
 /* ========================= Non type-specific commands  ==================== */
 
 static void flushdbCommand(redisClient *c) {