summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
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;