From: Jay Freeman (saurik) Date: Sun, 23 Dec 2012 12:17:20 +0000 (+0000) Subject: Query the archive to provide a complete KEYS list. X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain Query the archive to provide a complete KEYS list. --- diff --git a/src/db.c b/src/db.c index 067a0247..da22cc98 100644 --- a/src/db.c +++ b/src/db.c @@ -317,6 +317,9 @@ void keysCommand(redisClient *c) { } } dictReleaseIterator(di); + + rummage(c, &numkeys); + setDeferredMultiBulkLength(c,replylen,numkeys); } diff --git a/src/migrate.c b/src/migrate.c index 05a48a22..a998c5f0 100644 --- a/src/migrate.c +++ b/src/migrate.c @@ -430,3 +430,34 @@ void purge(robj *key) { mdb_txn_commit(txn); } + +int rummage(redisClient *c, unsigned long *numkeys) { + if (server.mdb_state == REDIS_MDB_OFF) + return REDIS_OK; + + int ret; + + MDB_txn *txn; + ret = mdb_txn_begin(env, NULL, 0, &txn); + if (ret != 0) + return REDIS_ERR; + + MDB_cursor *cursor; + ret = mdb_cursor_open(txn, dbi, &cursor); + if (ret != 0) { + mdb_txn_abort(txn); + return REDIS_ERR; + } + + MDB_val kval; + while ((ret = mdb_cursor_get(cursor, &kval, NULL, MDB_NEXT)) == 0) { + robj *key = createStringObject(kval.mv_data, kval.mv_size); + addReplyBulk(c, key); + ++*numkeys; + decrRefCount(key); + } + + mdb_cursor_close(cursor); + mdb_txn_abort(txn); + return REDIS_OK; +} diff --git a/src/redis.h b/src/redis.h index 92598b03..76d5cef0 100644 --- a/src/redis.h +++ b/src/redis.h @@ -1040,6 +1040,7 @@ int startKeyArchive(void); robj *recover(redisDb *db, robj *key); int archive(redisDb *db, robj *key); void purge(robj *key); +int rummage(redisClient *c, unsigned long *numkeys); /* API to get key arguments from commands */ #define REDIS_GETKEYS_ALL 0