/* Emit the commands needed to rebuild a hash object. * The function returns 0 on error, 1 on success. */ int rewriteHashObject(rio *r, robj *key, robj *o) { hashTypeIterator *hi; long long count = 0, items = hashTypeLength(o); hi = hashTypeInitIterator(o); while (hashTypeNext(hi) != REDIS_ERR) { if (count == 0) { int cmd_items = (items > REDIS_AOF_REWRITE_ITEMS_PER_CMD) ? REDIS_AOF_REWRITE_ITEMS_PER_CMD : items; if (rioWriteBulkCount(r,'*',2+cmd_items*2) == 0) return 0; if (rioWriteBulkString(r,"HMSET",5) == 0) return 0; if (rioWriteBulkObject(r,key) == 0) return 0; } if (rioWriteHashIteratorCursor(r, hi, REDIS_HASH_KEY) == 0) return 0; if (rioWriteHashIteratorCursor(r, hi, REDIS_HASH_VALUE) == 0) return 0; if (++count == REDIS_AOF_REWRITE_ITEMS_PER_CMD) count = 0; items--; } hashTypeReleaseIterator(hi); return 1; }
void hashTypeConvertZiplist(robj *o, int enc) { logicErrorExpr(o->encoding == REDIS_ENCODING_ZIPLIST, "Invalid type"); if (enc == REDIS_ENCODING_ZIPLIST) { /* Nothing to do... */ } else if (enc == REDIS_ENCODING_HT) { hashTypeIterator *hi; dict *dict; int ret; hi = hashTypeInitIterator(o); dict = dictCreate(&hashDictType, NULL); while (hashTypeNext(hi) != REDIS_ERR) { robj *field, *value; field = hashTypeCurrentObject(hi, REDIS_HASH_KEY); field = tryObjectEncoding(field); value = hashTypeCurrentObject(hi, REDIS_HASH_VALUE); value = tryObjectEncoding(value); ret = dictAdd(dict, field, value); if (ret != DICT_OK) { // redisLogHexDump(REDIS_WARNING,"ziplist with dup elements dump", // o->ptr,ziplistBlobLen(o->ptr)); logicErrorExpr(ret == DICT_OK, "Never happend"); } } hashTypeReleaseIterator(hi); zfree(o->ptr); o->encoding = REDIS_ENCODING_HT; o->ptr = dict; } else { logicError("Unknown hash encoding"); } }