From 17f41d49b48554a613f30d3239fbf608dba460aa Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 19 Apr 2011 16:38:12 +0200 Subject: [PATCH] variadic SADD backported from unstable --- src/redis.c | 2 +- src/t_set.c | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/redis.c b/src/redis.c index 94bd1688..8e60c151 100644 --- a/src/redis.c +++ b/src/redis.c @@ -102,7 +102,7 @@ struct redisCommand readonlyCommandTable[] = { {"ltrim",ltrimCommand,4,0,NULL,1,1,1}, {"lrem",lremCommand,4,0,NULL,1,1,1}, {"rpoplpush",rpoplpushCommand,3,REDIS_CMD_DENYOOM,NULL,1,2,1}, - {"sadd",saddCommand,3,REDIS_CMD_DENYOOM,NULL,1,1,1}, + {"sadd",saddCommand,-3,REDIS_CMD_DENYOOM,NULL,1,1,1}, {"srem",sremCommand,3,0,NULL,1,1,1}, {"smove",smoveCommand,4,0,NULL,1,2,1}, {"sismember",sismemberCommand,3,0,NULL,1,1,1}, diff --git a/src/t_set.c b/src/t_set.c index 3255b580..f3ebd856 100644 --- a/src/t_set.c +++ b/src/t_set.c @@ -218,9 +218,9 @@ void setTypeConvert(robj *setobj, int enc) { void saddCommand(redisClient *c) { robj *set; + int j, added = 0; set = lookupKeyWrite(c->db,c->argv[1]); - c->argv[2] = tryObjectEncoding(c->argv[2]); if (set == NULL) { set = setTypeCreate(c->argv[2]); dbAdd(c->db,c->argv[1],set); @@ -230,13 +230,14 @@ void saddCommand(redisClient *c) { return; } } - if (setTypeAdd(set,c->argv[2])) { - signalModifiedKey(c->db,c->argv[1]); - server.dirty++; - addReply(c,shared.cone); - } else { - addReply(c,shared.czero); + + for (j = 2; j < c->argc; j++) { + c->argv[j] = tryObjectEncoding(c->argv[j]); + if (setTypeAdd(set,c->argv[j])) added++; } + if (added) touchWatchedKey(c->db,c->argv[1]); + server.dirty += added; + addReplyLongLong(c,added); } void sremCommand(redisClient *c) {