From 752da584f016a2d27496dea655f4e20bd2ff9578 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 22 Dec 2009 16:09:27 -0500 Subject: [PATCH] ZRANGE, ZREVRANGE now support WITHSCORES options --- redis-cli.c | 4 ++-- redis.c | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/redis-cli.c b/redis-cli.c index 32e77e4c..ca1b581b 100644 --- a/redis-cli.c +++ b/redis-cli.c @@ -96,9 +96,9 @@ static struct redisCommand cmdTable[] = { {"zincrby",4,REDIS_CMD_BULK}, {"zrem",3,REDIS_CMD_BULK}, {"zremrangebyscore",4,REDIS_CMD_INLINE}, - {"zrange",4,REDIS_CMD_INLINE}, + {"zrange",-4,REDIS_CMD_INLINE}, {"zrangebyscore",-4,REDIS_CMD_INLINE}, - {"zrevrange",4,REDIS_CMD_INLINE}, + {"zrevrange",-4,REDIS_CMD_INLINE}, {"zcard",2,REDIS_CMD_INLINE}, {"zscore",3,REDIS_CMD_BULK}, {"incrby",3,REDIS_CMD_INLINE}, diff --git a/redis.c b/redis.c index 91c28a0c..3da76bb3 100644 --- a/redis.c +++ b/redis.c @@ -536,9 +536,9 @@ static struct redisCommand cmdTable[] = { {"zincrby",zincrbyCommand,4,REDIS_CMD_BULK|REDIS_CMD_DENYOOM}, {"zrem",zremCommand,3,REDIS_CMD_BULK}, {"zremrangebyscore",zremrangebyscoreCommand,4,REDIS_CMD_INLINE}, - {"zrange",zrangeCommand,4,REDIS_CMD_INLINE}, + {"zrange",zrangeCommand,-4,REDIS_CMD_INLINE}, {"zrangebyscore",zrangebyscoreCommand,-4,REDIS_CMD_INLINE}, - {"zrevrange",zrevrangeCommand,4,REDIS_CMD_INLINE}, + {"zrevrange",zrevrangeCommand,-4,REDIS_CMD_INLINE}, {"zcard",zcardCommand,2,REDIS_CMD_INLINE}, {"zscore",zscoreCommand,3,REDIS_CMD_BULK|REDIS_CMD_DENYOOM}, {"incrby",incrbyCommand,3,REDIS_CMD_INLINE|REDIS_CMD_DENYOOM}, @@ -4531,6 +4531,14 @@ static void zrangeGenericCommand(redisClient *c, int reverse) { robj *o; int start = atoi(c->argv[2]->ptr); int end = atoi(c->argv[3]->ptr); + int withscores = 0; + + if (c->argc == 5 && !strcasecmp(c->argv[4]->ptr,"withscores")) { + withscores = 1; + } else if (c->argc >= 5) { + addReply(c,shared.syntaxerr); + return; + } o = lookupKeyRead(c->db,c->argv[1]); if (o == NULL) { @@ -4573,12 +4581,15 @@ static void zrangeGenericCommand(redisClient *c, int reverse) { ln = ln->forward[0]; } - addReplySds(c,sdscatprintf(sdsempty(),"*%d\r\n",rangelen)); + addReplySds(c,sdscatprintf(sdsempty(),"*%d\r\n", + withscores ? (rangelen*2) : rangelen)); for (j = 0; j < rangelen; j++) { ele = ln->obj; addReplyBulkLen(c,ele); addReply(c,ele); addReply(c,shared.crlf); + if (withscores) + addReplyDouble(c,ln->score); ln = reverse ? ln->backward : ln->forward[0]; } }