SVN commit 587985 by vkrause: - Add transaction management jobs - Use a transactions for item deletion, this fixes the additional emitting of an item change notification on deletion M +2 -0 CMakeLists.txt M +47 -16 itemdeletejob.cpp M +1 -2 itemdeletejob.h M +0 -2 tests/monitortest.cpp A transactionjobs.cpp [License: LGPL (v2+)] A transactionjobs.h [License: LGPL (v2+)] --- trunk/KDE/kdepim/akonadi/libakonadi/CMakeLists.txt #587984:587985 @@ -46,6 +46,7 @@ monitor.cpp profilemanager.cpp profilemodel.cpp + transactionjobs.cpp ) qt4_add_dbus_interfaces(akonadi_LIB_SRC ${CMAKE_SOURCE_DIR}/akonadi/server/interfaces/org.kde.Akonadi.NotificationManager.xml) @@ -90,6 +91,7 @@ messagequery.h monitor.h profilemanager.h + transactionjobs.h DESTINATION ${INCLUDE_INSTALL_DIR}/libakonadi ) --- trunk/KDE/kdepim/akonadi/libakonadi/itemdeletejob.cpp #587984:587985 @@ -20,13 +20,22 @@ #include "itemdeletejob.h" #include "itemstorejob.h" #include "expungejob.h" +#include "transactionjobs.h" using namespace PIM; class PIM::ItemDeleteJobPrivate { public: + enum State { + Begin, + Store, + Expunge, + Commit + }; + DataReference ref; + State state; }; PIM::ItemDeleteJob::ItemDeleteJob(const DataReference & ref, QObject * parent) : @@ -34,6 +43,7 @@ d( new ItemDeleteJobPrivate ) { d->ref = ref; + d->state = ItemDeleteJobPrivate::Begin; } PIM::ItemDeleteJob::~ ItemDeleteJob() @@ -43,31 +53,52 @@ void PIM::ItemDeleteJob::doStart() { - ItemStoreJob* job = new ItemStoreJob( d->ref, this ); - job->addFlag( "\\Deleted" ); - connect( job, SIGNAL(done(PIM::Job*)), SLOT(storeDone(PIM::Job*)) ); - job->start(); + TransactionBeginJob *begin = new TransactionBeginJob( this ); + connect( begin, SIGNAL(done(PIM::Job*)), SLOT(jobDone(PIM::Job*)) ); + begin->start(); } -void PIM::ItemDeleteJob::storeDone(PIM::Job * job) +void PIM::ItemDeleteJob::jobDone(PIM::Job * job) { if ( job->error() ) { setError( job->error(), job->errorMessage() ); + job->deleteLater(); emit done( this ); - } else { - job->deleteLater(); - ExpungeJob *ejob = new ExpungeJob( this ); - connect( ejob, SIGNAL(done(PIM::Job*)), SLOT(expungeDone(PIM::Job*)) ); - ejob->start(); + return; } -} -void PIM::ItemDeleteJob::expungeDone(PIM::Job * job) -{ - if ( job->error() ) - setError( job->error(), job->errorMessage() ); + switch ( d->state ) { + case ItemDeleteJobPrivate::Begin: + { + ItemStoreJob* store = new ItemStoreJob( d->ref, this ); + store->addFlag( "\\Deleted" ); + connect( store, SIGNAL(done(PIM::Job*)), SLOT(jobDone(PIM::Job*)) ); + store->start(); + d->state = ItemDeleteJobPrivate::Store; + break; + } + case ItemDeleteJobPrivate::Store: + { + ExpungeJob *expunge = new ExpungeJob( this ); + connect( expunge, SIGNAL(done(PIM::Job*)), SLOT(jobDone(PIM::Job*)) ); + expunge->start(); + d->state = ItemDeleteJobPrivate::Expunge; + break; + } + case ItemDeleteJobPrivate::Expunge: + { + TransactionCommitJob *commit = new TransactionCommitJob( this ); + connect( commit, SIGNAL(done(PIM::Job*)), SLOT(jobDone(PIM::Job*)) ); + commit->start(); + d->state = ItemDeleteJobPrivate::Commit; + break; + } + case ItemDeleteJobPrivate::Commit: + emit done( this ); + break; + } + job->deleteLater(); - emit done( this ); } #include "itemdeletejob.moc" --- trunk/KDE/kdepim/akonadi/libakonadi/itemdeletejob.h #587984:587985 @@ -51,8 +51,7 @@ virtual void doStart(); private slots: - void storeDone( PIM::Job* job ); - void expungeDone( PIM::Job* job ); + void jobDone( PIM::Job* job ); private: ItemDeleteJobPrivate *d; --- trunk/KDE/kdepim/akonadi/libakonadi/tests/monitortest.cpp #587984:587985 @@ -114,7 +114,6 @@ QVERIFY( del->exec() ); qApp->processEvents(); - QEXPECT_FAIL( "", "deletion is splitted into two commands...", Continue ); QCOMPARE( cmspy.count(), 1 ); arg = cmspy.takeFirst(); QCOMPARE( arg.at(0).toByteArray(), QByteArray( "res3/monitor" ) ); @@ -128,7 +127,6 @@ QVERIFY( caspy.isEmpty() ); QVERIFY( crspy.isEmpty() ); QVERIFY( iaspy.isEmpty() ); - QEXPECT_FAIL( "", "deletion is splitted into two commands...", Continue ); QVERIFY( imspy.isEmpty() ); imspy.clear();