Lazyfree: Hash converted to use plain SDS WIP 3.

This commit is contained in:
antirez 2015-09-22 09:42:46 +02:00
parent 777396aeba
commit 4a18352877
2 changed files with 20 additions and 29 deletions

View File

@ -418,10 +418,10 @@ void scanCallback(void *privdata, const dictEntry *de) {
sds keysds = dictGetKey(de); sds keysds = dictGetKey(de);
key = createStringObject(keysds,sdslen(keysds)); key = createStringObject(keysds,sdslen(keysds));
} else if (o->type == OBJ_HASH) { } else if (o->type == OBJ_HASH) {
key = dictGetKey(de); sds sdskey = dictGetKey(de);
incrRefCount(key); sds sdsval = dictGetVal(de);
val = dictGetVal(de); key = createStringObject(keysds,sdslen(keysds));
incrRefCount(val); val = createStringObject(valsds,sdslen(valsds));
} else if (o->type == OBJ_ZSET) { } else if (o->type == OBJ_ZSET) {
sds keysds = dictGetKey(de); sds keysds = dictGetKey(de);
key = createStringObject(keysds,sdslen(keysds)); key = createStringObject(keysds,sdslen(keysds));

View File

@ -545,8 +545,6 @@ void hincrbyCommand(client *c) {
server.dirty++; server.dirty++;
} }
/* XXX From here. */
void hincrbyfloatCommand(client *c) { void hincrbyfloatCommand(client *c) {
double value, incr; double value, incr;
long long ll; long long ll;
@ -593,7 +591,9 @@ void hincrbyfloatCommand(client *c) {
decrRefCount(newobj); 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; int ret;
if (o == NULL) { if (o == NULL) {
@ -618,15 +618,11 @@ static void addHashFieldToReply(client *c, robj *o, robj *field) {
} }
} else if (o->encoding == OBJ_ENCODING_HT) { } else if (o->encoding == OBJ_ENCODING_HT) {
robj *value; sds value = hashTypeGetFromHashTable(o, field);
if (value == NULL)
ret = hashTypeGetFromHashTable(o, field, &value);
if (ret < 0) {
addReply(c, shared.nullbulk); addReply(c, shared.nullbulk);
} else { else
addReplyBulk(c, value); addReplyBulkCBuffer(c, value, sdslen(value));
}
} else { } else {
serverPanic("Unknown hash encoding"); serverPanic("Unknown hash encoding");
} }
@ -638,7 +634,7 @@ void hgetCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.nullbulk)) == NULL || if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.nullbulk)) == NULL ||
checkType(c,o,OBJ_HASH)) return; checkType(c,o,OBJ_HASH)) return;
addHashFieldToReply(c, o, c->argv[2]); addHashFieldToReply(c, o, c->argv[2]->ptr);
} }
void hmgetCommand(client *c) { void hmgetCommand(client *c) {
@ -655,7 +651,7 @@ void hmgetCommand(client *c) {
addReplyMultiBulkLen(c, c->argc-2); addReplyMultiBulkLen(c, c->argc-2);
for (i = 2; i < c->argc; i++) { 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; checkType(c,o,OBJ_HASH)) return;
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
if (hashTypeDelete(o,c->argv[j])) { if (hashTypeDelete(o,c->argv[j]->ptr)) {
deleted++; deleted++;
if (hashTypeLength(o) == 0) { if (hashTypeLength(o) == 0) {
dbDelete(c->db,c->argv[1]); dbDelete(c->db,c->argv[1]);
@ -701,7 +697,7 @@ void hstrlenCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL || if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,o,OBJ_HASH)) return; 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) { 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; long long vll = LLONG_MAX;
hashTypeCurrentFromZiplist(hi, what, &vstr, &vlen, &vll); hashTypeCurrentFromZiplist(hi, what, &vstr, &vlen, &vll);
if (vstr) { if (vstr)
addReplyBulkCBuffer(c, vstr, vlen); addReplyBulkCBuffer(c, vstr, vlen);
} else { else
addReplyBulkLongLong(c, vll); addReplyBulkLongLong(c, vll);
}
} else if (hi->encoding == OBJ_ENCODING_HT) { } else if (hi->encoding == OBJ_ENCODING_HT) {
robj *value; sds value = hashTypeCurrentFromHashTable(hi, what);
addReplyBulkCBuffer(c, value, sdslen(value));
hashTypeCurrentFromHashTable(hi, what, &value);
addReplyBulk(c, value);
} else { } else {
serverPanic("Unknown hash encoding"); serverPanic("Unknown hash encoding");
} }
@ -776,7 +767,7 @@ void hexistsCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL || if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,o,OBJ_HASH)) return; 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) { void hscanCommand(client *c) {