diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-04-10 12:17:32 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-04-10 12:17:32 +0200 |
commit | 1319b45f5f389c94877ef58458bb60795042129e (patch) | |
tree | e1fa4fec269ab32b5814e5914da4fddb48c3ae6f | |
parent | 0d210e00c5beb8f83dbaea07cab408470c5ac215 (diff) | |
download | sink-1319b45f5f389c94877ef58458bb60795042129e.tar.gz sink-1319b45f5f389c94877ef58458bb60795042129e.zip |
Fixed readAllUids and readAll
-rw-r--r-- | common/storage/entitystore.cpp | 24 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/entitystoretest.cpp | 83 |
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 | ||
521 | void EntityStore::readAll(const QByteArray &type, const std::function<void(const ApplicationDomain::ApplicationDomainType &entity)> &callback) | 521 | void 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 | ||
534 | void EntityStore::readRevisions(qint64 baseRevision, const QByteArray &expectedType, const std::function<void(const QByteArray &key)> &callback) | 528 | void 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 | ||
588 | void EntityStore::readAllUids(const QByteArray &type, const std::function<void(const QByteArray &uid)> callback) | 582 | void 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 | ) |
49 | generate_flatbuffers(dummyresourcetest calendar) | 50 | generate_flatbuffers(dummyresourcetest calendar) |
50 | target_link_libraries(dummyresourcetest sink_resource_dummy) | 51 | target_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 | |||
11 | class EntityStoreTest : public QObject | ||
12 | { | ||
13 | Q_OBJECT | ||
14 | private: | ||
15 | QString resourceInstanceIdentifier{"resourceId"}; | ||
16 | |||
17 | private 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 | |||
82 | QTEST_MAIN(EntityStoreTest) | ||
83 | #include "entitystoretest.moc" | ||