From 5cacb4ebf75cf00253f80f807e92006d588c2bc7 Mon Sep 17 00:00:00 2001 From: Rex Dieter Date: Oct 13 2012 15:07:20 +0000 Subject: include a couple upstream patches --- diff --git a/0001-Fix-losing-the-body-for-some-operations-when-the-res.patch b/0001-Fix-losing-the-body-for-some-operations-when-the-res.patch new file mode 100644 index 0000000..5849b94 --- /dev/null +++ b/0001-Fix-losing-the-body-for-some-operations-when-the-res.patch @@ -0,0 +1,172 @@ +From 4c011a8f5d6d9851a45997a9e63d8d3211d9e0d7 Mon Sep 17 00:00:00 2001 +From: Andras Mantia +Date: Sun, 30 Sep 2012 13:42:38 +0300 +Subject: [PATCH 1/2] Fix losing the body for some operations when the resouce + is offline (e.g copy/move items from an offline + resource). REVIEW: 106627 (cherry picked from commit + f40e5d6ffa0249b7bc8d88189822433a0aaeff91) + +Conflicts: + server/src/storage/itemretriever.cpp +--- + server/src/handler/colcopy.cpp | 4 +++- + server/src/handler/colmove.cpp | 4 +++- + server/src/handler/copy.cpp | 4 +++- + server/src/handler/modify.cpp | 4 +++- + server/src/handler/move.cpp | 4 +++- + server/src/storage/itemretriever.cpp | 18 ++++++++++++++---- + server/src/storage/itemretriever.h | 3 +++ + 7 files changed, 32 insertions(+), 9 deletions(-) + +diff --git a/server/src/handler/colcopy.cpp b/server/src/handler/colcopy.cpp +index 417df4c..8f90ad3 100644 +--- a/server/src/handler/colcopy.cpp ++++ b/server/src/handler/colcopy.cpp +@@ -94,7 +94,9 @@ bool ColCopy::parseStream() + ItemRetriever retriever( connection() ); + retriever.setCollection( source, true ); + retriever.setRetrieveFullPayload( true ); +- retriever.exec(); ++ if (!retriever.exec()) { ++ return failureResponse( retriever.lastError() ); ++ } + + DataStore *store = connection()->storageBackend(); + Transaction transaction( store ); +diff --git a/server/src/handler/colmove.cpp b/server/src/handler/colmove.cpp +index 65b8b2f..bca7375 100644 +--- a/server/src/handler/colmove.cpp ++++ b/server/src/handler/colmove.cpp +@@ -62,7 +62,9 @@ bool ColMove::parseStream() + ItemRetriever retriever( connection() ); + retriever.setCollection( source, true ); + retriever.setRetrieveFullPayload( true ); +- retriever.exec(); ++ if (!retriever.exec()) { ++ return failureResponse( retriever.lastError() ); ++ } + + DataStore *store = connection()->storageBackend(); + Transaction transaction( store ); +diff --git a/server/src/handler/copy.cpp b/server/src/handler/copy.cpp +index b67e4d3..fa28179 100644 +--- a/server/src/handler/copy.cpp ++++ b/server/src/handler/copy.cpp +@@ -73,7 +73,9 @@ bool Copy::parseStream() + ItemRetriever retriever( connection() ); + retriever.setItemSet( set ); + retriever.setRetrieveFullPayload( true ); +- retriever.exec(); ++ if (!retriever.exec()) { ++ return failureResponse( retriever.lastError() ); ++ } + + const QByteArray tmp = m_streamParser->readString(); + const Collection targetCollection = HandlerHelper::collectionFromIdOrName( tmp ); +diff --git a/server/src/handler/modify.cpp b/server/src/handler/modify.cpp +index 52a5b86..82d43e5 100644 +--- a/server/src/handler/modify.cpp ++++ b/server/src/handler/modify.cpp +@@ -70,7 +70,9 @@ bool Modify::parseStream() + ItemRetriever retriever( connection() ); + retriever.setCollection( collection, true ); + retriever.setRetrieveFullPayload( true ); +- retriever.exec(); ++ if (!retriever.exec()) { ++ throw HandlerException( retriever.lastError() ); ++ } + } + } + +diff --git a/server/src/handler/move.cpp b/server/src/handler/move.cpp +index 37fc8d6..754b53c 100644 +--- a/server/src/handler/move.cpp ++++ b/server/src/handler/move.cpp +@@ -50,7 +50,9 @@ bool Move::parseStream() + ItemRetriever retriever( connection() ); + retriever.setScope( mScope ); + retriever.setRetrieveFullPayload( true ); +- retriever.exec(); ++ if (!retriever.exec()) { ++ return failureResponse( retriever.lastError() ); ++ } + + DataStore *store = connection()->storageBackend(); + Transaction transaction( store ); +diff --git a/server/src/storage/itemretriever.cpp b/server/src/storage/itemretriever.cpp +index 9f17e66..e7d5c6d 100644 +--- a/server/src/storage/itemretriever.cpp ++++ b/server/src/storage/itemretriever.cpp +@@ -160,8 +160,10 @@ QSqlQuery ItemRetriever::buildQuery() const + + qb.addSortColumn( PimItem::idFullColumnName(), Query::Ascending ); + +- if ( !qb.exec() ) +- throw ItemRetrieverException( "Unable to retrieve items" ); ++ if ( !qb.exec() ) { ++ mLastError = "Unable to retrieve items"; ++ throw ItemRetrieverException( mLastError ); ++ } + + qb.query().next(); + +@@ -233,25 +235,33 @@ bool ItemRetriever::exec() + ItemRetrievalManager::instance()->requestItemDelivery( request ); + } catch ( const ItemRetrieverException &e ) { + akError() << e.type() << ": " << e.what(); ++ mLastError = e.what(); + return false; + } + } + + // retrieve items in child collections if requested ++ bool result = true; + if ( mRecursive && mCollection.isValid() ) { + Q_FOREACH ( const Collection &col, mCollection.children() ) { + ItemRetriever retriever( mConnection ); + retriever.setCollection( col, mRecursive ); + retriever.setRetrieveParts( mParts ); + retriever.setRetrieveFullPayload( mFullPayload ); +- retriever.exec(); ++ result = retriever.exec(); ++ if (!result) break; + } + } + +- return true; ++ return result; + } + + QString ItemRetriever::driverName() + { + return mConnection->storageBackend()->database().driverName(); + } ++ ++QByteArray ItemRetriever::lastError() const ++{ ++ return mLastError; ++} +diff --git a/server/src/storage/itemretriever.h b/server/src/storage/itemretriever.h +index 866d265..8158f60 100644 +--- a/server/src/storage/itemretriever.h ++++ b/server/src/storage/itemretriever.h +@@ -64,6 +64,8 @@ class ItemRetriever + + bool exec(); + ++ QByteArray lastError() const; ++ + private: + /** Convenience method which returns the database driver name */ + QString driverName(); +@@ -77,6 +79,7 @@ class ItemRetriever + QStringList mParts; + bool mFullPayload; + bool mRecursive; ++ mutable QByteArray mLastError; + }; + + } +-- +1.7.12.1 + diff --git a/0002-Call-a-newer-version-of-requestItemDelivery-to-get-t.patch b/0002-Call-a-newer-version-of-requestItemDelivery-to-get-t.patch new file mode 100644 index 0000000..b66e2ed --- /dev/null +++ b/0002-Call-a-newer-version-of-requestItemDelivery-to-get-t.patch @@ -0,0 +1,123 @@ +From e7eea8d764c79ac4e79fb33f8f3401ffa0617d41 Mon Sep 17 00:00:00 2001 +From: Andras Mantia +Date: Sun, 30 Sep 2012 13:43:54 +0300 +Subject: [PATCH 2/2] Call a newer version of requestItemDelivery to get the + payload for an item, a version that returns the error + message, not just a bool failure/success value. In case + the resource doesn't implement the new method, the old + version is called. REVIEW: 106627 (cherry picked from + commit bb74c09e6c3f89270180918c6dad12585699b0dd) + +--- + interfaces/org.freedesktop.Akonadi.Resource.xml | 7 ++++++ + server/src/storage/itemretrievaljob.cpp | 30 ++++++++++++++++++++++++- + server/src/storage/itemretrievaljob.h | 5 ++++- + 3 files changed, 40 insertions(+), 2 deletions(-) + +diff --git a/interfaces/org.freedesktop.Akonadi.Resource.xml b/interfaces/org.freedesktop.Akonadi.Resource.xml +index a716a1f..528340a 100644 +--- a/interfaces/org.freedesktop.Akonadi.Resource.xml ++++ b/interfaces/org.freedesktop.Akonadi.Resource.xml +@@ -16,6 +16,13 @@ + + + ++ ++ ++ ++ ++ ++ ++ + + + +diff --git a/server/src/storage/itemretrievaljob.cpp b/server/src/storage/itemretrievaljob.cpp +index c6f1ac6..443d20f 100644 +--- a/server/src/storage/itemretrievaljob.cpp ++++ b/server/src/storage/itemretrievaljob.cpp +@@ -36,15 +36,17 @@ void ItemRetrievalJob::start(QDBusAbstractInterface* interface) + Q_ASSERT( m_request ); + akDebug() << "processing retrieval request for item" << m_request->id << " parts:" << m_request->parts << " of resource:" << m_request->resourceId; + ++ m_interface = interface; + // call the resource + if ( interface ) { + m_active = true; ++ m_oldMethodCalled = false; + QList arguments; + arguments << m_request->id + << QString::fromUtf8( m_request->remoteId ) + << QString::fromUtf8( m_request->mimeType ) + << m_request->parts; +- interface->callWithCallback( QLatin1String( "requestItemDelivery" ), arguments, this, SLOT(callFinished(bool)), SLOT(callFailed(QDBusError)) ); ++ interface->callWithCallback( QLatin1String( "requestItemDeliveryV2" ), arguments, this, SLOT(callFinished(QString)), SLOT(callFailed(QDBusError)) ); + } else { + Q_EMIT requestCompleted( m_request, QString::fromLatin1( "Unable to contact resource" ) ); + deleteLater(); +@@ -69,8 +71,34 @@ void ItemRetrievalJob::callFinished(bool returnValue) + deleteLater(); + } + ++void ItemRetrievalJob::callFinished(const QString& errorMsg) ++{ ++ if ( m_active ) { ++ m_active = false; ++ if ( !errorMsg.isEmpty() ) ++ Q_EMIT requestCompleted( m_request, QString::fromLatin1( "Unable to retrieve item from resource: %1" ).arg( errorMsg ) ); ++ else ++ Q_EMIT requestCompleted( m_request, QString() ); ++ } ++ deleteLater(); ++} ++ ++ + void ItemRetrievalJob::callFailed(const QDBusError& error) + { ++ if ( error.type() == QDBusError::UnknownMethod && !m_oldMethodCalled ) { ++ akDebug() << "processing retrieval request (old method) for item" << m_request->id << " parts:" << m_request->parts << " of resource:" << m_request->resourceId; ++ Q_ASSERT(m_interface); ++ //try the old version ++ QList arguments; ++ arguments << m_request->id ++ << QString::fromUtf8( m_request->remoteId ) ++ << QString::fromUtf8( m_request->mimeType ) ++ << m_request->parts; ++ m_oldMethodCalled = true; ++ m_interface->callWithCallback( QLatin1String( "requestItemDelivery" ), arguments, this, SLOT(callFinished(bool)), SLOT(callFailed(QDBusError)) ); ++ return; ++ } + if ( m_active ) { + m_active = false; + Q_EMIT requestCompleted( m_request, QString::fromLatin1( "Unable to retrieve item from resource: %1" ).arg( error.message() ) ); +diff --git a/server/src/storage/itemretrievaljob.h b/server/src/storage/itemretrievaljob.h +index baafbf0..c7f1e5e 100644 +--- a/server/src/storage/itemretrievaljob.h ++++ b/server/src/storage/itemretrievaljob.h +@@ -31,7 +31,7 @@ class ItemRetrievalJob : public QObject + { + Q_OBJECT + public: +- ItemRetrievalJob( ItemRetrievalRequest *req, QObject *parent ) : QObject( parent ), m_request( req ), m_active( false ) {} ++ ItemRetrievalJob( ItemRetrievalRequest *req, QObject *parent ) : QObject( parent ), m_request( req ), m_active( false ), m_interface( 0 ), m_oldMethodCalled( false ) {} + ~ItemRetrievalJob(); + void start( QDBusAbstractInterface* interface ); + void kill(); +@@ -41,11 +41,14 @@ class ItemRetrievalJob : public QObject + + private Q_SLOTS: + void callFinished( bool returnValue ); ++ void callFinished( const QString& errorMsg ); + void callFailed( const QDBusError &error ); + + private: + ItemRetrievalRequest *m_request; + bool m_active; ++ QDBusAbstractInterface *m_interface; ++ bool m_oldMethodCalled; + }; + + #endif +-- +1.7.12.1 + diff --git a/akonadi.spec b/akonadi.spec index b5d166b..1a096e9 100644 --- a/akonadi.spec +++ b/akonadi.spec @@ -5,7 +5,7 @@ Summary: PIM Storage Service Name: akonadi Version: 1.8.0 -Release: 2%{?dist} +Release: 3%{?dist} License: LGPLv2+ URL: http://community.kde.org/KDE_PIM/Akonadi @@ -22,6 +22,8 @@ Source0: http://download.kde.org/stable/akonadi/src/akonadi-%{version}.tar.bz2 Source10: akonadiserverrc.mysql ## upstream patches +Patch101: 0001-Fix-losing-the-body-for-some-operations-when-the-res.patch +Patch102: 0002-Call-a-newer-version-of-requestItemDelivery-to-get-t.patch %define mysql_conf_timestamp 20110629 @@ -76,6 +78,9 @@ See also: %{_sysconfdir}/akonadi/mysql-global.conf %prep %setup -q -n akonadi-%{version} +%patch101 -p1 -b .0001 +%patch102 -p1 -b .0002 + %build mkdir -p %{_target_platform} @@ -191,6 +196,9 @@ fi %changelog +* Sat Oct 13 2012 Rex Dieter 1.8.0-3 +- include a couple upstream patches + * Mon Jul 30 2012 Rex Dieter 1.8.0-2 - rebuild (boost)