From e99453c21eb9100d6fe05ccec153fe6e640bb440 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 29 Dec 2015 22:32:50 +0100 Subject: Pass transactions into sync functions So we create the store in one place. --- examples/maildirresource/maildirresource.cpp | 23 +++++++++++++---------- examples/maildirresource/maildirresource.h | 4 ++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/examples/maildirresource/maildirresource.cpp b/examples/maildirresource/maildirresource.cpp index c3b3047..45ee8c1 100644 --- a/examples/maildirresource/maildirresource.cpp +++ b/examples/maildirresource/maildirresource.cpp @@ -251,15 +251,12 @@ void MaildirResource::createOrModify(Akonadi2::Storage::Transaction &transaction } } -void MaildirResource::synchronizeFolders(Akonadi2::Storage::Transaction &transaction) +void MaildirResource::synchronizeFolders(Akonadi2::Storage::Transaction &transaction, Akonadi2::Storage::Transaction &synchronizationTransaction) { const QByteArray bufferType = ENTITY_TYPE_FOLDER; QStringList folderList = listAvailableFolders(); Trace() << "Found folders " << folderList; - Akonadi2::Storage store(Akonadi2::storageLocation(), mResourceInstanceIdentifier + ".synchronization", Akonadi2::Storage::ReadWrite); - auto synchronizationTransaction = store.createTransaction(Akonadi2::Storage::ReadWrite); - auto mainDatabase = transaction.openDatabase(bufferType + ".main"); scanForRemovals(transaction, synchronizationTransaction, bufferType, [&folderList](const QByteArray &remoteId) -> bool { return folderList.contains(remoteId); }); @@ -279,7 +276,7 @@ void MaildirResource::synchronizeFolders(Akonadi2::Storage::Transaction &transac } } -void MaildirResource::synchronizeMails(Akonadi2::Storage::Transaction &transaction, const QString &path) +void MaildirResource::synchronizeMails(Akonadi2::Storage::Transaction &transaction, Akonadi2::Storage::Transaction &synchronizationTransaction, const QString &path) { Trace() << "Synchronizing mails" << path; const QByteArray bufferType = ENTITY_TYPE_MAIL; @@ -296,9 +293,6 @@ void MaildirResource::synchronizeMails(Akonadi2::Storage::Transaction &transacti QFileInfo entryInfo; - Akonadi2::Storage store(Akonadi2::storageLocation(), mResourceInstanceIdentifier + ".synchronization", Akonadi2::Storage::ReadWrite); - auto synchronizationTransaction = store.createTransaction(Akonadi2::Storage::ReadWrite); - const auto folderLocalId = resolveRemoteId(ENTITY_TYPE_FOLDER, path, synchronizationTransaction); auto exists = [&listingPath](const QByteArray &remoteId) -> bool { @@ -357,9 +351,18 @@ KAsync::Job MaildirResource::synchronizeWithSource() //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); - synchronizeFolders(transaction); + Akonadi2::Storage store(Akonadi2::storageLocation(), mResourceInstanceIdentifier + ".synchronization", Akonadi2::Storage::ReadWrite); + { + auto synchronizationTransaction = store.createTransaction(Akonadi2::Storage::ReadWrite); + synchronizeFolders(transaction, synchronizationTransaction); + //The next sync needs the folders available + synchronizationTransaction.commit(); + } for (const auto &folder : listAvailableFolders()) { - synchronizeMails(transaction, folder); + auto synchronizationTransaction = store.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 e577e18..b3ceefa 100644 --- a/examples/maildirresource/maildirresource.h +++ b/examples/maildirresource/maildirresource.h @@ -75,8 +75,8 @@ private: */ void createOrModify(Akonadi2::Storage::Transaction &transaction, Akonadi2::Storage::Transaction &synchronizationTransaction, DomainTypeAdaptorFactoryInterface &adaptorFactory, const QByteArray &bufferType, const QByteArray &remoteId, const Akonadi2::ApplicationDomain::ApplicationDomainType &entity); - void synchronizeFolders(Akonadi2::Storage::Transaction &transaction); - void synchronizeMails(Akonadi2::Storage::Transaction &transaction, const QString &folder); + void synchronizeFolders(Akonadi2::Storage::Transaction &transaction, Akonadi2::Storage::Transaction &synchronizationTransaction); + void synchronizeMails(Akonadi2::Storage::Transaction &transaction, Akonadi2::Storage::Transaction &synchronizationTransaction, const QString &folder); QStringList listAvailableFolders(); QString mMaildirPath; QSharedPointer mMailAdaptorFactory; -- cgit v1.2.3