Commit 06455014 authored by antirez's avatar antirez
Browse files

scanGenericCommand() refactoring and handling of integer encoded elements.

This commit fixes issue #1354.
parent 141f30f4
...@@ -470,15 +470,28 @@ void scanGenericCommand(redisClient *c, robj *o) { ...@@ -470,15 +470,28 @@ void scanGenericCommand(redisClient *c, robj *o) {
while (node) { while (node) {
robj *kobj = listNodeValue(node); robj *kobj = listNodeValue(node);
nextnode = listNextNode(node); nextnode = listNextNode(node);
int filter = 0;
/* Filter element if it does not match the pattern. */
if (!filter && !patnoop) {
if (sdsEncodedObject(kobj)) {
if (!stringmatchlen(pat, patlen, kobj->ptr, sdslen(kobj->ptr), 0))
filter = 1;
} else {
char buf[REDIS_LONGSTR_SIZE];
int len;
redisAssert(kobj->encoding == REDIS_ENCODING_INT);
len = ll2string(buf,sizeof(buf),(long)kobj->ptr);
if (!stringmatchlen(pat, patlen, buf, len, 0)) filter = 1;
}
}
/* Keep key iff pattern matches and, if we are iterating the key /* Filter element if it is an expired key. */
* space, check that the key hasn't expired. */ if (!filter && o == NULL && expireIfNeeded(c->db, kobj)) filter = 1;
if ((patnoop ||
stringmatchlen(pat, patlen, kobj->ptr, sdslen(kobj->ptr), 0)) && /* Remove the element and its associted value if needed. */
(o != NULL || expireIfNeeded(c->db, kobj) == 0)) if (filter) {
{
/* Keep */
} else {
decrRefCount(kobj); decrRefCount(kobj);
listDelNode(keys, node); listDelNode(keys, node);
/* Also remove the value for hashes and sorted sets. */ /* Also remove the value for hashes and sorted sets. */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment