/* A non copy-on-write friendly but higher level version of hashTypeCurrent*() * that returns an object with incremented refcount (or a new object). It is up * to the caller to decrRefCount() the object if no reference is retained. */ robj *hashTypeCurrentObject(hashTypeIterator *hi, int what) { robj *dst; if (hi->encoding == REDIS_ENCODING_ZIPLIST) { unsigned char *vstr = NULL; unsigned int vlen = UINT_MAX; long long vll = LLONG_MAX; hashTypeCurrentFromZiplist(hi, what, &vstr, &vlen, &vll); if (vstr) { dst = createStringObject((char*)vstr, vlen); } else { dst = createStringObjectFromLongLong(vll); } } else if (hi->encoding == REDIS_ENCODING_HT) { hashTypeCurrentFromHashTable(hi, what, &dst); incrRefCount(dst); } else { logicError("Unknown hash encoding"); } return dst; }
/* Write either the key or the value of the currently selected item of an hash. * The 'hi' argument passes a valid Redis hash iterator. * The 'what' filed specifies if to write a key or a value and can be * either REDIS_HASH_KEY or REDIS_HASH_VALUE. * * The function returns 0 on error, non-zero on success. */ static int rioWriteHashIteratorCursor(rio *r, hashTypeIterator *hi, int what) { if (hi->encoding == REDIS_ENCODING_ZIPLIST) { unsigned char *vstr = NULL; unsigned int vlen = UINT_MAX; long long vll = LLONG_MAX; hashTypeCurrentFromZiplist(hi, what, &vstr, &vlen, &vll); if (vstr) { return rioWriteBulkString(r, (char*)vstr, vlen); } else { return rioWriteBulkLongLong(r, vll); } } else if (hi->encoding == REDIS_ENCODING_HT) { robj *value; hashTypeCurrentFromHashTable(hi, what, &value); return rioWriteBulkObject(r, value); } redisPanic("Unknown hash encoding"); return 0; }