diff options
author | Minijackson <minijackson@riseup.net> | 2018-08-22 11:19:18 +0200 |
---|---|---|
committer | Minijackson <minijackson@riseup.net> | 2018-08-22 11:19:18 +0200 |
commit | 2a8abb5970f0f444e36bbd94cd527522c7246def (patch) | |
tree | ef175c60235324146cbf4111d8fb9999c0901fdc | |
parent | 3559ec6e6e698f20e600dfbbdff0d56d66576c0d (diff) | |
download | sink-2a8abb5970f0f444e36bbd94cd527522c7246def.tar.gz sink-2a8abb5970f0f444e36bbd94cd527522c7246def.zip |
Fix readRevisions function, fixes pipelinetest
-rw-r--r-- | common/storage.h | 1 | ||||
-rw-r--r-- | common/storage/entitystore.cpp | 35 | ||||
-rw-r--r-- | 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: | |||
251 | static QByteArray getUidFromRevision(const Transaction &, size_t revision); | 251 | static QByteArray getUidFromRevision(const Transaction &, size_t revision); |
252 | static size_t getLatestRevisionFromUid(Transaction &, const QByteArray &uid); | 252 | static size_t getLatestRevisionFromUid(Transaction &, const QByteArray &uid); |
253 | static QList<size_t> getRevisionsUntilFromUid(DataStore::Transaction &, const QByteArray &uid, size_t lastRevision); | 253 | static QList<size_t> getRevisionsUntilFromUid(DataStore::Transaction &, const QByteArray &uid, size_t lastRevision); |
254 | static QList<size_t> getRevisionsFromUid(DataStore::Transaction &, const QByteArray &uid); | ||
254 | static QByteArray getTypeFromRevision(const Transaction &, size_t revision); | 255 | static QByteArray getTypeFromRevision(const Transaction &, size_t revision); |
255 | static void recordRevision(Transaction &, size_t revision, const QByteArray &uid, const QByteArray &type); | 256 | static void recordRevision(Transaction &, size_t revision, const QByteArray &uid, const QByteArray &type); |
256 | static void removeRevision(Transaction &, size_t revision); | 257 | 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) | |||
667 | return true; | 667 | return true; |
668 | } | 668 | } |
669 | 669 | ||
670 | void EntityStore::readRevisions(const QByteArray &type, const QByteArray &uid, qint64 startingRevision, const std::function<void(const QByteArray &uid, qint64 revision, const EntityBuffer &entity)> callback) | 670 | void EntityStore::readRevisions(const QByteArray &type, const QByteArray &uid, qint64 startingRevision, |
671 | const std::function<void(const QByteArray &uid, qint64 revision, const EntityBuffer &entity)> callback) | ||
671 | { | 672 | { |
672 | Q_ASSERT(d); | 673 | Q_ASSERT(d); |
673 | Q_ASSERT(!uid.isEmpty()); | 674 | Q_ASSERT(!uid.isEmpty()); |
674 | const auto internalUid = Identifier::fromDisplayByteArray(uid).toInternalByteArray(); | ||
675 | DataStore::mainDatabase(d->transaction, type) | ||
676 | .scan(internalUid, | ||
677 | [&](const QByteArray &key, const QByteArray &value) -> bool { | ||
678 | const auto parsedKey = Key::fromInternalByteArray(key); | ||
679 | const auto revision = parsedKey.revision().toQint64(); | ||
680 | if (revision >= startingRevision) { | ||
681 | callback(parsedKey.identifier().toDisplayByteArray(), revision, Sink::EntityBuffer(value.data(), value.size())); | ||
682 | } | ||
683 | return true; | ||
684 | }, | ||
685 | [&](const DataStore::Error &error) { SinkWarningCtx(d->logCtx) << "Error while reading: " << error.message; }, true); | ||
686 | 675 | ||
676 | const auto revisions = DataStore::getRevisionsFromUid(d->transaction, uid); | ||
677 | |||
678 | const auto db = DataStore::mainDatabase(d->transaction, type); | ||
679 | |||
680 | for (const auto revision : revisions) { | ||
681 | if (revision < startingRevision) { | ||
682 | continue; | ||
683 | } | ||
684 | |||
685 | db.scan(revision, | ||
686 | [&](size_t rev, const QByteArray &value) { | ||
687 | Q_ASSERT(rev == revision); | ||
688 | callback(uid, revision, Sink::EntityBuffer(value.data(), value.size())); | ||
689 | return false; | ||
690 | }, | ||
691 | [&](const DataStore::Error &error) { | ||
692 | SinkWarningCtx(d->logCtx) << "Error while reading: " << error.message; | ||
693 | }, | ||
694 | true); | ||
695 | } | ||
687 | } | 696 | } |
688 | 697 | ||
689 | qint64 EntityStore::maxRevision() | 698 | 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<size_t> DataStore::getRevisionsUntilFromUid(DataStore::Transaction &t, con | |||
162 | return queriedRevisions; | 162 | return queriedRevisions; |
163 | } | 163 | } |
164 | 164 | ||
165 | QList<size_t> DataStore::getRevisionsFromUid(DataStore::Transaction &t, const QByteArray &uid) | ||
166 | { | ||
167 | QList<size_t> queriedRevisions; | ||
168 | t.openDatabase("uidsToRevisions", {}, AllowDuplicates | IntegerValues) | ||
169 | .scan(uid, [&queriedRevisions](const QByteArray &, const QByteArray &value) { | ||
170 | queriedRevisions << byteArrayToSizeT(value); | ||
171 | return true; | ||
172 | }); | ||
173 | |||
174 | return queriedRevisions; | ||
175 | } | ||
176 | |||
165 | QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transaction, size_t revision) | 177 | QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transaction, size_t revision) |
166 | { | 178 | { |
167 | QByteArray type; | 179 | QByteArray type; |