]> git.saurik.com Git - redis.git/commitdiff
Query the archive to provide a complete KEYS list. master
authorJay Freeman (saurik) <saurik@saurik.com>
Sun, 23 Dec 2012 12:17:20 +0000 (12:17 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Sun, 23 Dec 2012 12:17:20 +0000 (12:17 +0000)
src/db.c
src/migrate.c
src/redis.h

index 067a024716b69091c3edbef2848bb3bf05d156e9..da22cc9806db11bf44a86e791d19e933c6e4dd02 100644 (file)
--- 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);
 }
 
index 05a48a228fe33574d84c940c0533166af238bbaa..a998c5f08841e65703949bdbd626b66e4b2cab20 100644 (file)
@@ -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;
+}
index 92598b03af60d72ec8431b4b3e32c758bbf788ba..76d5cef09f02e46a494eae14359ca377c44ab7a1 100644 (file)
@@ -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