summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2016-10-16 14:55:20 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2016-10-21 09:02:21 +0200
commit237b9ae4113e7a9f489632296941becb71afdb45 (patch)
tree01cde58f495944f01cad9d282391d4efd2897141 /examples
parent95d11bf0be98a4e3c08502fe23417b800233ce14 (diff)
downloadsink-237b9ae4113e7a9f489632296941becb71afdb45.tar.gz
sink-237b9ae4113e7a9f489632296941becb71afdb45.zip
Refactor how the storage is used.
This is the initial refactoring to improve how we deal with the storage. It does a couple of things: * Rename Sink::Storage to Sink::Storage::DataStore to free up the Sink::Storage namespace * Introduce a Sink::ResourceContext to have a single object that can be passed around containing everything that is necessary to operate on a resource. This is a lot better than the multiple separate parameters that we used to pass around all over the place, while still allowing for dependency injection for tests. * Tie storage access together using the new EntityStore that directly works with ApplicationDomainTypes. This gives us a central place where main storage, indexes and buffer adaptors are tied together, which will also give us a place to implement external indexes, such as a fulltextindex using xapian. * Use ApplicationDomainTypes as the default way to pass around entities. Instead of using various ways to pass around entities (buffers, buffer adaptors, ApplicationDomainTypes), only use a single way. The old approach was confusing, and was only done as: * optimization; really shouldn't be necessary and otherwise I'm sure we can find better ways to optimize ApplicationDomainType itself. * a way to account for entities that have multiple buffers, a concept that I no longer deem relevant. While this commit does the bulk of the work to get there, the following commits will refactor more stuff to get things back to normal.
Diffstat (limited to 'examples')
-rw-r--r--examples/dummyresource/facade.cpp12
-rw-r--r--examples/dummyresource/facade.h6
-rw-r--r--examples/dummyresource/resourcefactory.cpp16
-rw-r--r--examples/dummyresource/resourcefactory.h4
-rw-r--r--examples/imapresource/facade.cpp8
-rw-r--r--examples/imapresource/facade.h4
-rw-r--r--examples/imapresource/imapresource.cpp66
-rw-r--r--examples/imapresource/imapresource.h4
-rw-r--r--examples/maildirresource/facade.cpp11
-rw-r--r--examples/maildirresource/facade.h4
-rw-r--r--examples/maildirresource/maildirresource.cpp77
-rw-r--r--examples/maildirresource/maildirresource.h4
-rw-r--r--examples/mailtransportresource/mailtransportresource.cpp32
-rw-r--r--examples/mailtransportresource/mailtransportresource.h4
14 files changed, 107 insertions, 145 deletions
diff --git a/examples/dummyresource/facade.cpp b/examples/dummyresource/facade.cpp
index 120498a..4343eba 100644
--- a/examples/dummyresource/facade.cpp
+++ b/examples/dummyresource/facade.cpp
@@ -21,8 +21,8 @@
21 21
22#include "domainadaptor.h" 22#include "domainadaptor.h"
23 23
24DummyResourceFacade::DummyResourceFacade(const QByteArray &instanceIdentifier) 24DummyResourceFacade::DummyResourceFacade(const Sink::ResourceContext &context)
25 : Sink::GenericFacade<Sink::ApplicationDomain::Event>(instanceIdentifier, QSharedPointer<DummyEventAdaptorFactory>::create()) 25 : Sink::GenericFacade<Sink::ApplicationDomain::Event>(context)
26{ 26{
27} 27}
28 28
@@ -31,8 +31,8 @@ DummyResourceFacade::~DummyResourceFacade()
31} 31}
32 32
33 33
34DummyResourceMailFacade::DummyResourceMailFacade(const QByteArray &instanceIdentifier) 34DummyResourceMailFacade::DummyResourceMailFacade(const Sink::ResourceContext &context)
35 : Sink::GenericFacade<Sink::ApplicationDomain::Mail>(instanceIdentifier, QSharedPointer<DummyMailAdaptorFactory>::create()) 35 : Sink::GenericFacade<Sink::ApplicationDomain::Mail>(context)
36{ 36{
37} 37}
38 38
@@ -41,8 +41,8 @@ DummyResourceMailFacade::~DummyResourceMailFacade()
41} 41}
42 42
43 43
44DummyResourceFolderFacade::DummyResourceFolderFacade(const QByteArray &instanceIdentifier) 44DummyResourceFolderFacade::DummyResourceFolderFacade(const Sink::ResourceContext &context)
45 : Sink::GenericFacade<Sink::ApplicationDomain::Folder>(instanceIdentifier, QSharedPointer<DummyFolderAdaptorFactory>::create()) 45 : Sink::GenericFacade<Sink::ApplicationDomain::Folder>(context)
46{ 46{
47} 47}
48 48
diff --git a/examples/dummyresource/facade.h b/examples/dummyresource/facade.h
index 5e0096d..1bb45fd 100644
--- a/examples/dummyresource/facade.h
+++ b/examples/dummyresource/facade.h
@@ -25,20 +25,20 @@
25class DummyResourceFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Event> 25class DummyResourceFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Event>
26{ 26{
27public: 27public:
28 DummyResourceFacade(const QByteArray &instanceIdentifier); 28 DummyResourceFacade(const Sink::ResourceContext &context);
29 virtual ~DummyResourceFacade(); 29 virtual ~DummyResourceFacade();
30}; 30};
31 31
32class DummyResourceMailFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Mail> 32class DummyResourceMailFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Mail>
33{ 33{
34public: 34public:
35 DummyResourceMailFacade(const QByteArray &instanceIdentifier); 35 DummyResourceMailFacade(const Sink::ResourceContext &context);
36 virtual ~DummyResourceMailFacade(); 36 virtual ~DummyResourceMailFacade();
37}; 37};
38 38
39class DummyResourceFolderFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Folder> 39class DummyResourceFolderFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Folder>
40{ 40{
41public: 41public:
42 DummyResourceFolderFacade(const QByteArray &instanceIdentifier); 42 DummyResourceFolderFacade(const Sink::ResourceContext &context);
43 virtual ~DummyResourceFolderFacade(); 43 virtual ~DummyResourceFolderFacade();
44}; 44};
diff --git a/examples/dummyresource/resourcefactory.cpp b/examples/dummyresource/resourcefactory.cpp
index 6d14721..e288be2 100644
--- a/examples/dummyresource/resourcefactory.cpp
+++ b/examples/dummyresource/resourcefactory.cpp
@@ -53,8 +53,8 @@ SINK_DEBUG_AREA("dummyresource")
53class DummySynchronizer : public Sink::Synchronizer { 53class DummySynchronizer : public Sink::Synchronizer {
54 public: 54 public:
55 55
56 DummySynchronizer(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) 56 DummySynchronizer(const Sink::ResourceContext &context)
57 : Sink::Synchronizer(resourceType, resourceInstanceIdentifier) 57 : Sink::Synchronizer(context)
58 { 58 {
59 59
60 } 60 }
@@ -129,11 +129,11 @@ class DummySynchronizer : public Sink::Synchronizer {
129 129
130}; 130};
131 131
132DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline) 132DummyResource::DummyResource(const Sink::ResourceContext &resourceContext, const QSharedPointer<Sink::Pipeline> &pipeline)
133 : Sink::GenericResource(PLUGIN_NAME, instanceIdentifier, pipeline) 133 : Sink::GenericResource(resourceContext, pipeline)
134{ 134{
135 setupSynchronizer(QSharedPointer<DummySynchronizer>::create(PLUGIN_NAME, instanceIdentifier)); 135 setupSynchronizer(QSharedPointer<DummySynchronizer>::create(resourceContext));
136 setupChangereplay(QSharedPointer<Sink::NullChangeReplay>::create(instanceIdentifier)); 136 setupChangereplay(QSharedPointer<Sink::NullChangeReplay>::create(resourceContext));
137 setupPreprocessors(ENTITY_TYPE_MAIL, 137 setupPreprocessors(ENTITY_TYPE_MAIL,
138 QVector<Sink::Preprocessor*>() << new MailPropertyExtractor << new DefaultIndexUpdater<Sink::ApplicationDomain::Mail>); 138 QVector<Sink::Preprocessor*>() << new MailPropertyExtractor << new DefaultIndexUpdater<Sink::ApplicationDomain::Mail>);
139 setupPreprocessors(ENTITY_TYPE_FOLDER, 139 setupPreprocessors(ENTITY_TYPE_FOLDER,
@@ -182,9 +182,9 @@ DummyResourceFactory::DummyResourceFactory(QObject *parent)
182 182
183} 183}
184 184
185Sink::Resource *DummyResourceFactory::createResource(const QByteArray &instanceIdentifier) 185Sink::Resource *DummyResourceFactory::createResource(const Sink::ResourceContext &resourceContext)
186{ 186{
187 return new DummyResource(instanceIdentifier); 187 return new DummyResource(resourceContext);
188} 188}
189 189
190void DummyResourceFactory::registerFacades(Sink::FacadeFactory &factory) 190void DummyResourceFactory::registerFacades(Sink::FacadeFactory &factory)
diff --git a/examples/dummyresource/resourcefactory.h b/examples/dummyresource/resourcefactory.h
index 0a29d53..3dd82ff 100644
--- a/examples/dummyresource/resourcefactory.h
+++ b/examples/dummyresource/resourcefactory.h
@@ -32,7 +32,7 @@
32class DummyResource : public Sink::GenericResource 32class DummyResource : public Sink::GenericResource
33{ 33{
34public: 34public:
35 DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline = QSharedPointer<Sink::Pipeline>()); 35 DummyResource(const Sink::ResourceContext &resourceContext, const QSharedPointer<Sink::Pipeline> &pipeline = QSharedPointer<Sink::Pipeline>());
36 virtual ~DummyResource(); 36 virtual ~DummyResource();
37 37
38 KAsync::Job<void> synchronizeWithSource() Q_DECL_OVERRIDE; 38 KAsync::Job<void> synchronizeWithSource() Q_DECL_OVERRIDE;
@@ -48,7 +48,7 @@ class DummyResourceFactory : public Sink::ResourceFactory
48public: 48public:
49 DummyResourceFactory(QObject *parent = 0); 49 DummyResourceFactory(QObject *parent = 0);
50 50
51 Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; 51 Sink::Resource *createResource(const Sink::ResourceContext &resourceContext) Q_DECL_OVERRIDE;
52 void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; 52 void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE;
53 void registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry) Q_DECL_OVERRIDE; 53 void registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry) Q_DECL_OVERRIDE;
54 void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; 54 void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE;
diff --git a/examples/imapresource/facade.cpp b/examples/imapresource/facade.cpp
index d338b01..2829bb1 100644
--- a/examples/imapresource/facade.cpp
+++ b/examples/imapresource/facade.cpp
@@ -25,8 +25,8 @@
25#include "domainadaptor.h" 25#include "domainadaptor.h"
26#include "queryrunner.h" 26#include "queryrunner.h"
27 27
28ImapResourceMailFacade::ImapResourceMailFacade(const QByteArray &instanceIdentifier) 28ImapResourceMailFacade::ImapResourceMailFacade(const Sink::ResourceContext &context)
29 : Sink::GenericFacade<Sink::ApplicationDomain::Mail>(instanceIdentifier, QSharedPointer<ImapMailAdaptorFactory>::create()) 29 : Sink::GenericFacade<Sink::ApplicationDomain::Mail>(context)
30{ 30{
31} 31}
32 32
@@ -34,8 +34,8 @@ ImapResourceMailFacade::~ImapResourceMailFacade()
34{ 34{
35} 35}
36 36
37ImapResourceFolderFacade::ImapResourceFolderFacade(const QByteArray &instanceIdentifier) 37ImapResourceFolderFacade::ImapResourceFolderFacade(const Sink::ResourceContext &context)
38 : Sink::GenericFacade<Sink::ApplicationDomain::Folder>(instanceIdentifier, QSharedPointer<ImapFolderAdaptorFactory>::create()) 38 : Sink::GenericFacade<Sink::ApplicationDomain::Folder>(context)
39{ 39{
40} 40}
41 41
diff --git a/examples/imapresource/facade.h b/examples/imapresource/facade.h
index 479ad96..1d24856 100644
--- a/examples/imapresource/facade.h
+++ b/examples/imapresource/facade.h
@@ -24,13 +24,13 @@
24class ImapResourceMailFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Mail> 24class ImapResourceMailFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Mail>
25{ 25{
26public: 26public:
27 ImapResourceMailFacade(const QByteArray &instanceIdentifier); 27 ImapResourceMailFacade(const Sink::ResourceContext &context);
28 virtual ~ImapResourceMailFacade(); 28 virtual ~ImapResourceMailFacade();
29}; 29};
30 30
31class ImapResourceFolderFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Folder> 31class ImapResourceFolderFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Folder>
32{ 32{
33public: 33public:
34 ImapResourceFolderFacade(const QByteArray &instanceIdentifier); 34 ImapResourceFolderFacade(const Sink::ResourceContext &context);
35 virtual ~ImapResourceFolderFacade(); 35 virtual ~ImapResourceFolderFacade();
36}; 36};
diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp
index c72579c..0ea07bf 100644
--- a/examples/imapresource/imapresource.cpp
+++ b/examples/imapresource/imapresource.cpp
@@ -50,8 +50,8 @@
50#include <QtAlgorithms> 50#include <QtAlgorithms>
51 51
52#include "imapserverproxy.h" 52#include "imapserverproxy.h"
53#include "entityreader.h"
54#include "mailpreprocessor.h" 53#include "mailpreprocessor.h"
54#include "adaptorfactoryregistry.h"
55#include "specialpurposepreprocessor.h" 55#include "specialpurposepreprocessor.h"
56 56
57//This is the resources entity type, and not the domain type 57//This is the resources entity type, and not the domain type
@@ -92,8 +92,8 @@ static QByteArray assembleMailRid(const ApplicationDomain::Mail &mail, qint64 im
92 92
93class ImapSynchronizer : public Sink::Synchronizer { 93class ImapSynchronizer : public Sink::Synchronizer {
94public: 94public:
95 ImapSynchronizer(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) 95 ImapSynchronizer(const ResourceContext &resourceContext)
96 : Sink::Synchronizer(resourceType, resourceInstanceIdentifier) 96 : Sink::Synchronizer(resourceContext)
97 { 97 {
98 98
99 } 99 }
@@ -126,17 +126,6 @@ public:
126 SinkTrace() << "Found folders " << folderList.size(); 126 SinkTrace() << "Found folders " << folderList.size();
127 127
128 scanForRemovals(bufferType, 128 scanForRemovals(bufferType,
129 [this, &bufferType](const std::function<void(const QByteArray &)> &callback) {
130 //TODO Instead of iterating over all entries in the database, which can also pick up the same item multiple times,
131 //we should rather iterate over an index that contains every uid exactly once. The remoteId index would be such an index,
132 //but we currently fail to iterate over all entries in an index it seems.
133 // auto remoteIds = synchronizationTransaction.openDatabase("rid.mapping." + bufferType, std::function<void(const Sink::Storage::Error &)>(), true);
134 auto mainDatabase = Sink::Storage::mainDatabase(transaction(), bufferType);
135 mainDatabase.scan("", [&](const QByteArray &key, const QByteArray &) {
136 callback(key);
137 return true;
138 });
139 },
140 [&folderList](const QByteArray &remoteId) -> bool { 129 [&folderList](const QByteArray &remoteId) -> bool {
141 // folderList.contains(remoteId) 130 // folderList.contains(remoteId)
142 for (const auto &folderPath : folderList) { 131 for (const auto &folderPath : folderList) {
@@ -190,18 +179,12 @@ public:
190 const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, path.toUtf8()); 179 const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, path.toUtf8());
191 180
192 int count = 0; 181 int count = 0;
193 auto property = Sink::ApplicationDomain::Mail::Folder::name; 182
194 scanForRemovals(bufferType, 183 scanForRemovals(bufferType,
195 [&](const std::function<void(const QByteArray &)> &callback) { 184 [&](const std::function<void(const QByteArray &)> &callback) {
196 Index index(bufferType + ".index." + property, transaction()); 185 store().indexLookup<ApplicationDomain::Mail, ApplicationDomain::Mail::Folder>(folderLocalId, callback);
197 index.lookup(folderLocalId, [&](const QByteArray &sinkId) {
198 callback(sinkId);
199 },
200 [&](const Index::Error &error) {
201 SinkWarning() << "Error in index: " << error.message << property;
202 });
203 }, 186 },
204 [messages, path, &count](const QByteArray &remoteId) -> bool { 187 [&](const QByteArray &remoteId) -> bool {
205 if (messages.contains(uidFromMailRid(remoteId))) { 188 if (messages.contains(uidFromMailRid(remoteId))) {
206 return true; 189 return true;
207 } 190 }
@@ -347,7 +330,7 @@ public:
347class ImapWriteback : public Sink::SourceWriteBack 330class ImapWriteback : public Sink::SourceWriteBack
348{ 331{
349public: 332public:
350 ImapWriteback(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : Sink::SourceWriteBack(resourceType, resourceInstanceIdentifier) 333 ImapWriteback(const ResourceContext &resourceContext) : Sink::SourceWriteBack(resourceContext)
351 { 334 {
352 335
353 } 336 }
@@ -514,10 +497,10 @@ public:
514 QByteArray mResourceInstanceIdentifier; 497 QByteArray mResourceInstanceIdentifier;
515}; 498};
516 499
517ImapResource::ImapResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline) 500ImapResource::ImapResource(const ResourceContext &resourceContext, const QSharedPointer<Sink::Pipeline> &pipeline)
518 : Sink::GenericResource(PLUGIN_NAME, instanceIdentifier, pipeline) 501 : Sink::GenericResource(resourceContext, pipeline)
519{ 502{
520 auto config = ResourceConfig::getConfiguration(instanceIdentifier); 503 auto config = ResourceConfig::getConfiguration(resourceContext.instanceId());
521 mServer = config.value("server").toString(); 504 mServer = config.value("server").toString();
522 mPort = config.value("port").toInt(); 505 mPort = config.value("port").toInt();
523 mUser = config.value("username").toString(); 506 mUser = config.value("username").toString();
@@ -532,46 +515,45 @@ ImapResource::ImapResource(const QByteArray &instanceIdentifier, const QSharedPo
532 mPort = list.at(1).toInt(); 515 mPort = list.at(1).toInt();
533 } 516 }
534 517
535 auto synchronizer = QSharedPointer<ImapSynchronizer>::create(PLUGIN_NAME, instanceIdentifier); 518 auto synchronizer = QSharedPointer<ImapSynchronizer>::create(resourceContext);
536 synchronizer->mServer = mServer; 519 synchronizer->mServer = mServer;
537 synchronizer->mPort = mPort; 520 synchronizer->mPort = mPort;
538 synchronizer->mUser = mUser; 521 synchronizer->mUser = mUser;
539 synchronizer->mPassword = mPassword; 522 synchronizer->mPassword = mPassword;
540 synchronizer->mResourceInstanceIdentifier = instanceIdentifier;
541 setupSynchronizer(synchronizer); 523 setupSynchronizer(synchronizer);
542 auto changereplay = QSharedPointer<ImapWriteback>::create(PLUGIN_NAME, instanceIdentifier); 524 auto changereplay = QSharedPointer<ImapWriteback>::create(resourceContext);
543 changereplay->mServer = mServer; 525 changereplay->mServer = mServer;
544 changereplay->mPort = mPort; 526 changereplay->mPort = mPort;
545 changereplay->mUser = mUser; 527 changereplay->mUser = mUser;
546 changereplay->mPassword = mPassword; 528 changereplay->mPassword = mPassword;
547 setupChangereplay(changereplay); 529 setupChangereplay(changereplay);
548 530
549 setupPreprocessors(ENTITY_TYPE_MAIL, QVector<Sink::Preprocessor*>() << new SpecialPurposeProcessor(mResourceType, mResourceInstanceIdentifier) << new MimeMessageMover << new MailPropertyExtractor << new DefaultIndexUpdater<Sink::ApplicationDomain::Mail>); 531 setupPreprocessors(ENTITY_TYPE_MAIL, QVector<Sink::Preprocessor*>() << new SpecialPurposeProcessor(resourceContext.resourceType, resourceContext.instanceId()) << new MimeMessageMover << new MailPropertyExtractor << new DefaultIndexUpdater<Sink::ApplicationDomain::Mail>);
550 setupPreprocessors(ENTITY_TYPE_FOLDER, QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Folder>); 532 setupPreprocessors(ENTITY_TYPE_FOLDER, QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Folder>);
551} 533}
552 534
553void ImapResource::removeFromDisk(const QByteArray &instanceIdentifier) 535void ImapResource::removeFromDisk(const QByteArray &instanceIdentifier)
554{ 536{
555 GenericResource::removeFromDisk(instanceIdentifier); 537 GenericResource::removeFromDisk(instanceIdentifier);
556 Sink::Storage(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::ReadWrite).removeFromDisk(); 538 Sink::Storage::DataStore(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::DataStore::ReadWrite).removeFromDisk();
557} 539}
558 540
559KAsync::Job<void> ImapResource::inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) 541KAsync::Job<void> ImapResource::inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue)
560{ 542{
561 auto synchronizationStore = QSharedPointer<Sink::Storage>::create(Sink::storageLocation(), mResourceInstanceIdentifier + ".synchronization", Sink::Storage::ReadOnly); 543 auto synchronizationStore = QSharedPointer<Sink::Storage::DataStore>::create(Sink::storageLocation(), mResourceContext.instanceId() + ".synchronization", Sink::Storage::DataStore::ReadOnly);
562 auto synchronizationTransaction = synchronizationStore->createTransaction(Sink::Storage::ReadOnly); 544 auto synchronizationTransaction = synchronizationStore->createTransaction(Sink::Storage::DataStore::ReadOnly);
563 545
564 auto mainStore = QSharedPointer<Sink::Storage>::create(Sink::storageLocation(), mResourceInstanceIdentifier, Sink::Storage::ReadOnly); 546 auto mainStore = QSharedPointer<Sink::Storage::DataStore>::create(Sink::storageLocation(), mResourceContext.instanceId(), Sink::Storage::DataStore::ReadOnly);
565 auto transaction = mainStore->createTransaction(Sink::Storage::ReadOnly); 547 auto transaction = mainStore->createTransaction(Sink::Storage::DataStore::ReadOnly);
566 548
567 auto entityStore = QSharedPointer<Sink::EntityStore>::create(mResourceType, mResourceInstanceIdentifier, transaction); 549 Sink::Storage::EntityStore entityStore(mResourceContext);
568 auto syncStore = QSharedPointer<Sink::RemoteIdMap>::create(synchronizationTransaction); 550 auto syncStore = QSharedPointer<Sink::RemoteIdMap>::create(synchronizationTransaction);
569 551
570 SinkTrace() << "Inspecting " << inspectionType << domainType << entityId << property << expectedValue; 552 SinkTrace() << "Inspecting " << inspectionType << domainType << entityId << property << expectedValue;
571 553
572 if (domainType == ENTITY_TYPE_MAIL) { 554 if (domainType == ENTITY_TYPE_MAIL) {
573 const auto mail = entityStore->read<Sink::ApplicationDomain::Mail>(entityId); 555 const auto mail = entityStore.readLatest<Sink::ApplicationDomain::Mail>(entityId);
574 const auto folder = entityStore->read<Sink::ApplicationDomain::Folder>(mail.getFolder()); 556 const auto folder = entityStore.readLatest<Sink::ApplicationDomain::Folder>(mail.getFolder());
575 const auto folderRemoteId = syncStore->resolveLocalId(ENTITY_TYPE_FOLDER, mail.getFolder()); 557 const auto folderRemoteId = syncStore->resolveLocalId(ENTITY_TYPE_FOLDER, mail.getFolder());
576 const auto mailRemoteId = syncStore->resolveLocalId(ENTITY_TYPE_MAIL, mail.identifier()); 558 const auto mailRemoteId = syncStore->resolveLocalId(ENTITY_TYPE_MAIL, mail.identifier());
577 if (mailRemoteId.isEmpty() || folderRemoteId.isEmpty()) { 559 if (mailRemoteId.isEmpty() || folderRemoteId.isEmpty()) {
@@ -635,7 +617,7 @@ KAsync::Job<void> ImapResource::inspect(int inspectionType, const QByteArray &in
635 } 617 }
636 if (domainType == ENTITY_TYPE_FOLDER) { 618 if (domainType == ENTITY_TYPE_FOLDER) {
637 const auto remoteId = syncStore->resolveLocalId(ENTITY_TYPE_FOLDER, entityId); 619 const auto remoteId = syncStore->resolveLocalId(ENTITY_TYPE_FOLDER, entityId);
638 const auto folder = entityStore->read<Sink::ApplicationDomain::Folder>(entityId); 620 const auto folder = entityStore.readLatest<Sink::ApplicationDomain::Folder>(entityId);
639 621
640 if (inspectionType == Sink::ResourceControl::Inspection::CacheIntegrityInspectionType) { 622 if (inspectionType == Sink::ResourceControl::Inspection::CacheIntegrityInspectionType) {
641 SinkLog() << "Inspecting cache integrity" << remoteId; 623 SinkLog() << "Inspecting cache integrity" << remoteId;
@@ -698,9 +680,9 @@ ImapResourceFactory::ImapResourceFactory(QObject *parent)
698 680
699} 681}
700 682
701Sink::Resource *ImapResourceFactory::createResource(const QByteArray &instanceIdentifier) 683Sink::Resource *ImapResourceFactory::createResource(const ResourceContext &context)
702{ 684{
703 return new ImapResource(instanceIdentifier); 685 return new ImapResource(context);
704} 686}
705 687
706void ImapResourceFactory::registerFacades(Sink::FacadeFactory &factory) 688void ImapResourceFactory::registerFacades(Sink::FacadeFactory &factory)
diff --git a/examples/imapresource/imapresource.h b/examples/imapresource/imapresource.h
index 236e695..684a3c9 100644
--- a/examples/imapresource/imapresource.h
+++ b/examples/imapresource/imapresource.h
@@ -42,7 +42,7 @@ struct Folder;
42class ImapResource : public Sink::GenericResource 42class ImapResource : public Sink::GenericResource
43{ 43{
44public: 44public:
45 ImapResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline = QSharedPointer<Sink::Pipeline>()); 45 ImapResource(const Sink::ResourceContext &resourceContext, const QSharedPointer<Sink::Pipeline> &pipeline = QSharedPointer<Sink::Pipeline>());
46 KAsync::Job<void> inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE; 46 KAsync::Job<void> inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE;
47 static void removeFromDisk(const QByteArray &instanceIdentifier); 47 static void removeFromDisk(const QByteArray &instanceIdentifier);
48 48
@@ -62,7 +62,7 @@ class ImapResourceFactory : public Sink::ResourceFactory
62public: 62public:
63 ImapResourceFactory(QObject *parent = 0); 63 ImapResourceFactory(QObject *parent = 0);
64 64
65 Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; 65 Sink::Resource *createResource(const Sink::ResourceContext &resourceContext) Q_DECL_OVERRIDE;
66 void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; 66 void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE;
67 void registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry) Q_DECL_OVERRIDE; 67 void registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry) Q_DECL_OVERRIDE;
68 void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; 68 void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE;
diff --git a/examples/maildirresource/facade.cpp b/examples/maildirresource/facade.cpp
index 256b255..ba53c5f 100644
--- a/examples/maildirresource/facade.cpp
+++ b/examples/maildirresource/facade.cpp
@@ -22,11 +22,10 @@
22#include <QDir> 22#include <QDir>
23#include <QFileInfo> 23#include <QFileInfo>
24 24
25#include "domainadaptor.h" 25#include "query.h"
26#include "queryrunner.h"
27 26
28MaildirResourceMailFacade::MaildirResourceMailFacade(const QByteArray &instanceIdentifier) 27MaildirResourceMailFacade::MaildirResourceMailFacade(const Sink::ResourceContext &context)
29 : Sink::GenericFacade<Sink::ApplicationDomain::Mail>(instanceIdentifier, QSharedPointer<MaildirMailAdaptorFactory>::create()) 28 : Sink::GenericFacade<Sink::ApplicationDomain::Mail>(context)
30{ 29{
31 mResultTransformation = [](Sink::ApplicationDomain::ApplicationDomainType &value) { 30 mResultTransformation = [](Sink::ApplicationDomain::ApplicationDomainType &value) {
32 if (value.hasProperty("mimeMessage")) { 31 if (value.hasProperty("mimeMessage")) {
@@ -62,8 +61,8 @@ QPair<KAsync::Job<void>, Sink::ResultEmitter<Sink::ApplicationDomain::Mail::Ptr>
62} 61}
63 62
64 63
65MaildirResourceFolderFacade::MaildirResourceFolderFacade(const QByteArray &instanceIdentifier) 64MaildirResourceFolderFacade::MaildirResourceFolderFacade(const Sink::ResourceContext &context)
66 : Sink::GenericFacade<Sink::ApplicationDomain::Folder>(instanceIdentifier, QSharedPointer<MaildirFolderAdaptorFactory>::create()) 65 : Sink::GenericFacade<Sink::ApplicationDomain::Folder>(context)
67{ 66{
68} 67}
69 68
diff --git a/examples/maildirresource/facade.h b/examples/maildirresource/facade.h
index 38981d0..fdb693e 100644
--- a/examples/maildirresource/facade.h
+++ b/examples/maildirresource/facade.h
@@ -24,7 +24,7 @@
24class MaildirResourceMailFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Mail> 24class MaildirResourceMailFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Mail>
25{ 25{
26public: 26public:
27 MaildirResourceMailFacade(const QByteArray &instanceIdentifier); 27 MaildirResourceMailFacade(const Sink::ResourceContext &context);
28 virtual ~MaildirResourceMailFacade(); 28 virtual ~MaildirResourceMailFacade();
29 QPair<KAsync::Job<void>, Sink::ResultEmitter<Sink::ApplicationDomain::Mail::Ptr>::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; 29 QPair<KAsync::Job<void>, Sink::ResultEmitter<Sink::ApplicationDomain::Mail::Ptr>::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE;
30}; 30};
@@ -32,6 +32,6 @@ public:
32class MaildirResourceFolderFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Folder> 32class MaildirResourceFolderFacade : public Sink::GenericFacade<Sink::ApplicationDomain::Folder>
33{ 33{
34public: 34public:
35 MaildirResourceFolderFacade(const QByteArray &instanceIdentifier); 35 MaildirResourceFolderFacade(const Sink::ResourceContext &context);
36 virtual ~MaildirResourceFolderFacade(); 36 virtual ~MaildirResourceFolderFacade();
37}; 37};
diff --git a/examples/maildirresource/maildirresource.cpp b/examples/maildirresource/maildirresource.cpp
index 1ed7fc8..b89d78c 100644
--- a/examples/maildirresource/maildirresource.cpp
+++ b/examples/maildirresource/maildirresource.cpp
@@ -85,13 +85,13 @@ class MaildirMimeMessageMover : public Sink::Preprocessor
85public: 85public:
86 MaildirMimeMessageMover(const QByteArray &resourceInstanceIdentifier, const QString &maildirPath) : mResourceInstanceIdentifier(resourceInstanceIdentifier), mMaildirPath(maildirPath) {} 86 MaildirMimeMessageMover(const QByteArray &resourceInstanceIdentifier, const QString &maildirPath) : mResourceInstanceIdentifier(resourceInstanceIdentifier), mMaildirPath(maildirPath) {}
87 87
88 QString getPath(const QByteArray &folderIdentifier, Sink::Storage::Transaction &transaction) 88 QString getPath(const QByteArray &folderIdentifier, Sink::Storage::DataStore::Transaction &transaction)
89 { 89 {
90 if (folderIdentifier.isEmpty()) { 90 if (folderIdentifier.isEmpty()) {
91 return mMaildirPath; 91 return mMaildirPath;
92 } 92 }
93 QString folderPath; 93 QString folderPath;
94 auto db = Sink::Storage::mainDatabase(transaction, ENTITY_TYPE_FOLDER); 94 auto db = Sink::Storage::DataStore::mainDatabase(transaction, ENTITY_TYPE_FOLDER);
95 db.findLatest(folderIdentifier, [&](const QByteArray &, const QByteArray &value) { 95 db.findLatest(folderIdentifier, [&](const QByteArray &, const QByteArray &value) {
96 Sink::EntityBuffer buffer(value); 96 Sink::EntityBuffer buffer(value);
97 const Sink::Entity &entity = buffer.entity(); 97 const Sink::Entity &entity = buffer.entity();
@@ -108,7 +108,7 @@ public:
108 return folderPath; 108 return folderPath;
109 } 109 }
110 110
111 QString moveMessage(const QString &oldPath, const QByteArray &folder, Sink::Storage::Transaction &transaction) 111 QString moveMessage(const QString &oldPath, const QByteArray &folder, Sink::Storage::DataStore::Transaction &transaction)
112 { 112 {
113 if (oldPath.startsWith(Sink::temporaryFileLocation())) { 113 if (oldPath.startsWith(Sink::temporaryFileLocation())) {
114 const auto path = getPath(folder, transaction); 114 const auto path = getPath(folder, transaction);
@@ -141,7 +141,7 @@ public:
141 } 141 }
142 } 142 }
143 143
144 void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE 144 void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE
145 { 145 {
146 const auto mimeMessage = newEntity.getProperty("mimeMessage"); 146 const auto mimeMessage = newEntity.getProperty("mimeMessage");
147 if (mimeMessage.isValid()) { 147 if (mimeMessage.isValid()) {
@@ -150,7 +150,7 @@ public:
150 } 150 }
151 151
152 void modifiedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::ApplicationDomain::BufferAdaptor &newEntity, 152 void modifiedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::ApplicationDomain::BufferAdaptor &newEntity,
153 Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE 153 Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE
154 { 154 {
155 const auto mimeMessage = newEntity.getProperty("mimeMessage"); 155 const auto mimeMessage = newEntity.getProperty("mimeMessage");
156 const auto newFolder = newEntity.getProperty("folder"); 156 const auto newFolder = newEntity.getProperty("folder");
@@ -185,7 +185,7 @@ public:
185 maildir.changeEntryFlags(identifier, flags); 185 maildir.changeEntryFlags(identifier, flags);
186 } 186 }
187 187
188 void deletedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE 188 void deletedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE
189 { 189 {
190 const auto filePath = getFilePathFromMimeMessagePath(oldEntity.getProperty("mimeMessage").toString()); 190 const auto filePath = getFilePathFromMimeMessagePath(oldEntity.getProperty("mimeMessage").toString());
191 QFile::remove(filePath); 191 QFile::remove(filePath);
@@ -199,7 +199,7 @@ class FolderPreprocessor : public Sink::Preprocessor
199public: 199public:
200 FolderPreprocessor(const QString maildirPath) : mMaildirPath(maildirPath) {} 200 FolderPreprocessor(const QString maildirPath) : mMaildirPath(maildirPath) {}
201 201
202 void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE 202 void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE
203 { 203 {
204 auto folderName = newEntity.getProperty("name").toString(); 204 auto folderName = newEntity.getProperty("name").toString();
205 const auto path = mMaildirPath + "/" + folderName; 205 const auto path = mMaildirPath + "/" + folderName;
@@ -208,11 +208,11 @@ public:
208 } 208 }
209 209
210 void modifiedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::ApplicationDomain::BufferAdaptor &newEntity, 210 void modifiedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::ApplicationDomain::BufferAdaptor &newEntity,
211 Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE 211 Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE
212 { 212 {
213 } 213 }
214 214
215 void deletedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE 215 void deletedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE
216 { 216 {
217 } 217 }
218 QString mMaildirPath; 218 QString mMaildirPath;
@@ -221,8 +221,8 @@ public:
221 221
222class MaildirSynchronizer : public Sink::Synchronizer { 222class MaildirSynchronizer : public Sink::Synchronizer {
223public: 223public:
224 MaildirSynchronizer(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) 224 MaildirSynchronizer(const Sink::ResourceContext &resourceContext)
225 : Sink::Synchronizer(resourceType, resourceInstanceIdentifier) 225 : Sink::Synchronizer(resourceContext)
226 { 226 {
227 227
228 } 228 }
@@ -278,19 +278,7 @@ public:
278 const QByteArray bufferType = ENTITY_TYPE_FOLDER; 278 const QByteArray bufferType = ENTITY_TYPE_FOLDER;
279 QStringList folderList = listAvailableFolders(); 279 QStringList folderList = listAvailableFolders();
280 SinkTrace() << "Found folders " << folderList; 280 SinkTrace() << "Found folders " << folderList;
281
282 scanForRemovals(bufferType, 281 scanForRemovals(bufferType,
283 [this, &bufferType](const std::function<void(const QByteArray &)> &callback) {
284 //TODO Instead of iterating over all entries in the database, which can also pick up the same item multiple times,
285 //we should rather iterate over an index that contains every uid exactly once. The remoteId index would be such an index,
286 //but we currently fail to iterate over all entries in an index it seems.
287 // auto remoteIds = synchronizationTransaction.openDatabase("rid.mapping." + bufferType, std::function<void(const Sink::Storage::Error &)>(), true);
288 auto mainDatabase = Sink::Storage::mainDatabase(transaction(), bufferType);
289 mainDatabase.scan("", [&](const QByteArray &key, const QByteArray &) {
290 callback(key);
291 return true;
292 });
293 },
294 [&folderList](const QByteArray &remoteId) -> bool { 282 [&folderList](const QByteArray &remoteId) -> bool {
295 return folderList.contains(remoteId); 283 return folderList.contains(remoteId);
296 } 284 }
@@ -323,16 +311,9 @@ public:
323 311
324 const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, path.toUtf8()); 312 const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, path.toUtf8());
325 313
326 auto property = "folder";
327 scanForRemovals(bufferType, 314 scanForRemovals(bufferType,
328 [&](const std::function<void(const QByteArray &)> &callback) { 315 [&](const std::function<void(const QByteArray &)> &callback) {
329 Index index(bufferType + ".index." + property, transaction()); 316 store().indexLookup<ApplicationDomain::Mail, ApplicationDomain::Mail::Folder>(folderLocalId, callback);
330 index.lookup(folderLocalId, [&](const QByteArray &sinkId) {
331 callback(sinkId);
332 },
333 [&](const Index::Error &error) {
334 SinkWarning() << "Error in index: " << error.message << property;
335 });
336 }, 317 },
337 [](const QByteArray &remoteId) -> bool { 318 [](const QByteArray &remoteId) -> bool {
338 return QFile(remoteId).exists(); 319 return QFile(remoteId).exists();
@@ -392,7 +373,7 @@ public:
392class MaildirWriteback : public Sink::SourceWriteBack 373class MaildirWriteback : public Sink::SourceWriteBack
393{ 374{
394public: 375public:
395 MaildirWriteback(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : Sink::SourceWriteBack(resourceType, resourceInstanceIdentifier) 376 MaildirWriteback(const Sink::ResourceContext &resourceContext) : Sink::SourceWriteBack(resourceContext)
396 { 377 {
397 378
398 } 379 }
@@ -442,24 +423,24 @@ public:
442}; 423};
443 424
444 425
445MaildirResource::MaildirResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline) 426MaildirResource::MaildirResource(const Sink::ResourceContext &resourceContext, const QSharedPointer<Sink::Pipeline> &pipeline)
446 : Sink::GenericResource(PLUGIN_NAME, instanceIdentifier, pipeline) 427 : Sink::GenericResource(resourceContext, pipeline)
447{ 428{
448 auto config = ResourceConfig::getConfiguration(instanceIdentifier); 429 auto config = ResourceConfig::getConfiguration(resourceContext.instanceId());
449 mMaildirPath = QDir::cleanPath(QDir::fromNativeSeparators(config.value("path").toString())); 430 mMaildirPath = QDir::cleanPath(QDir::fromNativeSeparators(config.value("path").toString()));
450 //Chop a trailing slash if necessary 431 //Chop a trailing slash if necessary
451 if (mMaildirPath.endsWith("/")) { 432 if (mMaildirPath.endsWith("/")) {
452 mMaildirPath.chop(1); 433 mMaildirPath.chop(1);
453 } 434 }
454 435
455 auto synchronizer = QSharedPointer<MaildirSynchronizer>::create(PLUGIN_NAME, instanceIdentifier); 436 auto synchronizer = QSharedPointer<MaildirSynchronizer>::create(resourceContext);
456 synchronizer->mMaildirPath = mMaildirPath; 437 synchronizer->mMaildirPath = mMaildirPath;
457 setupSynchronizer(synchronizer); 438 setupSynchronizer(synchronizer);
458 auto changereplay = QSharedPointer<MaildirWriteback>::create(PLUGIN_NAME, instanceIdentifier); 439 auto changereplay = QSharedPointer<MaildirWriteback>::create(resourceContext);
459 changereplay->mMaildirPath = mMaildirPath; 440 changereplay->mMaildirPath = mMaildirPath;
460 setupChangereplay(changereplay); 441 setupChangereplay(changereplay);
461 442
462 setupPreprocessors(ENTITY_TYPE_MAIL, QVector<Sink::Preprocessor*>() << new SpecialPurposeProcessor(mResourceType, mResourceInstanceIdentifier) << new MaildirMimeMessageMover(mResourceInstanceIdentifier, mMaildirPath) << new MaildirMailPropertyExtractor << new DefaultIndexUpdater<Sink::ApplicationDomain::Mail>); 443 setupPreprocessors(ENTITY_TYPE_MAIL, QVector<Sink::Preprocessor*>() << new SpecialPurposeProcessor(resourceContext.resourceType, resourceContext.instanceId()) << new MaildirMimeMessageMover(resourceContext.instanceId(), mMaildirPath) << new MaildirMailPropertyExtractor << new DefaultIndexUpdater<Sink::ApplicationDomain::Mail>);
463 setupPreprocessors(ENTITY_TYPE_FOLDER, QVector<Sink::Preprocessor*>() << new FolderPreprocessor(mMaildirPath) << new DefaultIndexUpdater<Sink::ApplicationDomain::Folder>); 444 setupPreprocessors(ENTITY_TYPE_FOLDER, QVector<Sink::Preprocessor*>() << new FolderPreprocessor(mMaildirPath) << new DefaultIndexUpdater<Sink::ApplicationDomain::Folder>);
464 445
465 KPIM::Maildir dir(mMaildirPath, true); 446 KPIM::Maildir dir(mMaildirPath, true);
@@ -480,24 +461,24 @@ MaildirResource::MaildirResource(const QByteArray &instanceIdentifier, const QSh
480void MaildirResource::removeFromDisk(const QByteArray &instanceIdentifier) 461void MaildirResource::removeFromDisk(const QByteArray &instanceIdentifier)
481{ 462{
482 GenericResource::removeFromDisk(instanceIdentifier); 463 GenericResource::removeFromDisk(instanceIdentifier);
483 Sink::Storage(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::ReadWrite).removeFromDisk(); 464 Sink::Storage::DataStore(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::DataStore::ReadWrite).removeFromDisk();
484} 465}
485 466
486KAsync::Job<void> MaildirResource::inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) 467KAsync::Job<void> MaildirResource::inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue)
487{ 468{
488 auto synchronizationStore = QSharedPointer<Sink::Storage>::create(Sink::storageLocation(), mResourceInstanceIdentifier + ".synchronization", Sink::Storage::ReadOnly); 469 auto synchronizationStore = QSharedPointer<Sink::Storage::DataStore>::create(Sink::storageLocation(), mResourceContext.instanceId() + ".synchronization", Sink::Storage::DataStore::ReadOnly);
489 auto synchronizationTransaction = synchronizationStore->createTransaction(Sink::Storage::ReadOnly); 470 auto synchronizationTransaction = synchronizationStore->createTransaction(Sink::Storage::DataStore::ReadOnly);
490 471
491 auto mainStore = QSharedPointer<Sink::Storage>::create(Sink::storageLocation(), mResourceInstanceIdentifier, Sink::Storage::ReadOnly); 472 auto mainStore = QSharedPointer<Sink::Storage::DataStore>::create(Sink::storageLocation(), mResourceContext.instanceId(), Sink::Storage::DataStore::ReadOnly);
492 auto transaction = mainStore->createTransaction(Sink::Storage::ReadOnly); 473 auto transaction = mainStore->createTransaction(Sink::Storage::DataStore::ReadOnly);
493 474
494 auto entityStore = QSharedPointer<EntityStore>::create(mResourceType, mResourceInstanceIdentifier, transaction); 475 Sink::Storage::EntityStore entityStore(mResourceContext);
495 auto syncStore = QSharedPointer<RemoteIdMap>::create(synchronizationTransaction); 476 auto syncStore = QSharedPointer<RemoteIdMap>::create(synchronizationTransaction);
496 477
497 SinkTrace() << "Inspecting " << inspectionType << domainType << entityId << property << expectedValue; 478 SinkTrace() << "Inspecting " << inspectionType << domainType << entityId << property << expectedValue;
498 479
499 if (domainType == ENTITY_TYPE_MAIL) { 480 if (domainType == ENTITY_TYPE_MAIL) {
500 auto mail = entityStore->read<Sink::ApplicationDomain::Mail>(entityId); 481 auto mail = entityStore.readLatest<Sink::ApplicationDomain::Mail>(entityId);
501 const auto filePath = getFilePathFromMimeMessagePath(mail.getMimeMessagePath()); 482 const auto filePath = getFilePathFromMimeMessagePath(mail.getMimeMessagePath());
502 483
503 if (inspectionType == Sink::ResourceControl::Inspection::PropertyInspectionType) { 484 if (inspectionType == Sink::ResourceControl::Inspection::PropertyInspectionType) {
@@ -530,7 +511,7 @@ KAsync::Job<void> MaildirResource::inspect(int inspectionType, const QByteArray
530 } 511 }
531 if (domainType == ENTITY_TYPE_FOLDER) { 512 if (domainType == ENTITY_TYPE_FOLDER) {
532 const auto remoteId = syncStore->resolveLocalId(ENTITY_TYPE_FOLDER, entityId); 513 const auto remoteId = syncStore->resolveLocalId(ENTITY_TYPE_FOLDER, entityId);
533 auto folder = entityStore->read<Sink::ApplicationDomain::Folder>(entityId); 514 auto folder = entityStore.readLatest<Sink::ApplicationDomain::Folder>(entityId);
534 515
535 if (inspectionType == Sink::ResourceControl::Inspection::CacheIntegrityInspectionType) { 516 if (inspectionType == Sink::ResourceControl::Inspection::CacheIntegrityInspectionType) {
536 SinkTrace() << "Inspecting cache integrity" << remoteId; 517 SinkTrace() << "Inspecting cache integrity" << remoteId;
@@ -577,9 +558,9 @@ MaildirResourceFactory::MaildirResourceFactory(QObject *parent)
577 558
578} 559}
579 560
580Sink::Resource *MaildirResourceFactory::createResource(const QByteArray &instanceIdentifier) 561Sink::Resource *MaildirResourceFactory::createResource(const ResourceContext &context)
581{ 562{
582 return new MaildirResource(instanceIdentifier); 563 return new MaildirResource(context);
583} 564}
584 565
585void MaildirResourceFactory::registerFacades(Sink::FacadeFactory &factory) 566void MaildirResourceFactory::registerFacades(Sink::FacadeFactory &factory)
diff --git a/examples/maildirresource/maildirresource.h b/examples/maildirresource/maildirresource.h
index 490e1e6..6265819 100644
--- a/examples/maildirresource/maildirresource.h
+++ b/examples/maildirresource/maildirresource.h
@@ -45,7 +45,7 @@ class MaildirFolderAdaptorFactory;
45class MaildirResource : public Sink::GenericResource 45class MaildirResource : public Sink::GenericResource
46{ 46{
47public: 47public:
48 MaildirResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline = QSharedPointer<Sink::Pipeline>()); 48 MaildirResource(const Sink::ResourceContext &resourceContext, const QSharedPointer<Sink::Pipeline> &pipeline = QSharedPointer<Sink::Pipeline>());
49 KAsync::Job<void> inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE; 49 KAsync::Job<void> inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE;
50 static void removeFromDisk(const QByteArray &instanceIdentifier); 50 static void removeFromDisk(const QByteArray &instanceIdentifier);
51private: 51private:
@@ -64,7 +64,7 @@ class MaildirResourceFactory : public Sink::ResourceFactory
64public: 64public:
65 MaildirResourceFactory(QObject *parent = 0); 65 MaildirResourceFactory(QObject *parent = 0);
66 66
67 Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; 67 Sink::Resource *createResource(const Sink::ResourceContext &context) Q_DECL_OVERRIDE;
68 void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; 68 void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE;
69 void registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry) Q_DECL_OVERRIDE; 69 void registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry) Q_DECL_OVERRIDE;
70 void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; 70 void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE;
diff --git a/examples/mailtransportresource/mailtransportresource.cpp b/examples/mailtransportresource/mailtransportresource.cpp
index 3ce9476..9a22c41 100644
--- a/examples/mailtransportresource/mailtransportresource.cpp
+++ b/examples/mailtransportresource/mailtransportresource.cpp
@@ -41,6 +41,7 @@
41#include <pipeline.h> 41#include <pipeline.h>
42#include <mailpreprocessor.h> 42#include <mailpreprocessor.h>
43#include <indexupdater.h> 43#include <indexupdater.h>
44#include <adaptorfactoryregistry.h>
44 45
45#define ENTITY_TYPE_MAIL "mail" 46#define ENTITY_TYPE_MAIL "mail"
46 47
@@ -52,7 +53,7 @@ using namespace Sink;
52class MailtransportWriteback : public Sink::SourceWriteBack 53class MailtransportWriteback : public Sink::SourceWriteBack
53{ 54{
54public: 55public:
55 MailtransportWriteback(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : Sink::SourceWriteBack(resourceType, resourceInstanceIdentifier) 56 MailtransportWriteback(const Sink::ResourceContext &resourceContext) : Sink::SourceWriteBack(resourceContext)
56 { 57 {
57 58
58 } 59 }
@@ -74,9 +75,9 @@ public:
74 75
75class MailtransportSynchronizer : public Sink::Synchronizer { 76class MailtransportSynchronizer : public Sink::Synchronizer {
76public: 77public:
77 MailtransportSynchronizer(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) 78 MailtransportSynchronizer(const Sink::ResourceContext &resourceContext)
78 : Sink::Synchronizer(resourceType, resourceInstanceIdentifier), 79 : Sink::Synchronizer(resourceContext),
79 mResourceInstanceIdentifier(resourceInstanceIdentifier) 80 mResourceInstanceIdentifier(resourceContext.instanceId())
80 { 81 {
81 82
82 } 83 }
@@ -112,10 +113,9 @@ public:
112 { 113 {
113 SinkLog() << " Synchronizing"; 114 SinkLog() << " Synchronizing";
114 return KAsync::start<void>([this](KAsync::Future<void> future) { 115 return KAsync::start<void>([this](KAsync::Future<void> future) {
115 Sink::Query query;
116 QList<ApplicationDomain::Mail> toSend; 116 QList<ApplicationDomain::Mail> toSend;
117 SinkLog() << " Looking for mail"; 117 SinkLog() << " Looking for mail";
118 store().reader<ApplicationDomain::Mail>().query(query, [&](const ApplicationDomain::Mail &mail) -> bool { 118 store().readAll<ApplicationDomain::Mail>([&](const ApplicationDomain::Mail &mail) -> bool {
119 SinkTrace() << "Found mail: " << mail.identifier(); 119 SinkTrace() << "Found mail: " << mail.identifier();
120 if (!mail.getSent()) { 120 if (!mail.getSent()) {
121 toSend << mail; 121 toSend << mail;
@@ -143,10 +143,10 @@ public:
143 MailtransportResource::Settings mSettings; 143 MailtransportResource::Settings mSettings;
144}; 144};
145 145
146MailtransportResource::MailtransportResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline) 146MailtransportResource::MailtransportResource(const Sink::ResourceContext &resourceContext, const QSharedPointer<Sink::Pipeline> &pipeline)
147 : Sink::GenericResource(PLUGIN_NAME, instanceIdentifier, pipeline) 147 : Sink::GenericResource(resourceContext, pipeline)
148{ 148{
149 auto config = ResourceConfig::getConfiguration(instanceIdentifier); 149 auto config = ResourceConfig::getConfiguration(resourceContext.instanceId());
150 mSettings = {config.value("server").toString(), 150 mSettings = {config.value("server").toString(),
151 config.value("username").toString(), 151 config.value("username").toString(),
152 config.value("cacert").toString(), 152 config.value("cacert").toString(),
@@ -154,11 +154,11 @@ MailtransportResource::MailtransportResource(const QByteArray &instanceIdentifie
154 config.value("testmode").toBool() 154 config.value("testmode").toBool()
155 }; 155 };
156 156
157 auto synchronizer = QSharedPointer<MailtransportSynchronizer>::create(PLUGIN_NAME, instanceIdentifier); 157 auto synchronizer = QSharedPointer<MailtransportSynchronizer>::create(resourceContext);
158 synchronizer->mSettings = mSettings; 158 synchronizer->mSettings = mSettings;
159 setupSynchronizer(synchronizer); 159 setupSynchronizer(synchronizer);
160 160
161 auto changereplay = QSharedPointer<MailtransportWriteback>::create(PLUGIN_NAME, instanceIdentifier); 161 auto changereplay = QSharedPointer<MailtransportWriteback>::create(resourceContext);
162 changereplay->mSettings = mSettings; 162 changereplay->mSettings = mSettings;
163 setupChangereplay(changereplay); 163 setupChangereplay(changereplay);
164 164
@@ -168,14 +168,14 @@ MailtransportResource::MailtransportResource(const QByteArray &instanceIdentifie
168void MailtransportResource::removeFromDisk(const QByteArray &instanceIdentifier) 168void MailtransportResource::removeFromDisk(const QByteArray &instanceIdentifier)
169{ 169{
170 GenericResource::removeFromDisk(instanceIdentifier); 170 GenericResource::removeFromDisk(instanceIdentifier);
171 Sink::Storage(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::ReadWrite).removeFromDisk(); 171 Sink::Storage::DataStore(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::DataStore::ReadWrite).removeFromDisk();
172} 172}
173 173
174KAsync::Job<void> MailtransportResource::inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) 174KAsync::Job<void> MailtransportResource::inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue)
175{ 175{
176 if (domainType == ENTITY_TYPE_MAIL) { 176 if (domainType == ENTITY_TYPE_MAIL) {
177 if (inspectionType == Sink::ResourceControl::Inspection::ExistenceInspectionType) { 177 if (inspectionType == Sink::ResourceControl::Inspection::ExistenceInspectionType) {
178 auto path = resourceStorageLocation(mResourceInstanceIdentifier) + "/test/" + entityId; 178 auto path = resourceStorageLocation(mResourceContext.instanceId()) + "/test/" + entityId;
179 if (QFileInfo::exists(path)) { 179 if (QFileInfo::exists(path)) {
180 return KAsync::null<void>(); 180 return KAsync::null<void>();
181 } 181 }
@@ -191,14 +191,14 @@ MailtransportResourceFactory::MailtransportResourceFactory(QObject *parent)
191 191
192} 192}
193 193
194Sink::Resource *MailtransportResourceFactory::createResource(const QByteArray &instanceIdentifier) 194Sink::Resource *MailtransportResourceFactory::createResource(const Sink::ResourceContext &context)
195{ 195{
196 return new MailtransportResource(instanceIdentifier); 196 return new MailtransportResource(context);
197} 197}
198 198
199void MailtransportResourceFactory::registerFacades(Sink::FacadeFactory &factory) 199void MailtransportResourceFactory::registerFacades(Sink::FacadeFactory &factory)
200{ 200{
201 factory.registerFacade<ApplicationDomain::Mail, DefaultFacade<ApplicationDomain::Mail, DomainTypeAdaptorFactory<ApplicationDomain::Mail>>>(PLUGIN_NAME); 201 factory.registerFacade<ApplicationDomain::Mail, DefaultFacade<ApplicationDomain::Mail>>(PLUGIN_NAME);
202} 202}
203 203
204void MailtransportResourceFactory::registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry) 204void MailtransportResourceFactory::registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry)
diff --git a/examples/mailtransportresource/mailtransportresource.h b/examples/mailtransportresource/mailtransportresource.h
index dcc33df..212880c 100644
--- a/examples/mailtransportresource/mailtransportresource.h
+++ b/examples/mailtransportresource/mailtransportresource.h
@@ -28,7 +28,7 @@
28class MailtransportResource : public Sink::GenericResource 28class MailtransportResource : public Sink::GenericResource
29{ 29{
30public: 30public:
31 MailtransportResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline = QSharedPointer<Sink::Pipeline>()); 31 MailtransportResource(const Sink::ResourceContext &resourceContext, const QSharedPointer<Sink::Pipeline> &pipeline = QSharedPointer<Sink::Pipeline>());
32 KAsync::Job<void> inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE; 32 KAsync::Job<void> inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE;
33 static void removeFromDisk(const QByteArray &instanceIdentifier); 33 static void removeFromDisk(const QByteArray &instanceIdentifier);
34 34
@@ -52,7 +52,7 @@ class MailtransportResourceFactory : public Sink::ResourceFactory
52public: 52public:
53 MailtransportResourceFactory(QObject *parent = 0); 53 MailtransportResourceFactory(QObject *parent = 0);
54 54
55 Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; 55 Sink::Resource *createResource(const Sink::ResourceContext &resourceContext) Q_DECL_OVERRIDE;
56 void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; 56 void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE;
57 void registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry) Q_DECL_OVERRIDE; 57 void registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry) Q_DECL_OVERRIDE;
58 void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; 58 void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE;