summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMinijackson <minijackson@riseup.net>2018-08-22 11:19:18 +0200
committerMinijackson <minijackson@riseup.net>2018-08-22 11:19:18 +0200
commit2a8abb5970f0f444e36bbd94cd527522c7246def (patch)
treeef175c60235324146cbf4111d8fb9999c0901fdc
parent3559ec6e6e698f20e600dfbbdff0d56d66576c0d (diff)
downloadsink-2a8abb5970f0f444e36bbd94cd527522c7246def.tar.gz
sink-2a8abb5970f0f444e36bbd94cd527522c7246def.zip
Fix readRevisions function, fixes pipelinetest
-rw-r--r--common/storage.h1
-rw-r--r--common/storage/entitystore.cpp35
-rw-r--r--common/storage_common.cpp12
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
670void EntityStore::readRevisions(const QByteArray &type, const QByteArray &uid, qint64 startingRevision, const std::function<void(const QByteArray &uid, qint64 revision, const EntityBuffer &entity)> callback) 670void 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
689qint64 EntityStore::maxRevision() 698qint64 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
165QList<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
165QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transaction, size_t revision) 177QByteArray DataStore::getTypeFromRevision(const DataStore::Transaction &transaction, size_t revision)
166{ 178{
167 QByteArray type; 179 QByteArray type;