Rex Dieter adf30a
From 1ce732668b2b3e4d735665bd60e1a18f139b1de2 Mon Sep 17 00:00:00 2001
Rex Dieter adf30a
From: =?UTF-8?q?Dan=20Vr=C3=A1til?= <dvratil@redhat.com>
Rex Dieter adf30a
Date: Fri, 5 Dec 2014 18:49:15 +0100
Rex Dieter adf30a
Subject: [PATCH 23/30] Always create a new PartType when it does not exist
Rex Dieter adf30a
Rex Dieter adf30a
Fixes a regression introduced in previous commit that caused Part operations
Rex Dieter adf30a
to fail when specified PartType did not exist in Akonadi storage yet.
Rex Dieter adf30a
---
Rex Dieter adf30a
 server/src/handler/append.cpp         |  4 ++--
Rex Dieter adf30a
 server/src/storage/datastore.cpp      |  2 +-
Rex Dieter adf30a
 server/src/storage/parttypehelper.cpp | 16 +++++++++++++++-
Rex Dieter adf30a
 server/src/storage/parttypehelper.h   |  8 ++++++++
Rex Dieter adf30a
 4 files changed, 26 insertions(+), 4 deletions(-)
Rex Dieter adf30a
Rex Dieter adf30a
diff --git a/server/src/handler/append.cpp b/server/src/handler/append.cpp
Rex Dieter adf30a
index b594e27..15fb9ea 100644
Rex Dieter adf30a
--- a/server/src/handler/append.cpp
Rex Dieter adf30a
+++ b/server/src/handler/append.cpp
Rex Dieter adf30a
@@ -134,7 +134,7 @@ bool Append::commit()
Rex Dieter adf30a
 
Rex Dieter adf30a
     // wrap data into a part
Rex Dieter adf30a
     Part part;
Rex Dieter adf30a
-    part.setPartType( PartType::retrieveByFQName( QLatin1String("PLD"), QLatin1String("RFC822") ) );
Rex Dieter adf30a
+    part.setPartType( PartTypeHelper::fromFqName( QLatin1String("PLD"), QLatin1String("RFC822") ) );
Rex Dieter adf30a
     part.setData( m_data );
Rex Dieter adf30a
     part.setPimItemId( item.id() );
Rex Dieter adf30a
     part.setDatasize( dataSize );
Rex Dieter adf30a
@@ -148,7 +148,7 @@ bool Append::commit()
Rex Dieter adf30a
     //akDebug() << "Append handler: doPreprocessing is" << doPreprocessing;
Rex Dieter adf30a
     if ( doPreprocessing ) {
Rex Dieter adf30a
       Part hiddenAttribute;
Rex Dieter adf30a
-      hiddenAttribute.setPartType( PartType::retrieveByFQName( QLatin1String("ATR"), QLatin1String("HIDDEN") ) );
Rex Dieter adf30a
+      hiddenAttribute.setPartType( PartTypeHelper::fromFqName( QLatin1String("ATR"), QLatin1String("HIDDEN") ) );
Rex Dieter adf30a
       hiddenAttribute.setData( QByteArray() );
Rex Dieter adf30a
       hiddenAttribute.setPimItemId( item.id() );
Rex Dieter adf30a
       hiddenAttribute.setDatasize( 0 );
Rex Dieter adf30a
diff --git a/server/src/storage/datastore.cpp b/server/src/storage/datastore.cpp
Rex Dieter adf30a
index 0983d84..c9fa0c3 100644
Rex Dieter adf30a
--- a/server/src/storage/datastore.cpp
Rex Dieter adf30a
+++ b/server/src/storage/datastore.cpp
Rex Dieter adf30a
@@ -1027,7 +1027,7 @@ bool DataStore::unhideAllPimItems()
Rex Dieter adf30a
 
Rex Dieter adf30a
   try {
Rex Dieter adf30a
     return PartHelper::remove( Part::partTypeIdFullColumnName(),
Rex Dieter adf30a
-                               PartType::retrieveByFQName( QLatin1String("ATR"), QLatin1String("HIDDEN") ).id() );
Rex Dieter adf30a
+                               PartTypeHelper::fromFqName( QLatin1String("ATR"), QLatin1String("HIDDEN") ).id() );
Rex Dieter adf30a
   } catch ( ... ) {} // we can live with this failing
Rex Dieter adf30a
 
Rex Dieter adf30a
   return false;
Rex Dieter adf30a
diff --git a/server/src/storage/parttypehelper.cpp b/server/src/storage/parttypehelper.cpp
Rex Dieter adf30a
index 7654108..bcff9c6 100644
Rex Dieter adf30a
--- a/server/src/storage/parttypehelper.cpp
Rex Dieter adf30a
+++ b/server/src/storage/parttypehelper.cpp
Rex Dieter adf30a
@@ -37,7 +37,8 @@ QPair< QString, QString > PartTypeHelper::parseFqName(const QString& fqName)
Rex Dieter adf30a
 PartType PartTypeHelper::fromFqName(const QString& fqName)
Rex Dieter adf30a
 {
Rex Dieter adf30a
   const QPair<QString, QString> p = parseFqName( fqName );
Rex Dieter adf30a
-  return PartType::retrieveByFQName(p.first, p.second);
Rex Dieter adf30a
+  return fromFqName(p.first, p.second);
Rex Dieter adf30a
+
Rex Dieter adf30a
 }
Rex Dieter adf30a
 
Rex Dieter adf30a
 PartType PartTypeHelper::fromFqName(const QByteArray& fqName)
Rex Dieter adf30a
@@ -45,6 +46,19 @@ PartType PartTypeHelper::fromFqName(const QByteArray& fqName)
Rex Dieter adf30a
   return fromFqName( QLatin1String(fqName) );
Rex Dieter adf30a
 }
Rex Dieter adf30a
 
Rex Dieter adf30a
+PartType PartTypeHelper::fromFqName(const QString& ns, const QString& name)
Rex Dieter adf30a
+{
Rex Dieter adf30a
+  PartType partType = PartType::retrieveByFQName(ns, name);
Rex Dieter adf30a
+  if (!partType.isValid()) {
Rex Dieter adf30a
+      PartType pt(name, ns);
Rex Dieter adf30a
+      if (!pt.insert()) {
Rex Dieter adf30a
+        throw PartTypeException( "Failed to append part type" );
Rex Dieter adf30a
+      }
Rex Dieter adf30a
+      partType = pt;
Rex Dieter adf30a
+  }
Rex Dieter adf30a
+  return partType;
Rex Dieter adf30a
+}
Rex Dieter adf30a
+
Rex Dieter adf30a
 Query::Condition PartTypeHelper::conditionFromFqName(const QString& fqName)
Rex Dieter adf30a
 {
Rex Dieter adf30a
   const QPair<QString, QString> p = parseFqName( fqName );
Rex Dieter adf30a
diff --git a/server/src/storage/parttypehelper.h b/server/src/storage/parttypehelper.h
Rex Dieter adf30a
index 4c4f42f..6d3cf74 100644
Rex Dieter adf30a
--- a/server/src/storage/parttypehelper.h
Rex Dieter adf30a
+++ b/server/src/storage/parttypehelper.h
Rex Dieter adf30a
@@ -48,6 +48,14 @@ namespace PartTypeHelper
Rex Dieter adf30a
   PartType fromFqName( const QByteArray &fqName );
Rex Dieter adf30a
 
Rex Dieter adf30a
   /**
Rex Dieter adf30a
+   * Retrieve (or create) PartType for the given namespace and name
Rex Dieter adf30a
+   * @param ns Namespace
Rex Dieter adf30a
+   * @param name Name
Rex Dieter adf30a
+   * @throws PartTypeException
Rex Dieter adf30a
+   */
Rex Dieter adf30a
+  PartType fromFqName( const QString &ns, const QString &name );
Rex Dieter adf30a
+
Rex Dieter adf30a
+  /**
Rex Dieter adf30a
    * Returns a query condition that matches the given part.
Rex Dieter adf30a
    * @param fqName fully-qualified part type name
Rex Dieter adf30a
    * @throws PartTypeException
Rex Dieter adf30a
-- 
Rex Dieter adf30a
2.1.0
Rex Dieter adf30a