From 02c311e38b8b9b80814a4e8e582d5c5a56a51056 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 30 Dec 2015 09:32:52 +0100 Subject: Don't expose enabling/disabling of changerecording to resource implementations --- common/genericresource.cpp | 20 ++++++++++++++++++++ common/genericresource.h | 4 +++- examples/maildirresource/maildirresource.cpp | 14 +++++--------- examples/maildirresource/maildirresource.h | 2 +- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/common/genericresource.cpp b/common/genericresource.cpp index 1af9226..9fbcaaa 100644 --- a/common/genericresource.cpp +++ b/common/genericresource.cpp @@ -370,6 +370,26 @@ void GenericResource::processCommand(int commandId, const QByteArray &data) } } +KAsync::Job GenericResource::synchronizeWithSource() +{ + return KAsync::start([this]() { + Log() << " Synchronizing"; + //Changereplay would deadlock otherwise when trying to open the synchronization store + enableChangeReplay(false); + auto mainStore = QSharedPointer::create(Akonadi2::storageLocation(), mResourceInstanceIdentifier, Akonadi2::Storage::ReadOnly); + auto syncStore = QSharedPointer::create(Akonadi2::storageLocation(), mResourceInstanceIdentifier + ".synchronization", Akonadi2::Storage::ReadWrite); + synchronizeWithSource(*mainStore, *syncStore).then([this, mainStore, syncStore]() { + Log() << "Done Synchronizing"; + enableChangeReplay(true); + }).exec(); + }); +} + +KAsync::Job GenericResource::synchronizeWithSource(Akonadi2::Storage &mainStore, Akonadi2::Storage &synchronizationStore) +{ + return KAsync::null(); +} + static void waitForDrained(KAsync::Future &f, MessageQueue &queue) { if (queue.isEmpty()) { diff --git a/common/genericresource.h b/common/genericresource.h index 9c8b977..ea68a25 100644 --- a/common/genericresource.h +++ b/common/genericresource.h @@ -44,7 +44,8 @@ public: virtual ~GenericResource(); virtual void processCommand(int commandId, const QByteArray &data) Q_DECL_OVERRIDE; - virtual KAsync::Job synchronizeWithSource() Q_DECL_OVERRIDE = 0; + virtual KAsync::Job synchronizeWithSource() Q_DECL_OVERRIDE; + virtual KAsync::Job synchronizeWithSource(Akonadi2::Storage &mainStore, Akonadi2::Storage &synchronizationStore); virtual KAsync::Job processAllMessages() Q_DECL_OVERRIDE; virtual void setLowerBoundRevision(qint64 revision) Q_DECL_OVERRIDE; @@ -52,6 +53,7 @@ public: static void removeFromDisk(const QByteArray &instanceIdentifier); static qint64 diskUsage(const QByteArray &instanceIdentifier); + private Q_SLOTS: void updateLowerBoundRevision(); diff --git a/examples/maildirresource/maildirresource.cpp b/examples/maildirresource/maildirresource.cpp index 45ee8c1..6c6c5aa 100644 --- a/examples/maildirresource/maildirresource.cpp +++ b/examples/maildirresource/maildirresource.cpp @@ -344,28 +344,24 @@ void MaildirResource::synchronizeMails(Akonadi2::Storage::Transaction &transacti } } -KAsync::Job MaildirResource::synchronizeWithSource() +KAsync::Job MaildirResource::synchronizeWithSource(Akonadi2::Storage &mainStore, Akonadi2::Storage &synchronizationStore) { Log() << " Synchronizing"; - return KAsync::start([this]() { - //Changereplay would deadlock otherwise when trying to open the synchronization store - enableChangeReplay(false); - auto transaction = Akonadi2::Storage(Akonadi2::storageLocation(), mResourceInstanceIdentifier, Akonadi2::Storage::ReadOnly).createTransaction(Akonadi2::Storage::ReadOnly); - Akonadi2::Storage store(Akonadi2::storageLocation(), mResourceInstanceIdentifier + ".synchronization", Akonadi2::Storage::ReadWrite); + return KAsync::start([this, &mainStore, &synchronizationStore]() { + auto transaction = mainStore.createTransaction(Akonadi2::Storage::ReadOnly); { - auto synchronizationTransaction = store.createTransaction(Akonadi2::Storage::ReadWrite); + auto synchronizationTransaction = synchronizationStore.createTransaction(Akonadi2::Storage::ReadWrite); synchronizeFolders(transaction, synchronizationTransaction); //The next sync needs the folders available synchronizationTransaction.commit(); } for (const auto &folder : listAvailableFolders()) { - auto synchronizationTransaction = store.createTransaction(Akonadi2::Storage::ReadWrite); + auto synchronizationTransaction = synchronizationStore.createTransaction(Akonadi2::Storage::ReadWrite); synchronizeMails(transaction, synchronizationTransaction, folder); //Don't let the transaction grow too much synchronizationTransaction.commit(); } Log() << "Done Synchronizing"; - enableChangeReplay(true); }); } diff --git a/examples/maildirresource/maildirresource.h b/examples/maildirresource/maildirresource.h index b3ceefa..9c205c8 100644 --- a/examples/maildirresource/maildirresource.h +++ b/examples/maildirresource/maildirresource.h @@ -35,7 +35,7 @@ class MaildirResource : public Akonadi2::GenericResource { public: MaildirResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline = QSharedPointer()); - KAsync::Job synchronizeWithSource() Q_DECL_OVERRIDE; + KAsync::Job synchronizeWithSource(Akonadi2::Storage &mainStore, Akonadi2::Storage &synchronizationStore) Q_DECL_OVERRIDE; static void removeFromDisk(const QByteArray &instanceIdentifier); private: KAsync::Job replay(const QByteArray &type, const QByteArray &key, const QByteArray &value) Q_DECL_OVERRIDE; -- cgit v1.2.3