diff --git a/src/t_hash.c b/src/t_hash.c index 7f33bba0c..c228765db 100644 --- a/src/t_hash.c +++ b/src/t_hash.c @@ -130,7 +130,6 @@ robj *hashTypeGetObject(robj *o, robj *field) { value = createStringObjectFromLongLong(vll); } } - } else if (o->encoding == REDIS_ENCODING_HT) { robj *aux; @@ -144,6 +143,29 @@ robj *hashTypeGetObject(robj *o, robj *field) { return value; } +/* Higher level function using hashTypeGet*() to return the length of the + * object associated with the requested field, or 0 if the field does not + * exist. */ +size_t hashTypeGetValueLength(robj *o, robj *field) { + size_t len = 0; + if (o->encoding == REDIS_ENCODING_ZIPLIST) { + unsigned char *vstr = NULL; + unsigned int vlen = UINT_MAX; + long long vll = LLONG_MAX; + + if (hashTypeGetFromZiplist(o, field, &vstr, &vlen, &vll) == 0) + len = vstr ? vlen : sdigits10(vll); + } else if (o->encoding == REDIS_ENCODING_HT) { + robj *aux; + + if (hashTypeGetFromHashTable(o, field, &aux) == 0) + len = sdslen(aux->ptr); + } else { + redisPanic("Unknown hash encoding"); + } + return len; +} + /* Test if the specified field exists in the given hash. Returns 1 if the field * exists, and 0 when it doesn't. */ int hashTypeExists(robj *o, robj *field) {