variadic HDEL with tests

This commit is contained in:
antirez 2011-04-19 17:07:55 +02:00
parent 271f087842
commit 64a13a36e6
3 changed files with 22 additions and 8 deletions

View File

@ -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},

View File

@ -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);
signalModifiedKey(c->db,c->argv[1]);
server.dirty++;
} else {
addReply(c,shared.czero);
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 += deleted;
}
addReplyLongLong(c,deleted);
}
void hlenCommand(redisClient *c) {

View File

@ -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]