From 237b9ae4113e7a9f489632296941becb71afdb45 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 16 Oct 2016 14:55:20 +0200 Subject: 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. --- examples/dummyresource/facade.cpp | 12 ++-- examples/dummyresource/facade.h | 6 +- examples/dummyresource/resourcefactory.cpp | 16 ++--- examples/dummyresource/resourcefactory.h | 4 +- examples/imapresource/facade.cpp | 8 +-- examples/imapresource/facade.h | 4 +- examples/imapresource/imapresource.cpp | 66 +++++++------------ examples/imapresource/imapresource.h | 4 +- examples/maildirresource/facade.cpp | 11 ++-- examples/maildirresource/facade.h | 4 +- examples/maildirresource/maildirresource.cpp | 77 ++++++++-------------- examples/maildirresource/maildirresource.h | 4 +- .../mailtransportresource.cpp | 32 ++++----- .../mailtransportresource/mailtransportresource.h | 4 +- 14 files changed, 107 insertions(+), 145 deletions(-) (limited to 'examples') 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 @@ #include "domainadaptor.h" -DummyResourceFacade::DummyResourceFacade(const QByteArray &instanceIdentifier) - : Sink::GenericFacade(instanceIdentifier, QSharedPointer::create()) +DummyResourceFacade::DummyResourceFacade(const Sink::ResourceContext &context) + : Sink::GenericFacade(context) { } @@ -31,8 +31,8 @@ DummyResourceFacade::~DummyResourceFacade() } -DummyResourceMailFacade::DummyResourceMailFacade(const QByteArray &instanceIdentifier) - : Sink::GenericFacade(instanceIdentifier, QSharedPointer::create()) +DummyResourceMailFacade::DummyResourceMailFacade(const Sink::ResourceContext &context) + : Sink::GenericFacade(context) { } @@ -41,8 +41,8 @@ DummyResourceMailFacade::~DummyResourceMailFacade() } -DummyResourceFolderFacade::DummyResourceFolderFacade(const QByteArray &instanceIdentifier) - : Sink::GenericFacade(instanceIdentifier, QSharedPointer::create()) +DummyResourceFolderFacade::DummyResourceFolderFacade(const Sink::ResourceContext &context) + : Sink::GenericFacade(context) { } 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 @@ class DummyResourceFacade : public Sink::GenericFacade { public: - DummyResourceFacade(const QByteArray &instanceIdentifier); + DummyResourceFacade(const Sink::ResourceContext &context); virtual ~DummyResourceFacade(); }; class DummyResourceMailFacade : public Sink::GenericFacade { public: - DummyResourceMailFacade(const QByteArray &instanceIdentifier); + DummyResourceMailFacade(const Sink::ResourceContext &context); virtual ~DummyResourceMailFacade(); }; class DummyResourceFolderFacade : public Sink::GenericFacade { public: - DummyResourceFolderFacade(const QByteArray &instanceIdentifier); + DummyResourceFolderFacade(const Sink::ResourceContext &context); virtual ~DummyResourceFolderFacade(); }; 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") class DummySynchronizer : public Sink::Synchronizer { public: - DummySynchronizer(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) - : Sink::Synchronizer(resourceType, resourceInstanceIdentifier) + DummySynchronizer(const Sink::ResourceContext &context) + : Sink::Synchronizer(context) { } @@ -129,11 +129,11 @@ class DummySynchronizer : public Sink::Synchronizer { }; -DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline) - : Sink::GenericResource(PLUGIN_NAME, instanceIdentifier, pipeline) +DummyResource::DummyResource(const Sink::ResourceContext &resourceContext, const QSharedPointer &pipeline) + : Sink::GenericResource(resourceContext, pipeline) { - setupSynchronizer(QSharedPointer::create(PLUGIN_NAME, instanceIdentifier)); - setupChangereplay(QSharedPointer::create(instanceIdentifier)); + setupSynchronizer(QSharedPointer::create(resourceContext)); + setupChangereplay(QSharedPointer::create(resourceContext)); setupPreprocessors(ENTITY_TYPE_MAIL, QVector() << new MailPropertyExtractor << new DefaultIndexUpdater); setupPreprocessors(ENTITY_TYPE_FOLDER, @@ -182,9 +182,9 @@ DummyResourceFactory::DummyResourceFactory(QObject *parent) } -Sink::Resource *DummyResourceFactory::createResource(const QByteArray &instanceIdentifier) +Sink::Resource *DummyResourceFactory::createResource(const Sink::ResourceContext &resourceContext) { - return new DummyResource(instanceIdentifier); + return new DummyResource(resourceContext); } void 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 @@ class DummyResource : public Sink::GenericResource { public: - DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline = QSharedPointer()); + DummyResource(const Sink::ResourceContext &resourceContext, const QSharedPointer &pipeline = QSharedPointer()); virtual ~DummyResource(); KAsync::Job synchronizeWithSource() Q_DECL_OVERRIDE; @@ -48,7 +48,7 @@ class DummyResourceFactory : public Sink::ResourceFactory public: DummyResourceFactory(QObject *parent = 0); - Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; + Sink::Resource *createResource(const Sink::ResourceContext &resourceContext) Q_DECL_OVERRIDE; void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; void registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) Q_DECL_OVERRIDE; 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 @@ #include "domainadaptor.h" #include "queryrunner.h" -ImapResourceMailFacade::ImapResourceMailFacade(const QByteArray &instanceIdentifier) - : Sink::GenericFacade(instanceIdentifier, QSharedPointer::create()) +ImapResourceMailFacade::ImapResourceMailFacade(const Sink::ResourceContext &context) + : Sink::GenericFacade(context) { } @@ -34,8 +34,8 @@ ImapResourceMailFacade::~ImapResourceMailFacade() { } -ImapResourceFolderFacade::ImapResourceFolderFacade(const QByteArray &instanceIdentifier) - : Sink::GenericFacade(instanceIdentifier, QSharedPointer::create()) +ImapResourceFolderFacade::ImapResourceFolderFacade(const Sink::ResourceContext &context) + : Sink::GenericFacade(context) { } 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 @@ class ImapResourceMailFacade : public Sink::GenericFacade { public: - ImapResourceMailFacade(const QByteArray &instanceIdentifier); + ImapResourceMailFacade(const Sink::ResourceContext &context); virtual ~ImapResourceMailFacade(); }; class ImapResourceFolderFacade : public Sink::GenericFacade { public: - ImapResourceFolderFacade(const QByteArray &instanceIdentifier); + ImapResourceFolderFacade(const Sink::ResourceContext &context); virtual ~ImapResourceFolderFacade(); }; 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 @@ #include #include "imapserverproxy.h" -#include "entityreader.h" #include "mailpreprocessor.h" +#include "adaptorfactoryregistry.h" #include "specialpurposepreprocessor.h" //This is the resources entity type, and not the domain type @@ -92,8 +92,8 @@ static QByteArray assembleMailRid(const ApplicationDomain::Mail &mail, qint64 im class ImapSynchronizer : public Sink::Synchronizer { public: - ImapSynchronizer(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) - : Sink::Synchronizer(resourceType, resourceInstanceIdentifier) + ImapSynchronizer(const ResourceContext &resourceContext) + : Sink::Synchronizer(resourceContext) { } @@ -126,17 +126,6 @@ public: SinkTrace() << "Found folders " << folderList.size(); scanForRemovals(bufferType, - [this, &bufferType](const std::function &callback) { - //TODO Instead of iterating over all entries in the database, which can also pick up the same item multiple times, - //we should rather iterate over an index that contains every uid exactly once. The remoteId index would be such an index, - //but we currently fail to iterate over all entries in an index it seems. - // auto remoteIds = synchronizationTransaction.openDatabase("rid.mapping." + bufferType, std::function(), true); - auto mainDatabase = Sink::Storage::mainDatabase(transaction(), bufferType); - mainDatabase.scan("", [&](const QByteArray &key, const QByteArray &) { - callback(key); - return true; - }); - }, [&folderList](const QByteArray &remoteId) -> bool { // folderList.contains(remoteId) for (const auto &folderPath : folderList) { @@ -190,18 +179,12 @@ public: const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, path.toUtf8()); int count = 0; - auto property = Sink::ApplicationDomain::Mail::Folder::name; + scanForRemovals(bufferType, [&](const std::function &callback) { - Index index(bufferType + ".index." + property, transaction()); - index.lookup(folderLocalId, [&](const QByteArray &sinkId) { - callback(sinkId); - }, - [&](const Index::Error &error) { - SinkWarning() << "Error in index: " << error.message << property; - }); + store().indexLookup(folderLocalId, callback); }, - [messages, path, &count](const QByteArray &remoteId) -> bool { + [&](const QByteArray &remoteId) -> bool { if (messages.contains(uidFromMailRid(remoteId))) { return true; } @@ -347,7 +330,7 @@ public: class ImapWriteback : public Sink::SourceWriteBack { public: - ImapWriteback(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : Sink::SourceWriteBack(resourceType, resourceInstanceIdentifier) + ImapWriteback(const ResourceContext &resourceContext) : Sink::SourceWriteBack(resourceContext) { } @@ -514,10 +497,10 @@ public: QByteArray mResourceInstanceIdentifier; }; -ImapResource::ImapResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline) - : Sink::GenericResource(PLUGIN_NAME, instanceIdentifier, pipeline) +ImapResource::ImapResource(const ResourceContext &resourceContext, const QSharedPointer &pipeline) + : Sink::GenericResource(resourceContext, pipeline) { - auto config = ResourceConfig::getConfiguration(instanceIdentifier); + auto config = ResourceConfig::getConfiguration(resourceContext.instanceId()); mServer = config.value("server").toString(); mPort = config.value("port").toInt(); mUser = config.value("username").toString(); @@ -532,46 +515,45 @@ ImapResource::ImapResource(const QByteArray &instanceIdentifier, const QSharedPo mPort = list.at(1).toInt(); } - auto synchronizer = QSharedPointer::create(PLUGIN_NAME, instanceIdentifier); + auto synchronizer = QSharedPointer::create(resourceContext); synchronizer->mServer = mServer; synchronizer->mPort = mPort; synchronizer->mUser = mUser; synchronizer->mPassword = mPassword; - synchronizer->mResourceInstanceIdentifier = instanceIdentifier; setupSynchronizer(synchronizer); - auto changereplay = QSharedPointer::create(PLUGIN_NAME, instanceIdentifier); + auto changereplay = QSharedPointer::create(resourceContext); changereplay->mServer = mServer; changereplay->mPort = mPort; changereplay->mUser = mUser; changereplay->mPassword = mPassword; setupChangereplay(changereplay); - setupPreprocessors(ENTITY_TYPE_MAIL, QVector() << new SpecialPurposeProcessor(mResourceType, mResourceInstanceIdentifier) << new MimeMessageMover << new MailPropertyExtractor << new DefaultIndexUpdater); + setupPreprocessors(ENTITY_TYPE_MAIL, QVector() << new SpecialPurposeProcessor(resourceContext.resourceType, resourceContext.instanceId()) << new MimeMessageMover << new MailPropertyExtractor << new DefaultIndexUpdater); setupPreprocessors(ENTITY_TYPE_FOLDER, QVector() << new DefaultIndexUpdater); } void ImapResource::removeFromDisk(const QByteArray &instanceIdentifier) { GenericResource::removeFromDisk(instanceIdentifier); - Sink::Storage(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::ReadWrite).removeFromDisk(); + Sink::Storage::DataStore(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::DataStore::ReadWrite).removeFromDisk(); } KAsync::Job ImapResource::inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) { - auto synchronizationStore = QSharedPointer::create(Sink::storageLocation(), mResourceInstanceIdentifier + ".synchronization", Sink::Storage::ReadOnly); - auto synchronizationTransaction = synchronizationStore->createTransaction(Sink::Storage::ReadOnly); + auto synchronizationStore = QSharedPointer::create(Sink::storageLocation(), mResourceContext.instanceId() + ".synchronization", Sink::Storage::DataStore::ReadOnly); + auto synchronizationTransaction = synchronizationStore->createTransaction(Sink::Storage::DataStore::ReadOnly); - auto mainStore = QSharedPointer::create(Sink::storageLocation(), mResourceInstanceIdentifier, Sink::Storage::ReadOnly); - auto transaction = mainStore->createTransaction(Sink::Storage::ReadOnly); + auto mainStore = QSharedPointer::create(Sink::storageLocation(), mResourceContext.instanceId(), Sink::Storage::DataStore::ReadOnly); + auto transaction = mainStore->createTransaction(Sink::Storage::DataStore::ReadOnly); - auto entityStore = QSharedPointer::create(mResourceType, mResourceInstanceIdentifier, transaction); + Sink::Storage::EntityStore entityStore(mResourceContext); auto syncStore = QSharedPointer::create(synchronizationTransaction); SinkTrace() << "Inspecting " << inspectionType << domainType << entityId << property << expectedValue; if (domainType == ENTITY_TYPE_MAIL) { - const auto mail = entityStore->read(entityId); - const auto folder = entityStore->read(mail.getFolder()); + const auto mail = entityStore.readLatest(entityId); + const auto folder = entityStore.readLatest(mail.getFolder()); const auto folderRemoteId = syncStore->resolveLocalId(ENTITY_TYPE_FOLDER, mail.getFolder()); const auto mailRemoteId = syncStore->resolveLocalId(ENTITY_TYPE_MAIL, mail.identifier()); if (mailRemoteId.isEmpty() || folderRemoteId.isEmpty()) { @@ -635,7 +617,7 @@ KAsync::Job ImapResource::inspect(int inspectionType, const QByteArray &in } if (domainType == ENTITY_TYPE_FOLDER) { const auto remoteId = syncStore->resolveLocalId(ENTITY_TYPE_FOLDER, entityId); - const auto folder = entityStore->read(entityId); + const auto folder = entityStore.readLatest(entityId); if (inspectionType == Sink::ResourceControl::Inspection::CacheIntegrityInspectionType) { SinkLog() << "Inspecting cache integrity" << remoteId; @@ -698,9 +680,9 @@ ImapResourceFactory::ImapResourceFactory(QObject *parent) } -Sink::Resource *ImapResourceFactory::createResource(const QByteArray &instanceIdentifier) +Sink::Resource *ImapResourceFactory::createResource(const ResourceContext &context) { - return new ImapResource(instanceIdentifier); + return new ImapResource(context); } void 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; class ImapResource : public Sink::GenericResource { public: - ImapResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline = QSharedPointer()); + ImapResource(const Sink::ResourceContext &resourceContext, const QSharedPointer &pipeline = QSharedPointer()); KAsync::Job inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE; static void removeFromDisk(const QByteArray &instanceIdentifier); @@ -62,7 +62,7 @@ class ImapResourceFactory : public Sink::ResourceFactory public: ImapResourceFactory(QObject *parent = 0); - Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; + Sink::Resource *createResource(const Sink::ResourceContext &resourceContext) Q_DECL_OVERRIDE; void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; void registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) Q_DECL_OVERRIDE; 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 @@ #include #include -#include "domainadaptor.h" -#include "queryrunner.h" +#include "query.h" -MaildirResourceMailFacade::MaildirResourceMailFacade(const QByteArray &instanceIdentifier) - : Sink::GenericFacade(instanceIdentifier, QSharedPointer::create()) +MaildirResourceMailFacade::MaildirResourceMailFacade(const Sink::ResourceContext &context) + : Sink::GenericFacade(context) { mResultTransformation = [](Sink::ApplicationDomain::ApplicationDomainType &value) { if (value.hasProperty("mimeMessage")) { @@ -62,8 +61,8 @@ QPair, Sink::ResultEmitter } -MaildirResourceFolderFacade::MaildirResourceFolderFacade(const QByteArray &instanceIdentifier) - : Sink::GenericFacade(instanceIdentifier, QSharedPointer::create()) +MaildirResourceFolderFacade::MaildirResourceFolderFacade(const Sink::ResourceContext &context) + : Sink::GenericFacade(context) { } 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 @@ class MaildirResourceMailFacade : public Sink::GenericFacade { public: - MaildirResourceMailFacade(const QByteArray &instanceIdentifier); + MaildirResourceMailFacade(const Sink::ResourceContext &context); virtual ~MaildirResourceMailFacade(); QPair, Sink::ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; }; @@ -32,6 +32,6 @@ public: class MaildirResourceFolderFacade : public Sink::GenericFacade { public: - MaildirResourceFolderFacade(const QByteArray &instanceIdentifier); + MaildirResourceFolderFacade(const Sink::ResourceContext &context); virtual ~MaildirResourceFolderFacade(); }; 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 public: MaildirMimeMessageMover(const QByteArray &resourceInstanceIdentifier, const QString &maildirPath) : mResourceInstanceIdentifier(resourceInstanceIdentifier), mMaildirPath(maildirPath) {} - QString getPath(const QByteArray &folderIdentifier, Sink::Storage::Transaction &transaction) + QString getPath(const QByteArray &folderIdentifier, Sink::Storage::DataStore::Transaction &transaction) { if (folderIdentifier.isEmpty()) { return mMaildirPath; } QString folderPath; - auto db = Sink::Storage::mainDatabase(transaction, ENTITY_TYPE_FOLDER); + auto db = Sink::Storage::DataStore::mainDatabase(transaction, ENTITY_TYPE_FOLDER); db.findLatest(folderIdentifier, [&](const QByteArray &, const QByteArray &value) { Sink::EntityBuffer buffer(value); const Sink::Entity &entity = buffer.entity(); @@ -108,7 +108,7 @@ public: return folderPath; } - QString moveMessage(const QString &oldPath, const QByteArray &folder, Sink::Storage::Transaction &transaction) + QString moveMessage(const QString &oldPath, const QByteArray &folder, Sink::Storage::DataStore::Transaction &transaction) { if (oldPath.startsWith(Sink::temporaryFileLocation())) { const auto path = getPath(folder, transaction); @@ -141,7 +141,7 @@ public: } } - void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE { const auto mimeMessage = newEntity.getProperty("mimeMessage"); if (mimeMessage.isValid()) { @@ -150,7 +150,7 @@ public: } void modifiedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::ApplicationDomain::BufferAdaptor &newEntity, - Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE { const auto mimeMessage = newEntity.getProperty("mimeMessage"); const auto newFolder = newEntity.getProperty("folder"); @@ -185,7 +185,7 @@ public: maildir.changeEntryFlags(identifier, flags); } - void deletedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + void deletedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE { const auto filePath = getFilePathFromMimeMessagePath(oldEntity.getProperty("mimeMessage").toString()); QFile::remove(filePath); @@ -199,7 +199,7 @@ class FolderPreprocessor : public Sink::Preprocessor public: FolderPreprocessor(const QString maildirPath) : mMaildirPath(maildirPath) {} - void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + void newEntity(const QByteArray &uid, qint64 revision, Sink::ApplicationDomain::BufferAdaptor &newEntity, Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE { auto folderName = newEntity.getProperty("name").toString(); const auto path = mMaildirPath + "/" + folderName; @@ -208,11 +208,11 @@ public: } void modifiedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::ApplicationDomain::BufferAdaptor &newEntity, - Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE { } - void deletedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::Transaction &transaction) Q_DECL_OVERRIDE + void deletedEntity(const QByteArray &uid, qint64 revision, const Sink::ApplicationDomain::BufferAdaptor &oldEntity, Sink::Storage::DataStore::Transaction &transaction) Q_DECL_OVERRIDE { } QString mMaildirPath; @@ -221,8 +221,8 @@ public: class MaildirSynchronizer : public Sink::Synchronizer { public: - MaildirSynchronizer(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) - : Sink::Synchronizer(resourceType, resourceInstanceIdentifier) + MaildirSynchronizer(const Sink::ResourceContext &resourceContext) + : Sink::Synchronizer(resourceContext) { } @@ -278,19 +278,7 @@ public: const QByteArray bufferType = ENTITY_TYPE_FOLDER; QStringList folderList = listAvailableFolders(); SinkTrace() << "Found folders " << folderList; - scanForRemovals(bufferType, - [this, &bufferType](const std::function &callback) { - //TODO Instead of iterating over all entries in the database, which can also pick up the same item multiple times, - //we should rather iterate over an index that contains every uid exactly once. The remoteId index would be such an index, - //but we currently fail to iterate over all entries in an index it seems. - // auto remoteIds = synchronizationTransaction.openDatabase("rid.mapping." + bufferType, std::function(), true); - auto mainDatabase = Sink::Storage::mainDatabase(transaction(), bufferType); - mainDatabase.scan("", [&](const QByteArray &key, const QByteArray &) { - callback(key); - return true; - }); - }, [&folderList](const QByteArray &remoteId) -> bool { return folderList.contains(remoteId); } @@ -323,16 +311,9 @@ public: const auto folderLocalId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, path.toUtf8()); - auto property = "folder"; scanForRemovals(bufferType, [&](const std::function &callback) { - Index index(bufferType + ".index." + property, transaction()); - index.lookup(folderLocalId, [&](const QByteArray &sinkId) { - callback(sinkId); - }, - [&](const Index::Error &error) { - SinkWarning() << "Error in index: " << error.message << property; - }); + store().indexLookup(folderLocalId, callback); }, [](const QByteArray &remoteId) -> bool { return QFile(remoteId).exists(); @@ -392,7 +373,7 @@ public: class MaildirWriteback : public Sink::SourceWriteBack { public: - MaildirWriteback(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : Sink::SourceWriteBack(resourceType, resourceInstanceIdentifier) + MaildirWriteback(const Sink::ResourceContext &resourceContext) : Sink::SourceWriteBack(resourceContext) { } @@ -442,24 +423,24 @@ public: }; -MaildirResource::MaildirResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline) - : Sink::GenericResource(PLUGIN_NAME, instanceIdentifier, pipeline) +MaildirResource::MaildirResource(const Sink::ResourceContext &resourceContext, const QSharedPointer &pipeline) + : Sink::GenericResource(resourceContext, pipeline) { - auto config = ResourceConfig::getConfiguration(instanceIdentifier); + auto config = ResourceConfig::getConfiguration(resourceContext.instanceId()); mMaildirPath = QDir::cleanPath(QDir::fromNativeSeparators(config.value("path").toString())); //Chop a trailing slash if necessary if (mMaildirPath.endsWith("/")) { mMaildirPath.chop(1); } - auto synchronizer = QSharedPointer::create(PLUGIN_NAME, instanceIdentifier); + auto synchronizer = QSharedPointer::create(resourceContext); synchronizer->mMaildirPath = mMaildirPath; setupSynchronizer(synchronizer); - auto changereplay = QSharedPointer::create(PLUGIN_NAME, instanceIdentifier); + auto changereplay = QSharedPointer::create(resourceContext); changereplay->mMaildirPath = mMaildirPath; setupChangereplay(changereplay); - setupPreprocessors(ENTITY_TYPE_MAIL, QVector() << new SpecialPurposeProcessor(mResourceType, mResourceInstanceIdentifier) << new MaildirMimeMessageMover(mResourceInstanceIdentifier, mMaildirPath) << new MaildirMailPropertyExtractor << new DefaultIndexUpdater); + setupPreprocessors(ENTITY_TYPE_MAIL, QVector() << new SpecialPurposeProcessor(resourceContext.resourceType, resourceContext.instanceId()) << new MaildirMimeMessageMover(resourceContext.instanceId(), mMaildirPath) << new MaildirMailPropertyExtractor << new DefaultIndexUpdater); setupPreprocessors(ENTITY_TYPE_FOLDER, QVector() << new FolderPreprocessor(mMaildirPath) << new DefaultIndexUpdater); KPIM::Maildir dir(mMaildirPath, true); @@ -480,24 +461,24 @@ MaildirResource::MaildirResource(const QByteArray &instanceIdentifier, const QSh void MaildirResource::removeFromDisk(const QByteArray &instanceIdentifier) { GenericResource::removeFromDisk(instanceIdentifier); - Sink::Storage(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::ReadWrite).removeFromDisk(); + Sink::Storage::DataStore(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::DataStore::ReadWrite).removeFromDisk(); } KAsync::Job MaildirResource::inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) { - auto synchronizationStore = QSharedPointer::create(Sink::storageLocation(), mResourceInstanceIdentifier + ".synchronization", Sink::Storage::ReadOnly); - auto synchronizationTransaction = synchronizationStore->createTransaction(Sink::Storage::ReadOnly); + auto synchronizationStore = QSharedPointer::create(Sink::storageLocation(), mResourceContext.instanceId() + ".synchronization", Sink::Storage::DataStore::ReadOnly); + auto synchronizationTransaction = synchronizationStore->createTransaction(Sink::Storage::DataStore::ReadOnly); - auto mainStore = QSharedPointer::create(Sink::storageLocation(), mResourceInstanceIdentifier, Sink::Storage::ReadOnly); - auto transaction = mainStore->createTransaction(Sink::Storage::ReadOnly); + auto mainStore = QSharedPointer::create(Sink::storageLocation(), mResourceContext.instanceId(), Sink::Storage::DataStore::ReadOnly); + auto transaction = mainStore->createTransaction(Sink::Storage::DataStore::ReadOnly); - auto entityStore = QSharedPointer::create(mResourceType, mResourceInstanceIdentifier, transaction); + Sink::Storage::EntityStore entityStore(mResourceContext); auto syncStore = QSharedPointer::create(synchronizationTransaction); SinkTrace() << "Inspecting " << inspectionType << domainType << entityId << property << expectedValue; if (domainType == ENTITY_TYPE_MAIL) { - auto mail = entityStore->read(entityId); + auto mail = entityStore.readLatest(entityId); const auto filePath = getFilePathFromMimeMessagePath(mail.getMimeMessagePath()); if (inspectionType == Sink::ResourceControl::Inspection::PropertyInspectionType) { @@ -530,7 +511,7 @@ KAsync::Job MaildirResource::inspect(int inspectionType, const QByteArray } if (domainType == ENTITY_TYPE_FOLDER) { const auto remoteId = syncStore->resolveLocalId(ENTITY_TYPE_FOLDER, entityId); - auto folder = entityStore->read(entityId); + auto folder = entityStore.readLatest(entityId); if (inspectionType == Sink::ResourceControl::Inspection::CacheIntegrityInspectionType) { SinkTrace() << "Inspecting cache integrity" << remoteId; @@ -577,9 +558,9 @@ MaildirResourceFactory::MaildirResourceFactory(QObject *parent) } -Sink::Resource *MaildirResourceFactory::createResource(const QByteArray &instanceIdentifier) +Sink::Resource *MaildirResourceFactory::createResource(const ResourceContext &context) { - return new MaildirResource(instanceIdentifier); + return new MaildirResource(context); } void 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; class MaildirResource : public Sink::GenericResource { public: - MaildirResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline = QSharedPointer()); + MaildirResource(const Sink::ResourceContext &resourceContext, const QSharedPointer &pipeline = QSharedPointer()); KAsync::Job inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE; static void removeFromDisk(const QByteArray &instanceIdentifier); private: @@ -64,7 +64,7 @@ class MaildirResourceFactory : public Sink::ResourceFactory public: MaildirResourceFactory(QObject *parent = 0); - Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; + Sink::Resource *createResource(const Sink::ResourceContext &context) Q_DECL_OVERRIDE; void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; void registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) Q_DECL_OVERRIDE; 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 @@ #include #include #include +#include #define ENTITY_TYPE_MAIL "mail" @@ -52,7 +53,7 @@ using namespace Sink; class MailtransportWriteback : public Sink::SourceWriteBack { public: - MailtransportWriteback(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) : Sink::SourceWriteBack(resourceType, resourceInstanceIdentifier) + MailtransportWriteback(const Sink::ResourceContext &resourceContext) : Sink::SourceWriteBack(resourceContext) { } @@ -74,9 +75,9 @@ public: class MailtransportSynchronizer : public Sink::Synchronizer { public: - MailtransportSynchronizer(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) - : Sink::Synchronizer(resourceType, resourceInstanceIdentifier), - mResourceInstanceIdentifier(resourceInstanceIdentifier) + MailtransportSynchronizer(const Sink::ResourceContext &resourceContext) + : Sink::Synchronizer(resourceContext), + mResourceInstanceIdentifier(resourceContext.instanceId()) { } @@ -112,10 +113,9 @@ public: { SinkLog() << " Synchronizing"; return KAsync::start([this](KAsync::Future future) { - Sink::Query query; QList toSend; SinkLog() << " Looking for mail"; - store().reader().query(query, [&](const ApplicationDomain::Mail &mail) -> bool { + store().readAll([&](const ApplicationDomain::Mail &mail) -> bool { SinkTrace() << "Found mail: " << mail.identifier(); if (!mail.getSent()) { toSend << mail; @@ -143,10 +143,10 @@ public: MailtransportResource::Settings mSettings; }; -MailtransportResource::MailtransportResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline) - : Sink::GenericResource(PLUGIN_NAME, instanceIdentifier, pipeline) +MailtransportResource::MailtransportResource(const Sink::ResourceContext &resourceContext, const QSharedPointer &pipeline) + : Sink::GenericResource(resourceContext, pipeline) { - auto config = ResourceConfig::getConfiguration(instanceIdentifier); + auto config = ResourceConfig::getConfiguration(resourceContext.instanceId()); mSettings = {config.value("server").toString(), config.value("username").toString(), config.value("cacert").toString(), @@ -154,11 +154,11 @@ MailtransportResource::MailtransportResource(const QByteArray &instanceIdentifie config.value("testmode").toBool() }; - auto synchronizer = QSharedPointer::create(PLUGIN_NAME, instanceIdentifier); + auto synchronizer = QSharedPointer::create(resourceContext); synchronizer->mSettings = mSettings; setupSynchronizer(synchronizer); - auto changereplay = QSharedPointer::create(PLUGIN_NAME, instanceIdentifier); + auto changereplay = QSharedPointer::create(resourceContext); changereplay->mSettings = mSettings; setupChangereplay(changereplay); @@ -168,14 +168,14 @@ MailtransportResource::MailtransportResource(const QByteArray &instanceIdentifie void MailtransportResource::removeFromDisk(const QByteArray &instanceIdentifier) { GenericResource::removeFromDisk(instanceIdentifier); - Sink::Storage(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::ReadWrite).removeFromDisk(); + Sink::Storage::DataStore(Sink::storageLocation(), instanceIdentifier + ".synchronization", Sink::Storage::DataStore::ReadWrite).removeFromDisk(); } KAsync::Job MailtransportResource::inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) { if (domainType == ENTITY_TYPE_MAIL) { if (inspectionType == Sink::ResourceControl::Inspection::ExistenceInspectionType) { - auto path = resourceStorageLocation(mResourceInstanceIdentifier) + "/test/" + entityId; + auto path = resourceStorageLocation(mResourceContext.instanceId()) + "/test/" + entityId; if (QFileInfo::exists(path)) { return KAsync::null(); } @@ -191,14 +191,14 @@ MailtransportResourceFactory::MailtransportResourceFactory(QObject *parent) } -Sink::Resource *MailtransportResourceFactory::createResource(const QByteArray &instanceIdentifier) +Sink::Resource *MailtransportResourceFactory::createResource(const Sink::ResourceContext &context) { - return new MailtransportResource(instanceIdentifier); + return new MailtransportResource(context); } void MailtransportResourceFactory::registerFacades(Sink::FacadeFactory &factory) { - factory.registerFacade>>(PLUGIN_NAME); + factory.registerFacade>(PLUGIN_NAME); } void MailtransportResourceFactory::registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) 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 @@ class MailtransportResource : public Sink::GenericResource { public: - MailtransportResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline = QSharedPointer()); + MailtransportResource(const Sink::ResourceContext &resourceContext, const QSharedPointer &pipeline = QSharedPointer()); KAsync::Job inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE; static void removeFromDisk(const QByteArray &instanceIdentifier); @@ -52,7 +52,7 @@ class MailtransportResourceFactory : public Sink::ResourceFactory public: MailtransportResourceFactory(QObject *parent = 0); - Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; + Sink::Resource *createResource(const Sink::ResourceContext &resourceContext) Q_DECL_OVERRIDE; void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; void registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) Q_DECL_OVERRIDE; void removeDataFromDisk(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; -- cgit v1.2.3