diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-09-13 12:42:31 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-09-13 12:42:31 +0200 |
commit | c12a9a09da59b9e418316dba02e6215cb55e47ee (patch) | |
tree | 05498d9a42e399bcca787f40c1fc473fb09e680e /common/storage_lmdb.cpp | |
parent | 55fe06979ceebe67553135b43aa47e70d931304b (diff) | |
parent | ebdb89b8bb482bbb5ecd544c3d38bef35fc7d820 (diff) | |
download | sink-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.cpp | 31 |
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 | ||