summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2015-09-22 09:42:46 +0200
committerantirez <antirez@gmail.com>2015-10-01 13:02:24 +0200
commit4a18352877488c2e3af801f9302ceac7ce6c627b (patch)
tree3d30b3c7ba8575983134553841aec7630f12ef22
parent777396aeba81c2346041d5d1a4b507693d6177e2 (diff)
downloadredis-4a18352877488c2e3af801f9302ceac7ce6c627b.tar.gz
Lazyfree: Hash converted to use plain SDS WIP 3.
-rw-r--r--src/db.c8
-rw-r--r--src/t_hash.c41
2 files changed, 20 insertions, 29 deletions
diff --git a/src/db.c b/src/db.c
index aa7be75ee..893bc96c4 100644
--- a/src/db.c
+++ b/src/db.c
@@ -418,10 +418,10 @@ void scanCallback(void *privdata, const dictEntry *de) {
sds keysds = dictGetKey(de);
key = createStringObject(keysds,sdslen(keysds));
} else if (o->type == OBJ_HASH) {
- key = dictGetKey(de);
- incrRefCount(key);
- val = dictGetVal(de);
- incrRefCount(val);
+ sds sdskey = dictGetKey(de);
+ sds sdsval = dictGetVal(de);
+ key = createStringObject(keysds,sdslen(keysds));
+ val = createStringObject(valsds,sdslen(valsds));
} else if (o->type == OBJ_ZSET) {
sds keysds = dictGetKey(de);
key = createStringObject(keysds,sdslen(keysds));
diff --git a/src/t_hash.c b/src/t_hash.c
index eaf4d245c..d3892f3b7 100644
--- a/src/t_hash.c
+++ b/src/t_hash.c
@@ -545,8 +545,6 @@ void hincrbyCommand(client *c) {
server.dirty++;
}
-/* XXX From here. */
-
void hincrbyfloatCommand(client *c) {
double value, incr;
long long ll;
@@ -593,7 +591,9 @@ void hincrbyfloatCommand(client *c) {
decrRefCount(newobj);
}
-static void addHashFieldToReply(client *c, robj *o, robj *field) {
+/* XXX From here. */
+
+static void addHashFieldToReply(client *c, robj *o, sds field) {
int ret;
if (o == NULL) {
@@ -618,15 +618,11 @@ static void addHashFieldToReply(client *c, robj *o, robj *field) {
}
} else if (o->encoding == OBJ_ENCODING_HT) {
- robj *value;
-
- ret = hashTypeGetFromHashTable(o, field, &value);
- if (ret < 0) {
+ sds value = hashTypeGetFromHashTable(o, field);
+ if (value == NULL)
addReply(c, shared.nullbulk);
- } else {
- addReplyBulk(c, value);
- }
-
+ else
+ addReplyBulkCBuffer(c, value, sdslen(value));
} else {
serverPanic("Unknown hash encoding");
}
@@ -638,7 +634,7 @@ void hgetCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.nullbulk)) == NULL ||
checkType(c,o,OBJ_HASH)) return;
- addHashFieldToReply(c, o, c->argv[2]);
+ addHashFieldToReply(c, o, c->argv[2]->ptr);
}
void hmgetCommand(client *c) {
@@ -655,7 +651,7 @@ void hmgetCommand(client *c) {
addReplyMultiBulkLen(c, c->argc-2);
for (i = 2; i < c->argc; i++) {
- addHashFieldToReply(c, o, c->argv[i]);
+ addHashFieldToReply(c, o, c->argv[i]->ptr);
}
}
@@ -667,7 +663,7 @@ void hdelCommand(client *c) {
checkType(c,o,OBJ_HASH)) return;
for (j = 2; j < c->argc; j++) {
- if (hashTypeDelete(o,c->argv[j])) {
+ if (hashTypeDelete(o,c->argv[j]->ptr)) {
deleted++;
if (hashTypeLength(o) == 0) {
dbDelete(c->db,c->argv[1]);
@@ -701,7 +697,7 @@ void hstrlenCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,o,OBJ_HASH)) return;
- addReplyLongLong(c,hashTypeGetValueLength(o,c->argv[2]));
+ addReplyLongLong(c,hashTypeGetValueLength(o,c->argv[2]->ptr));
}
static void addHashIteratorCursorToReply(client *c, hashTypeIterator *hi, int what) {
@@ -711,18 +707,13 @@ static void addHashIteratorCursorToReply(client *c, hashTypeIterator *hi, int wh
long long vll = LLONG_MAX;
hashTypeCurrentFromZiplist(hi, what, &vstr, &vlen, &vll);
- if (vstr) {
+ if (vstr)
addReplyBulkCBuffer(c, vstr, vlen);
- } else {
+ else
addReplyBulkLongLong(c, vll);
- }
-
} else if (hi->encoding == OBJ_ENCODING_HT) {
- robj *value;
-
- hashTypeCurrentFromHashTable(hi, what, &value);
- addReplyBulk(c, value);
-
+ sds value = hashTypeCurrentFromHashTable(hi, what);
+ addReplyBulkCBuffer(c, value, sdslen(value));
} else {
serverPanic("Unknown hash encoding");
}
@@ -776,7 +767,7 @@ void hexistsCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,o,OBJ_HASH)) return;
- addReply(c, hashTypeExists(o,c->argv[2]) ? shared.cone : shared.czero);
+ addReply(c, hashTypeExists(o,c->argv[2]->ptr) ? shared.cone : shared.czero);
}
void hscanCommand(client *c) {