summaryrefslogtreecommitdiffstats
path: root/common/storage_lmdb.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2016-06-05 17:45:22 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2016-06-05 17:45:22 +0200
commitb135813110db7de8625bd2902e49afd971af9756 (patch)
tree2eb1329ea0458db8207e469bc3a3d496b72076e6 /common/storage_lmdb.cpp
parent245dc57adedb0c8225aee0066c39f5ea38a39610 (diff)
downloadsink-b135813110db7de8625bd2902e49afd971af9756.tar.gz
sink-b135813110db7de8625bd2902e49afd971af9756.zip
Skip internal keys by default while scanning.
Diffstat (limited to 'common/storage_lmdb.cpp')
-rw-r--r--common/storage_lmdb.cpp26
1 files changed, 17 insertions, 9 deletions
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
179} 179}
180 180
181int Storage::NamedDatabase::scan(const QByteArray &k, const std::function<bool(const QByteArray &key, const QByteArray &value)> &resultHandler, 181int Storage::NamedDatabase::scan(const QByteArray &k, const std::function<bool(const QByteArray &key, const QByteArray &value)> &resultHandler,
182 const std::function<void(const Storage::Error &error)> &errorHandler, bool findSubstringKeys) const 182 const std::function<void(const Storage::Error &error)> &errorHandler, bool findSubstringKeys, bool skipInternalKeys) const
183{ 183{
184 if (!d || !d->transaction) { 184 if (!d || !d->transaction) {
185 // Not an error. We rely on this to read nothing from non-existing databases. 185 // 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::function<bool(c
209 op = MDB_SET_RANGE; 209 op = MDB_SET_RANGE;
210 } 210 }
211 if ((rc = mdb_cursor_get(cursor, &key, &data, op)) == 0) { 211 if ((rc = mdb_cursor_get(cursor, &key, &data, op)) == 0) {
212 const auto current = QByteArray::fromRawData((char *)key.mv_data, key.mv_size);
212 // The first lookup will find a key that is equal or greather than our key 213 // The first lookup will find a key that is equal or greather than our key
213 if (QByteArray::fromRawData((char *)key.mv_data, key.mv_size).startsWith(k)) { 214 if (current.startsWith(k)) {
214 numberOfRetrievedValues++; 215 const bool callResultHandler = !(skipInternalKeys && isInternalKey(current));
215 if (resultHandler(QByteArray::fromRawData((char *)key.mv_data, key.mv_size), QByteArray::fromRawData((char *)data.mv_data, data.mv_size))) { 216 if (callResultHandler) {
217 numberOfRetrievedValues++;
218 }
219 if (!callResultHandler || resultHandler(current, QByteArray::fromRawData((char *)data.mv_data, data.mv_size))) {
216 if (findSubstringKeys) { 220 if (findSubstringKeys) {
217 // Reset the key to what we search for 221 // Reset the key to what we search for
218 key.mv_data = (void *)k.constData(); 222 key.mv_data = (void *)k.constData();
@@ -220,11 +224,15 @@ int Storage::NamedDatabase::scan(const QByteArray &k, const std::function<bool(c
220 } 224 }
221 MDB_cursor_op nextOp = (d->allowDuplicates && !findSubstringKeys) ? MDB_NEXT_DUP : MDB_NEXT; 225 MDB_cursor_op nextOp = (d->allowDuplicates && !findSubstringKeys) ? MDB_NEXT_DUP : MDB_NEXT;
222 while ((rc = mdb_cursor_get(cursor, &key, &data, nextOp)) == 0) { 226 while ((rc = mdb_cursor_get(cursor, &key, &data, nextOp)) == 0) {
223 // Every consequent lookup simply iterates through the list 227 const auto current = QByteArray::fromRawData((char *)key.mv_data, key.mv_size);
224 if (QByteArray::fromRawData((char *)key.mv_data, key.mv_size).startsWith(k)) { 228 // Every consequitive lookup simply iterates through the list
225 numberOfRetrievedValues++; 229 if (current.startsWith(k)) {
226 if (!resultHandler(QByteArray::fromRawData((char *)key.mv_data, key.mv_size), QByteArray::fromRawData((char *)data.mv_data, data.mv_size))) { 230 const bool callResultHandler = !(skipInternalKeys && isInternalKey(current));
227 break; 231 if (callResultHandler) {
232 numberOfRetrievedValues++;
233 if (!resultHandler(current, QByteArray::fromRawData((char *)data.mv_data, data.mv_size))) {
234 break;
235 }
228 } 236 }
229 } 237 }
230 } 238 }