summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Noordhuis <pcnoordhuis@gmail.com>2010-04-17 12:33:43 +0200
committerPieter Noordhuis <pcnoordhuis@gmail.com>2010-04-17 12:33:43 +0200
commit97224de7f962f8c39cb357969f83378d12d25f96 (patch)
treedf65d6fce46b1b15005e7d750e9af5d5cc57aa70
parentc651fd9ee3ce3d1dca7cc8dbf7648cd588255bd9 (diff)
downloadredis-97224de7f962f8c39cb357969f83378d12d25f96.tar.gz
strip tryObjectEncoding from hashSet, to enable the arguments being encoded in-place
-rw-r--r--redis.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/redis.c b/redis.c
index 90fe5e80d..75159e4ec 100644
--- a/redis.c
+++ b/redis.c
@@ -6068,6 +6068,14 @@ static void hashTryConversion(robj *subject, robj **argv, int start, int end) {
}
}
+/* Encode given objects in-place when the hash uses a dict. */
+static void hashTryObjectEncoding(robj *subject, robj **o1, robj **o2) {
+ if (subject->encoding == REDIS_ENCODING_HT) {
+ *o1 = tryObjectEncoding(*o1);
+ *o2 = tryObjectEncoding(*o2);
+ }
+}
+
/* Get the value from a hash identified by key. Returns either a string
* object or NULL if the value cannot be found. The refcount of the object
* is always increased by 1 when the value was found. */
@@ -6126,7 +6134,6 @@ static int hashSet(robj *o, robj *key, robj *value) {
if (zipmapLen(o->ptr) > server.hash_max_zipmap_entries)
convertToRealHash(o);
} else {
- value = tryObjectEncoding(value);
if (dictReplace(o->ptr,key,value)) {
/* Insert */
incrRefCount(key);
@@ -6250,6 +6257,7 @@ static void hsetCommand(redisClient *c) {
if ((o = hashLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
hashTryConversion(o,c->argv,2,3);
+ hashTryObjectEncoding(o,&c->argv[2], &c->argv[3]);
update = hashSet(o,c->argv[2],c->argv[3]);
addReply(c, update ? shared.czero : shared.cone);
server.dirty++;
@@ -6263,6 +6271,7 @@ static void hsetnxCommand(redisClient *c) {
if (hashExists(o, c->argv[2])) {
addReply(c, shared.czero);
} else {
+ hashTryObjectEncoding(o,&c->argv[2], &c->argv[3]);
hashSet(o,c->argv[2],c->argv[3]);
addReply(c, shared.cone);
server.dirty++;
@@ -6281,6 +6290,7 @@ static void hmsetCommand(redisClient *c) {
if ((o = hashLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
hashTryConversion(o,c->argv,2,c->argc-1);
for (i = 2; i < c->argc; i += 2) {
+ hashTryObjectEncoding(o,&c->argv[i], &c->argv[i+1]);
hashSet(o,c->argv[i],c->argv[i+1]);
}
addReply(c, shared.ok);