From 64a13a36e685c318319a70b775f91f2c34bcc34f Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 19 Apr 2011 17:07:55 +0200 Subject: [PATCH] variadic HDEL with tests --- src/redis.c | 2 +- src/t_hash.c | 17 +++++++++++------ tests/unit/type/hash.tcl | 9 +++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/redis.c b/src/redis.c index 5f07903c..bf9ced2c 100644 --- a/src/redis.c +++ b/src/redis.c @@ -138,7 +138,7 @@ struct redisCommand redisCommandTable[] = { {"hmset",hmsetCommand,-4,REDIS_CMD_DENYOOM,NULL,1,1,1,0,0}, {"hmget",hmgetCommand,-3,0,NULL,1,1,1,0,0}, {"hincrby",hincrbyCommand,4,REDIS_CMD_DENYOOM,NULL,1,1,1,0,0}, - {"hdel",hdelCommand,3,0,NULL,1,1,1,0,0}, + {"hdel",hdelCommand,-3,0,NULL,1,1,1,0,0}, {"hlen",hlenCommand,2,0,NULL,1,1,1,0,0}, {"hkeys",hkeysCommand,2,0,NULL,1,1,1,0,0}, {"hvals",hvalsCommand,2,0,NULL,1,1,1,0,0}, diff --git a/src/t_hash.c b/src/t_hash.c index 5e7525bd..4b9b37d6 100644 --- a/src/t_hash.c +++ b/src/t_hash.c @@ -396,17 +396,22 @@ void hmgetCommand(redisClient *c) { void hdelCommand(redisClient *c) { robj *o; + int j, deleted = 0; + if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL || checkType(c,o,REDIS_HASH)) return; - if (hashTypeDelete(o,c->argv[2])) { - if (hashTypeLength(o) == 0) dbDelete(c->db,c->argv[1]); - addReply(c,shared.cone); + for (j = 2; j < c->argc; j++) { + if (hashTypeDelete(o,c->argv[j])) { + if (hashTypeLength(o) == 0) dbDelete(c->db,c->argv[1]); + deleted++; + } + } + if (deleted) { signalModifiedKey(c->db,c->argv[1]); - server.dirty++; - } else { - addReply(c,shared.czero); + server.dirty += deleted; } + addReplyLongLong(c,deleted); } void hlenCommand(redisClient *c) { diff --git a/tests/unit/type/hash.tcl b/tests/unit/type/hash.tcl index 8559dc3c..9b043d3f 100644 --- a/tests/unit/type/hash.tcl +++ b/tests/unit/type/hash.tcl @@ -226,6 +226,15 @@ start_server {tags {"hash"}} { set _ $rv } {0 0 1 0 {} 1 0 {}} + test {HDEL - more than a single value} { + set rv {} + r del myhash + r hmset myhash a 1 b 2 c 3 + assert_equal 0 [r hdel myhash x y] + assert_equal 2 [r hdel myhash a c f] + r hgetall myhash + } {b 2} + test {HEXISTS} { set rv {} set k [lindex [array names smallhash *] 0] -- 2.45.2