From 2a8abb5970f0f444e36bbd94cd527522c7246def Mon Sep 17 00:00:00 2001 From: Minijackson Date: Wed, 22 Aug 2018 11:19:18 +0200 Subject: Fix readRevisions function, fixes pipelinetest --- common/storage.h | 1 + common/storage/entitystore.cpp | 35 ++++++++++++++++++++++------------- common/storage_common.cpp | 12 ++++++++++++ 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/common/storage.h b/common/storage.h index 4535ae3..22d8046 100644 --- a/common/storage.h +++ b/common/storage.h @@ -251,6 +251,7 @@ public: static QByteArray getUidFromRevision(const Transaction &, size_t revision); static size_t getLatestRevisionFromUid(Transaction &, const QByteArray &uid); static QList getRevisionsUntilFromUid(DataStore::Transaction &, const QByteArray &uid, size_t lastRevision); + static QList getRevisionsFromUid(DataStore::Transaction &, const QByteArray &uid); static QByteArray getTypeFromRevision(const Transaction &, size_t revision); static void recordRevision(Transaction &, size_t revision, const QByteArray &uid, const QByteArray &type); static void removeRevision(Transaction &, size_t revision); diff --git a/common/storage/entitystore.cpp b/common/storage/entitystore.cpp index 250f01d..a92de40 100644 --- a/common/storage/entitystore.cpp +++ b/common/storage/entitystore.cpp @@ -667,23 +667,32 @@ bool EntityStore::exists(const QByteArray &type, const QByteArray &uid) return true; } -void EntityStore::readRevisions(const QByteArray &type, const QByteArray &uid, qint64 startingRevision, const std::function callback) +void EntityStore::readRevisions(const QByteArray &type, const QByteArray &uid, qint64 startingRevision, + const std::function callback) { Q_ASSERT(d); Q_ASSERT(!uid.isEmpty()); - const auto internalUid = Identifier::fromDisplayByteArray(uid).toInternalByteArray(); - DataStore::mainDatabase(d->transaction, type) - .scan(internalUid, - [&](const QByteArray &key, const QByteArray &value) -> bool { - const auto parsedKey = Key::fromInternalByteArray(key); - const auto revision = parsedKey.revision().toQint64(); - if (revision >= startingRevision) { - callback(parsedKey.identifier().toDisplayByteArray(), revision, Sink::EntityBuffer(value.data(), value.size())); - } - return true; - }, - [&](const DataStore::Error &error) { SinkWarningCtx(d->logCtx) << "Error while reading: " << error.message; }, true); + const auto revisions = DataStore::getRevisionsFromUid(d->transaction, uid); + + const auto db = DataStore::mainDatabase(d->transaction, type); + + for (const auto revision : revisions) { + if (revision < startingRevision) { + continue; + } + + db.scan(revision, + [&](size_t rev, const QByteArray &value) { + Q_ASSERT(rev == revision); + callback(uid, revision, Sink::EntityBuffer(value.data(), value.size())); + return false; + }, + [&](const DataStore::Error &error) { + SinkWarningCtx(d->logCtx) << "Error while reading: " << error.message; + }, + true); + } } qint64 EntityStore::maxRevision() diff --git a/common/storage_common.cpp b/common/storage_common.cpp index ae8e971..09b7707 100644 --- a/common/storage_common.cpp +++ b/common/storage_common.cpp @@ -162,6 +162,18 @@ QList DataStore::getRevisionsUntilFromUid(DataStore::Transaction &t, con return queriedRevisions; } +QList DataStore::getRevisionsFromUid(DataStore::Transaction &t, const QByteArray &uid) +{ + QList queriedRevisions; + t.openDatabase("uidsToRevisions", {}, AllowDuplicates | IntegerValues) + .scan(uid, [&queriedRevisions](const QByteArray &, const QByteArray &value) { + queriedRevisions << byteArrayToSizeT(value); + return true; + }); + + return queriedRevisions; +} + QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transaction, size_t revision) { QByteArray type; -- cgit v1.2.3