From b135813110db7de8625bd2902e49afd971af9756 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 5 Jun 2016 17:45:22 +0200 Subject: Skip internal keys by default while scanning. --- common/storage.h | 2 +- common/storage_lmdb.cpp | 26 +++++++++++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) (limited to 'common') diff --git a/common/storage.h b/common/storage.h index 2661439..a04969b 100644 --- a/common/storage.h +++ b/common/storage.h @@ -87,7 +87,7 @@ public: * @return The number of values retrieved. */ int scan(const QByteArray &key, const std::function &resultHandler, - const std::function &errorHandler = std::function(), bool findSubstringKeys = false) const; + const std::function &errorHandler = std::function(), bool findSubstringKeys = false, bool skipInternalKeys = true) const; /** * Finds the last value in a series matched by prefix. diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp index b39f7df..aeb4dd6 100644 --- a/common/storage_lmdb.cpp +++ b/common/storage_lmdb.cpp @@ -179,7 +179,7 @@ void Storage::NamedDatabase::remove(const QByteArray &k, const QByteArray &value } int Storage::NamedDatabase::scan(const QByteArray &k, const std::function &resultHandler, - const std::function &errorHandler, bool findSubstringKeys) const + const std::function &errorHandler, bool findSubstringKeys, bool skipInternalKeys) const { if (!d || !d->transaction) { // Not an error. We rely on this to read nothing from non-existing databases. @@ -209,10 +209,14 @@ int Storage::NamedDatabase::scan(const QByteArray &k, const std::functionallowDuplicates && !findSubstringKeys) ? MDB_NEXT_DUP : MDB_NEXT; while ((rc = mdb_cursor_get(cursor, &key, &data, nextOp)) == 0) { - // Every consequent lookup simply iterates through the list - if (QByteArray::fromRawData((char *)key.mv_data, key.mv_size).startsWith(k)) { - numberOfRetrievedValues++; - if (!resultHandler(QByteArray::fromRawData((char *)key.mv_data, key.mv_size), QByteArray::fromRawData((char *)data.mv_data, data.mv_size))) { - break; + const auto current = QByteArray::fromRawData((char *)key.mv_data, key.mv_size); + // Every consequitive lookup simply iterates through the list + if (current.startsWith(k)) { + const bool callResultHandler = !(skipInternalKeys && isInternalKey(current)); + if (callResultHandler) { + numberOfRetrievedValues++; + if (!resultHandler(current, QByteArray::fromRawData((char *)data.mv_data, data.mv_size))) { + break; + } } } } -- cgit v1.2.3