summaryrefslogtreecommitdiffstats
path: root/common/storage_lmdb.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-09-13 12:42:31 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-09-13 12:42:31 +0200
commitc12a9a09da59b9e418316dba02e6215cb55e47ee (patch)
tree05498d9a42e399bcca787f40c1fc473fb09e680e /common/storage_lmdb.cpp
parent55fe06979ceebe67553135b43aa47e70d931304b (diff)
parentebdb89b8bb482bbb5ecd544c3d38bef35fc7d820 (diff)
downloadsink-0.4.0.tar.gz
sink-0.4.0.zip
Merge commit 'ebdb89b8bb482bbb5ecd544c3d38bef35fc7d820'v0.4.0
Diffstat (limited to 'common/storage_lmdb.cpp')
-rw-r--r--common/storage_lmdb.cpp31
1 files changed, 17 insertions, 14 deletions
diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp
index f7999d1..58e3a9a 100644
--- a/common/storage_lmdb.cpp
+++ b/common/storage_lmdb.cpp
@@ -406,7 +406,7 @@ int DataStore::NamedDatabase::scan(const QByteArray &k, const std::function<bool
406 mdb_cursor_close(cursor); 406 mdb_cursor_close(cursor);
407 407
408 if (rc) { 408 if (rc) {
409 Error error(d->name.toLatin1() + d->db, getErrorCode(rc), QByteArray("Key: ") + k + " : " + QByteArray(mdb_strerror(rc))); 409 Error error(d->name.toLatin1() + d->db, getErrorCode(rc), QByteArray("Error during scan. Key: ") + k + " : " + QByteArray(mdb_strerror(rc)));
410 errorHandler ? errorHandler(error) : d->defaultErrorHandler(error); 410 errorHandler ? errorHandler(error) : d->defaultErrorHandler(error);
411 } 411 }
412 412
@@ -420,6 +420,11 @@ void DataStore::NamedDatabase::findLatest(const QByteArray &k, const std::functi
420 // Not an error. We rely on this to read nothing from non-existing databases. 420 // Not an error. We rely on this to read nothing from non-existing databases.
421 return; 421 return;
422 } 422 }
423 if (k.isEmpty()) {
424 Error error(d->name.toLatin1() + d->db, GenericError, QByteArray("Can't use findLatest with empty key."));
425 errorHandler ? errorHandler(error) : d->defaultErrorHandler(error);
426 return;
427 }
423 428
424 int rc; 429 int rc;
425 MDB_val key; 430 MDB_val key;
@@ -441,25 +446,23 @@ void DataStore::NamedDatabase::findLatest(const QByteArray &k, const std::functi
441 if ((rc = mdb_cursor_get(cursor, &key, &data, op)) == 0) { 446 if ((rc = mdb_cursor_get(cursor, &key, &data, op)) == 0) {
442 // The first lookup will find a key that is equal or greather than our key 447 // The first lookup will find a key that is equal or greather than our key
443 if (QByteArray::fromRawData((char *)key.mv_data, key.mv_size).startsWith(k)) { 448 if (QByteArray::fromRawData((char *)key.mv_data, key.mv_size).startsWith(k)) {
444 bool advanced = false; 449 //Read next value until we no longer match
445 while (QByteArray::fromRawData((char *)key.mv_data, key.mv_size).startsWith(k)) { 450 while (QByteArray::fromRawData((char *)key.mv_data, key.mv_size).startsWith(k)) {
446 advanced = true;
447 MDB_cursor_op nextOp = MDB_NEXT; 451 MDB_cursor_op nextOp = MDB_NEXT;
448 rc = mdb_cursor_get(cursor, &key, &data, nextOp); 452 rc = mdb_cursor_get(cursor, &key, &data, nextOp);
449 if (rc) { 453 if (rc) {
450 break; 454 break;
451 } 455 }
452 } 456 }
453 if (advanced) { 457 //Now read the previous value, and that's the latest one
454 MDB_cursor_op prefOp = MDB_PREV; 458 MDB_cursor_op prefOp = MDB_PREV;
455 // We read past the end above, just take the last value 459 // We read past the end above, just take the last value
456 if (rc == MDB_NOTFOUND) { 460 if (rc == MDB_NOTFOUND) {
457 prefOp = MDB_LAST; 461 prefOp = MDB_LAST;
458 }
459 rc = mdb_cursor_get(cursor, &key, &data, prefOp);
460 foundValue = true;
461 resultHandler(QByteArray::fromRawData((char *)key.mv_data, key.mv_size), QByteArray::fromRawData((char *)data.mv_data, data.mv_size));
462 } 462 }
463 rc = mdb_cursor_get(cursor, &key, &data, prefOp);
464 foundValue = true;
465 resultHandler(QByteArray::fromRawData((char *)key.mv_data, key.mv_size), QByteArray::fromRawData((char *)data.mv_data, data.mv_size));
463 } 466 }
464 } 467 }
465 468
@@ -471,10 +474,10 @@ void DataStore::NamedDatabase::findLatest(const QByteArray &k, const std::functi
471 mdb_cursor_close(cursor); 474 mdb_cursor_close(cursor);
472 475
473 if (rc) { 476 if (rc) {
474 Error error(d->name.toLatin1(), getErrorCode(rc), QByteArray("Key: ") + k + " : " + QByteArray(mdb_strerror(rc))); 477 Error error(d->name.toLatin1(), getErrorCode(rc), QByteArray("Error during find latest. Key: ") + k + " : " + QByteArray(mdb_strerror(rc)));
475 errorHandler ? errorHandler(error) : d->defaultErrorHandler(error); 478 errorHandler ? errorHandler(error) : d->defaultErrorHandler(error);
476 } else if (!foundValue) { 479 } else if (!foundValue) {
477 Error error(d->name.toLatin1(), 1, QByteArray("Key: ") + k + " : No value found"); 480 Error error(d->name.toLatin1(), 1, QByteArray("Error during find latest. Key: ") + k + " : No value found");
478 errorHandler ? errorHandler(error) : d->defaultErrorHandler(error); 481 errorHandler ? errorHandler(error) : d->defaultErrorHandler(error);
479 } 482 }
480 483