summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-04-10 12:17:32 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-04-10 12:17:32 +0200
commit1319b45f5f389c94877ef58458bb60795042129e (patch)
treee1fa4fec269ab32b5814e5914da4fddb48c3ae6f
parent0d210e00c5beb8f83dbaea07cab408470c5ac215 (diff)
downloadsink-1319b45f5f389c94877ef58458bb60795042129e.tar.gz
sink-1319b45f5f389c94877ef58458bb60795042129e.zip
Fixed readAllUids and readAll
-rw-r--r--common/storage/entitystore.cpp24
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/entitystoretest.cpp83
3 files changed, 95 insertions, 13 deletions
diff --git a/common/storage/entitystore.cpp b/common/storage/entitystore.cpp
index 7f065f9..bb7c33c 100644
--- a/common/storage/entitystore.cpp
+++ b/common/storage/entitystore.cpp
@@ -520,15 +520,9 @@ ApplicationDomain::ApplicationDomainType EntityStore::readEntity(const QByteArra
520 520
521void EntityStore::readAll(const QByteArray &type, const std::function<void(const ApplicationDomain::ApplicationDomainType &entity)> &callback) 521void EntityStore::readAll(const QByteArray &type, const std::function<void(const ApplicationDomain::ApplicationDomainType &entity)> &callback)
522{ 522{
523 auto db = DataStore::mainDatabase(d->getTransaction(), type); 523 readAllUids(type, [&] (const QByteArray &uid) {
524 db.scan("", 524 readLatest(type, uid, callback);
525 [=](const QByteArray &key, const QByteArray &value) -> bool { 525 });
526 auto uid = DataStore::uidFromKey(key);
527 auto buffer = Sink::EntityBuffer{value.data(), value.size()};
528 callback(d->createApplicationDomainType(type, uid, DataStore::maxRevision(d->getTransaction()), buffer));
529 return true;
530 },
531 [&](const DataStore::Error &error) { SinkWarningCtx(d->logCtx) << "Error during query: " << error.message; });
532} 526}
533 527
534void EntityStore::readRevisions(qint64 baseRevision, const QByteArray &expectedType, const std::function<void(const QByteArray &key)> &callback) 528void EntityStore::readRevisions(qint64 baseRevision, const QByteArray &expectedType, const std::function<void(const QByteArray &key)> &callback)
@@ -587,12 +581,16 @@ ApplicationDomain::ApplicationDomainType EntityStore::readPrevious(const QByteAr
587 581
588void EntityStore::readAllUids(const QByteArray &type, const std::function<void(const QByteArray &uid)> callback) 582void EntityStore::readAllUids(const QByteArray &type, const std::function<void(const QByteArray &uid)> callback)
589{ 583{
590 //TODO use uid index instead 584 //TODO use a uid index instead
591 //FIXME we currently report each uid for every revision with the same uid
592 auto db = DataStore::mainDatabase(d->getTransaction(), type); 585 auto db = DataStore::mainDatabase(d->getTransaction(), type);
586 QByteArray lastUid;
593 db.scan("", 587 db.scan("",
594 [callback](const QByteArray &key, const QByteArray &) -> bool { 588 [&](const QByteArray &key, const QByteArray &) -> bool {
595 callback(Sink::Storage::DataStore::uidFromKey(key)); 589 const auto uid = Sink::Storage::DataStore::uidFromKey(key);
590 if (uid != lastUid) {
591 lastUid = uid;
592 callback(uid);
593 }
596 return true; 594 return true;
597 }, 595 },
598 [&](const Sink::Storage::DataStore::Error &error) { SinkWarningCtx(d->logCtx) << "Failed to read current value from storage: " << error.message; }); 596 [&](const Sink::Storage::DataStore::Error &error) { SinkWarningCtx(d->logCtx) << "Failed to read current value from storage: " << error.message; });
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index fef76bd..c77a736 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -45,6 +45,7 @@ auto_tests (
45 dummyresourcemailtest 45 dummyresourcemailtest
46 interresourcemovetest 46 interresourcemovetest
47 notificationtest 47 notificationtest
48 entitystoretest
48) 49)
49generate_flatbuffers(dummyresourcetest calendar) 50generate_flatbuffers(dummyresourcetest calendar)
50target_link_libraries(dummyresourcetest sink_resource_dummy) 51target_link_libraries(dummyresourcetest sink_resource_dummy)
diff --git a/tests/entitystoretest.cpp b/tests/entitystoretest.cpp
new file mode 100644
index 0000000..0faf500
--- /dev/null
+++ b/tests/entitystoretest.cpp
@@ -0,0 +1,83 @@
1#include <QtTest>
2
3#include <QDebug>
4#include <QString>
5
6#include "common/storage/entitystore.h"
7#include "common/adaptorfactoryregistry.h"
8#include "common/definitions.h"
9#include "testimplementations.h"
10
11class EntityStoreTest : public QObject
12{
13 Q_OBJECT
14private:
15 QString resourceInstanceIdentifier{"resourceId"};
16
17private slots:
18 void initTestCase()
19 {
20 Sink::AdaptorFactoryRegistry::instance().registerFactory<Sink::ApplicationDomain::Mail, TestMailAdaptorFactory>("test");
21 }
22
23 void cleanup()
24 {
25 Sink::Storage::DataStore storage(Sink::storageLocation(), resourceInstanceIdentifier);
26 storage.removeFromDisk();
27 }
28
29 void testCleanup()
30 {
31 }
32
33 void readAll()
34 {
35 using namespace Sink;
36 ResourceContext resourceContext{resourceInstanceIdentifier.toUtf8(), "dummy", AdaptorFactoryRegistry::instance().getFactories("test")};
37 Storage::EntityStore store(resourceContext, {});
38
39 auto mail = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1");
40 mail.setExtractedMessageId("messageid");
41 mail.setExtractedSubject("boo");
42
43 auto mail2 = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1");
44 mail2.setExtractedMessageId("messageid2");
45 mail2.setExtractedSubject("foo");
46
47 store.startTransaction(Storage::DataStore::ReadWrite);
48 store.add("mail", mail, false, [] (const ApplicationDomain::ApplicationDomainType &) {});
49 store.add("mail", mail2, false, [] (const ApplicationDomain::ApplicationDomainType &) {});
50
51 mail.setExtractedSubject("foo");
52
53 store.modify("mail", mail, {}, false, [] (const ApplicationDomain::ApplicationDomainType &, ApplicationDomain::ApplicationDomainType &) {});
54 store.commitTransaction();
55
56 store.startTransaction(Storage::DataStore::ReadOnly);
57 {
58 //We get every uid once
59 QList<QByteArray> uids;
60 store.readAllUids("mail", [&] (const QByteArray &uid) {
61 uids << uid;
62 });
63 QCOMPARE(uids.size(), 2);
64 }
65
66 {
67 //We get the latest version of every entity once
68 QList<QByteArray> uids;
69 store.readAll("mail", [&] (const ApplicationDomain::ApplicationDomainType &entity) {
70 //The first revision should be superseeded by the modification
71 QCOMPARE(entity.getProperty(ApplicationDomain::Mail::Subject::name).toString(), QString::fromLatin1("foo"));
72 uids << entity.identifier();
73 });
74 QCOMPARE(uids.size(), 2);
75 }
76
77 store.abortTransaction();
78
79 }
80};
81
82QTEST_MAIN(EntityStoreTest)
83#include "entitystoretest.moc"