X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/f858c11d7d9ca79010dd46a9c8c625e63a9a3ec0..b08c9dd28032a207a67773caf5d93616ff82a23f:/src/t_hash.c diff --git a/src/t_hash.c b/src/t_hash.c index 838f29dd..83ca5b27 100644 --- a/src/t_hash.c +++ b/src/t_hash.c @@ -219,8 +219,8 @@ int hashTypeCurrent(hashTypeIterator *hi, int what, robj **objval, unsigned char * reference is retained. */ robj *hashTypeCurrentObject(hashTypeIterator *hi, int what) { robj *obj; - unsigned char *v; - unsigned int vlen; + unsigned char *v = NULL; + unsigned int vlen = 0; int encoding = hashTypeCurrent(hi,what,&obj,&v,&vlen); if (encoding == REDIS_ENCODING_HT) { @@ -279,7 +279,7 @@ void hsetCommand(redisClient *c) { hashTypeTryObjectEncoding(o,&c->argv[2], &c->argv[3]); update = hashTypeSet(o,c->argv[2],c->argv[3]); addReply(c, update ? shared.czero : shared.cone); - touchWatchedKey(c->db,c->argv[1]); + signalModifiedKey(c->db,c->argv[1]); server.dirty++; } @@ -294,7 +294,7 @@ void hsetnxCommand(redisClient *c) { hashTypeTryObjectEncoding(o,&c->argv[2], &c->argv[3]); hashTypeSet(o,c->argv[2],c->argv[3]); addReply(c, shared.cone); - touchWatchedKey(c->db,c->argv[1]); + signalModifiedKey(c->db,c->argv[1]); server.dirty++; } } @@ -315,7 +315,7 @@ void hmsetCommand(redisClient *c) { hashTypeSet(o,c->argv[i],c->argv[i+1]); } addReply(c, shared.ok); - touchWatchedKey(c->db,c->argv[1]); + signalModifiedKey(c->db,c->argv[1]); server.dirty++; } @@ -342,7 +342,7 @@ void hincrbyCommand(redisClient *c) { hashTypeSet(o,c->argv[2],new); decrRefCount(new); addReplyLongLong(c,value); - touchWatchedKey(c->db,c->argv[1]); + signalModifiedKey(c->db,c->argv[1]); server.dirty++; } @@ -396,17 +396,25 @@ 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); - touchWatchedKey(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])) { + deleted++; + if (hashTypeLength(o) == 0) { + dbDelete(c->db,c->argv[1]); + break; + } + } + } + if (deleted) { + signalModifiedKey(c->db,c->argv[1]); + server.dirty += deleted; } + addReplyLongLong(c,deleted); } void hlenCommand(redisClient *c) { @@ -430,8 +438,8 @@ void genericHgetallCommand(redisClient *c, int flags) { hi = hashTypeInitIterator(o); while (hashTypeNext(hi) != REDIS_ERR) { robj *obj; - unsigned char *v; - unsigned int vlen; + unsigned char *v = NULL; + unsigned int vlen = 0; int encoding; if (flags & REDIS_HASH_KEY) {