Blob Blame History Raw
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