From 4c011a8f5d6d9851a45997a9e63d8d3211d9e0d7 Mon Sep 17 00:00:00 2001
From: Andras Mantia <amantia@kde.org>
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