[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [akonadi/parttable-optimization] server/src: Merge branch 'master' into parttable-optimization
From:       Dan_Vrátil <dvratil () redhat ! com>
Date:       2013-09-03 9:23:37
Message-ID: E1VGmpl-0008Hs-Jw () scm ! kde ! org
[Download RAW message or body]

Git commit 9f90b183c92f888e4a1a3321e8c0a6f932ccc52e by Dan Vrátil.
Committed on 03/09/2013 at 09:21.
Pushed by dvratil into branch 'parttable-optimization'.

Merge branch 'master' into parttable-optimization

Conflicts:
	server/src/cachecleaner.cpp
	server/src/handler/store.cpp
	server/src/storage/datastore.cpp
	server/src/storage/dbinitializer.cpp
	server/src/storage/itemretriever.cpp
	server/src/storage/schematypes.cpp

M  +49   -38   server/src/akonadi.cpp
M  +2    -3    server/src/akonadi.h
M  +20   -12   server/src/cachecleaner.cpp
M  +69   -59   server/src/handler/store.cpp
M  +113  -73   server/src/storage/datastore.cpp
M  +49   -32   server/src/storage/dbinitializer.cpp
M  +77   -46   server/src/storage/dbinitializer_p.cpp
M  +21   -14   server/src/storage/dbupdater.cpp
M  +33   -20   server/src/storage/itemretriever.cpp
M  +8    -2    server/src/storage/schematypes.cpp

http://commits.kde.org/akonadi/9f90b183c92f888e4a1a3321e8c0a6f932ccc52e

diff --cc server/src/cachecleaner.cpp
index 03011ea,c30712f..704c09d
--- a/server/src/cachecleaner.cpp
+++ b/server/src/cachecleaner.cpp
@@@ -69,20 -71,26 +72,23 @@@ void CacheCleaner::cleanCache(
      qb.addValueCondition( PimItem::collectionIdFullColumnName(), Query::Equals, collection.id() );
      qb.addValueCondition( PimItem::atimeFullColumnName(), Query::Less, \
                QDateTime::currentDateTime().addSecs( -60 * expireTime ) );
      qb.addValueCondition( Part::dataFullColumnName(), Query::IsNot, QVariant() );
 -    qb.addValueCondition( QString::fromLatin1( "substr( %1, 1, 4 )" ).arg( Part::nameFullColumnName() \
), Query::Equals, QLatin1String( AKONADI_PARAM_PLD ) );  +    qb.addValueCondition( \
                PartType::nsFullColumnName(), Query::Equals, QLatin1String( "PLD" ) );
      qb.addValueCondition( PimItem::dirtyFullColumnName(), Query::Equals, false );
 +
      QStringList localParts;
 -    Q_FOREACH ( const QString &partName, collection.cachePolicyLocalParts().split( QLatin1String( " " ) \
) ) {  +    Q_FOREACH ( QString partName, collection.cachePolicyLocalParts().split( QLatin1String( " " ) \
                ) ) {
-       if ( partName.startsWith( QLatin1String( "PLD:" ) ) )
-         partName = partName.mid(4);
+       if ( partName.startsWith( QLatin1String( AKONADI_PARAM_PLD ) ) ) {
 -        localParts.append( partName );
 -      } else {
 -        localParts.append( QLatin1String( AKONADI_PARAM_PLD ) + partName );
++        partName = partName.mid( 4 );
+       }
 -    }
 -    if ( !collection.cachePolicyLocalParts().isEmpty() ) {
 -      qb.addValueCondition( Part::nameFullColumnName(), Query::NotIn, localParts );
 +      qb.addValueCondition( PartType::nameFullColumnName(), Query::NotEquals, partName );
      }
-     if ( !qb.exec() )
+     if ( !qb.exec() ) {
        continue;
+     }
      const Part::List parts = qb.result();
-     if ( parts.isEmpty() )
+     if ( parts.isEmpty() ) {
        continue;
+     }
      akDebug() << "found" << parts.count() << "item parts to expire in collection" << collection.name();
  
      // clear data field
diff --cc server/src/handler/store.cpp
index 6410f7a,381527b..b87cfe3
--- a/server/src/handler/store.cpp
+++ b/server/src/handler/store.cpp
@@@ -31,12 -31,12 +31,13 @@@
  #include "storage/parthelper.h"
  #include "storage/dbconfig.h"
  #include "storage/itemretriever.h"
 +#include <storage/parttypehelper.h>
  
  #include "libs/imapparser_p.h"
- #include "libs/protocol_p.h"
  #include "imapstreamparser.h"
  
+ #include <libs/protocol_p.h>
+ 
  #include <QtCore/QStringList>
  #include <QLocale>
  #include <QDebug>
@@@ -262,18 -259,18 +260,20 @@@ bool Store::parseStream(
        QByteArray partName;
        ImapParser::splitVersionedKey( command, partName, partVersion );
  
 +      const PartType partType = PartTypeHelper::fromFqName( partName );
 +
        SelectQueryBuilder<Part> qb;
        qb.addValueCondition( Part::pimItemIdColumn(), Query::Equals, item.id() );
 -      qb.addValueCondition( Part::nameColumn(), Query::Equals, QString::fromUtf8( partName ) );
 +      qb.addValueCondition( Part::partTypeIdColumn(), Query::Equals, partType.id() );
-       if ( !qb.exec() )
+       if ( !qb.exec() ) {
          return failureResponse( "Unable to check item part existence" );
+       }
        Part::List result = qb.result();
        Part part;
-       if ( !result.isEmpty() )
+       if ( !result.isEmpty() ) {
          part = result.first();
+       }
 -      part.setName( QString::fromUtf8( partName ) );
 +      part.setPartType( partType );
        part.setVersion( partVersion );
        part.setPimItemId( item.id() );
  
diff --cc server/src/storage/datastore.cpp
index a48e809,2fb5f80..708e2b3
--- a/server/src/storage/datastore.cpp
+++ b/server/src/storage/datastore.cpp
@@@ -155,14 -155,10 +156,15 @@@ bool Akonadi::DataStore::init(
    s_hasForeignKeyConstraints = initializer->hasForeignKeyConstraints();
  
    DbUpdater updater( m_database, QLatin1String( ":dbupdate.xml" ) );
-   if ( !updater.run() )
+   if ( !updater.run() ) {
      return false;
+   }
  
 +  if ( !initializer->updateIndexesAndConstraints() ) {
 +    akError() << initializer->errorMsg();
 +    return false;
 +  }
 +
    // enable caching for some tables
    MimeType::enableCache( true );
    Flag::enableCache( true );
@@@ -356,16 -352,13 +358,16 @@@ bool DataStore::removeItemsFlags( cons
  
  bool DataStore::removeItemParts( const PimItem &item, const QList<QByteArray> &parts )
  {
 -  Part::List existingParts = item.parts();
 +  SelectQueryBuilder<Part> qb;
 +  qb.addJoin( QueryBuilder::InnerJoin, PartType::tableName(), Part::partTypeIdFullColumnName(), \
PartType::idFullColumnName() );  +  qb.addValueCondition( Part::pimItemIdFullColumnName(), Query::Equals, \
item.id() );  +  qb.addCondition( PartTypeHelper::conditionFromFqNames( parts ) );
 +
 +  qb.exec();
 +  Part::List existingParts = qb.result();
    Q_FOREACH ( Part part, existingParts ) {
-     if ( !PartHelper::remove(&part) )
 -    if ( parts.contains( part.name().toLatin1() ) ) {
 -      if ( !PartHelper::remove(&part) ) {
 -        return false;
 -      }
 -    }
++    if ( !PartHelper::remove( &part ) )
 +      return false;
    }
  
    mNotificationCollector->itemChanged( item, parts.toSet() );
@@@ -374,17 -367,17 +376,18 @@@
  
  bool DataStore::invalidateItemCache( const PimItem &item )
  {
 -  // find all expired item parts
 +  // find all payload item parts
    SelectQueryBuilder<Part> qb;
    qb.addJoin( QueryBuilder::InnerJoin, PimItem::tableName(), PimItem::idFullColumnName(), \
Part::pimItemIdFullColumnName() );  +  qb.addJoin( QueryBuilder::InnerJoin, PartType::tableName(), \
Part::partTypeIdFullColumnName(), PartType::idFullColumnName() );  qb.addValueCondition( \
Part::pimItemIdFullColumnName(), Query::Equals, item.id() );  qb.addValueCondition( \
                Part::dataFullColumnName(), Query::IsNot, QVariant() );
 -  qb.addValueCondition( QString::fromLatin1( "substr( %1, 1, 4 )" ).arg( Part::nameFullColumnName() ), \
Query::Equals, QLatin1String( "PLD:" ) );  +  qb.addValueCondition( PartType::nsFullColumnName(), \
Query::Equals, QLatin1String( "PLD" ) );  qb.addValueCondition( PimItem::dirtyFullColumnName(), \
Query::Equals, false );  
-   if ( !qb.exec() )
+   if ( !qb.exec() ) {
      return false;
+   }
  
    const Part::List parts = qb.result();
    // clear data field
@@@ -751,10 -770,7 +780,11 @@@ bool DataStore::unhideAllPimItems(
  
    akDebug() << "DataStore::unhideAllPimItems()";
  
 -  return PartHelper::remove( Part::nameFullColumnName(), QLatin1String( AKONADI_ATTRIBUTE_HIDDEN ) );
 +  try {
 +    return PartHelper::remove( Part::partTypeIdFullColumnName(), PartTypeHelper::fromName( "ATR", \
"HIDDEN" ).id() );  +  } catch ( ... ) {} // we can live with this failing
++
 +  return false;
  }
  
  bool DataStore::cleanupPimItems( const PimItem::List &items )
diff --cc server/src/storage/dbinitializer.cpp
index 9fafc6f,b581fe6..e2456b8
--- a/server/src/storage/dbinitializer.cpp
+++ b/server/src/storage/dbinitializer.cpp
@@@ -121,9 -123,25 +127,10 @@@ bool DbInitializer::checkTable( const T
      // very likely previous columns contain data that needs to be moved to a new column first.
    }
  
 -  // Make sure the foreign key constraints are all there
 -  checkForeignKeys( tableDescription );
 -
 -  // Add indices
 -  Q_FOREACH ( const IndexDescription &indexDescription, tableDescription.indexes ) {
 -    // sqlite3 needs unique index identifiers per db
 -    const QString indexName = QString::fromLatin1( "%1_%2" ).arg( tableDescription.name ).arg( \
                indexDescription.name );
 -    if ( !m_introspector->hasIndex( tableDescription.name, indexName ) ) {
 -      // Get the CREATE INDEX statement for the specific SQL dialect
 -      const QString statement = buildCreateIndexStatement( tableDescription, indexDescription );
 -      akDebug() << "adding index" << statement;
 -      execQuery( statement );
 -    }
 -  }
 -
    // Add initial data if table is empty
-   if ( tableDescription.data.isEmpty() )
+   if ( tableDescription.data.isEmpty() ) {
      return true;
+   }
    if ( m_introspector->isTableEmpty( tableDescription.name ) ) {
      Q_FOREACH ( const DataDescription &dataDescription, tableDescription.data ) {
        // Get the INSERT VALUES statement for the specific SQL dialect
diff --cc server/src/storage/dbinitializer_p.cpp
index ccfb1a2,55afaa9..ff8b176
--- a/server/src/storage/dbinitializer_p.cpp
+++ b/server/src/storage/dbinitializer_p.cpp
@@@ -225,19 -240,29 +240,22 @@@ QString DbInitializerPostgreSql::buildC
  {
    QString column = columnDescription.name + QLatin1Char( ' ' );
  
-   if ( columnDescription.isAutoIncrement )
+   if ( columnDescription.isAutoIncrement ) {
      column += QLatin1String( "SERIAL" );
-   else
+   } else {
      column += sqlType( columnDescription.type, columnDescription.size );
+   }
  
-   if ( columnDescription.isPrimaryKey && tableDescription.primaryKeyColumnCount() == 1 )
+   if ( columnDescription.isPrimaryKey && tableDescription.primaryKeyColumnCount() == 1 ) {
      column += QLatin1String( " PRIMARY KEY" );
-   else if ( columnDescription.isUnique )
+   } else if ( columnDescription.isUnique ) {
      column += QLatin1String( " UNIQUE" );
+   }
  
-   if ( !columnDescription.allowNull && !( columnDescription.isPrimaryKey && \
tableDescription.primaryKeyColumnCount() == 1 ) ) +   if ( !columnDescription.allowNull && !( \
columnDescription.isPrimaryKey && tableDescription.primaryKeyColumnCount() == 1 ) ) {  column += \
QLatin1String( " NOT NULL" ); +   }
  
 -  if ( !columnDescription.refTable.isEmpty() && !columnDescription.refColumn.isEmpty() ) {
 -    column += QString::fromLatin1( " REFERENCES %1Table(%2) " )
 -                                 .arg( columnDescription.refTable )
 -                                 .arg( columnDescription.refColumn )
 -           +  buildReferentialAction( columnDescription.onUpdate, columnDescription.onDelete );
 -  }
 -
    if ( !columnDescription.defaultValue.isEmpty() ) {
      const QString defaultValue = sqlValue( columnDescription.type, columnDescription.defaultValue );
  
@@@ -263,25 -289,8 +282,23 @@@ QString DbInitializerPostgreSql::buildI
                              .arg( QStringList( data.values() ).join( QLatin1String( "," ) ) );
  }
  
 +QString DbInitializerPostgreSql::buildAddForeignKeyConstraintStatement( const TableDescription &table, \
const ColumnDescription &column ) const  +{
 +  // constraints must have name in PostgreSQL
 +  const QString constraintName = table.name + column.name + QLatin1Literal( "_" ) + column.refTable + \
column.refColumn + QLatin1Literal( "_fk" );  +  return QLatin1Literal( "ALTER TABLE " ) + table.name + \
QLatin1Literal( " ADD CONSTRAINT " ) + constraintName + QLatin1Literal( " FOREIGN KEY (" ) + column.name  \
+       + QLatin1Literal( ") REFERENCES " ) + column.refTable + QLatin1Literal( "Table(" ) + \
column.refColumn  +       + QLatin1Literal( ") " ) + buildReferentialAction( column.onUpdate, \
column.onDelete );  +}
 +
 +QString DbInitializerPostgreSql::buildRemoveForeignKeyConstraintStatement(const \
DbIntrospector::ForeignKey& fk, const TableDescription& table) const  +{
 +  return QLatin1Literal( "ALTER TABLE " ) + table.name + QLatin1Literal( " DROP CONSTRAINT " ) + \
fk.name;  +}
 +
 +
  //END PostgreSQL
  
- 
- 
  //BEGIN Virtuoso
  
  DbInitializerVirtuoso::DbInitializerVirtuoso(const QSqlDatabase& database):
diff --cc server/src/storage/dbupdater.cpp
index fbb821f,7de8d18..1b4eaa1
--- a/server/src/storage/dbupdater.cpp
+++ b/server/src/storage/dbupdater.cpp
@@@ -58,16 -47,16 +58,18 @@@ bool DbUpdater::run(
  
    UpdateSet::Map updates;
  
-   if ( !parseUpdateSets( currentVersion.version(), updates ) )
+   if ( !parseUpdateSets( currentVersion.version(), updates ) ) {
      return false;
+   }
  
-   if ( updates.isEmpty() )
+   if ( updates.isEmpty() ) {
      return true;
+   }
    // indicate clients this might take a while
    // we can ignore unregistration in error cases, that'll kill the server anyway
 -  QDBusConnection::sessionBus().registerService( AkDBus::serviceName(AkDBus::UpgradeIndicator) );
 +  if ( !QDBusConnection::sessionBus().registerService( AkDBus::serviceName( AkDBus::UpgradeIndicator ) \
) ) {  +    akFatal() << "Unable to connect to dbus service: " << \
QDBusConnection::sessionBus().lastError().message();  +  }
  
    // QMap is sorted, so we should be replaying the changes in correct order
    for ( QMap<int, UpdateSet>::ConstIterator it = updates.constBegin(); it != updates.constEnd(); ++it ) \
                {
diff --cc server/src/storage/itemretriever.cpp
index 74a9346,0228c6e..1e0c015
--- a/server/src/storage/itemretriever.cpp
+++ b/server/src/storage/itemretriever.cpp
@@@ -142,13 -150,14 +147,14 @@@ QSqlQuery ItemRetriever::buildQuery() c
    qb.addColumn( PimItem::remoteIdFullColumnName() );
    qb.addColumn( MimeType::nameFullColumnName() );
    qb.addColumn( Resource::nameFullColumnName() );
 -  qb.addColumn( Part::nameFullColumnName() );
 +  qb.addColumn( PartType::nameFullColumnName() );
    qb.addColumn( Part::datasizeFullColumnName() );
  
-   if ( mScope.scope() != Scope::Invalid )
+   if ( mScope.scope() != Scope::Invalid ) {
      ItemQueryHelper::scopeToQuery( mScope, mConnection, qb );
-   else
+   } else {
      ItemQueryHelper::itemSetToQuery( mItemSet, qb, mCollection );
+   }
  
    // prevent a resource to trigger item retrieval from itself
    if ( mConnection ) {
@@@ -214,12 -215,14 +220,14 @@@ bool ItemRetriever::exec(
      }
  
      qint64 datasize = query.value( PartDatasizeColumn ).toLongLong();
 -    QString partName = Utils::variantToString( query.value( PartNameColumn ) );
 -    Q_ASSERT( partName.startsWith( QLatin1String( AKONADI_PARAM_PLD ) ) );
 -    partName = partName.mid( 4 );
 +    const QString partName = Utils::variantToString( query.value( PartTypeNameColumn ) );
-     Q_ASSERT( !partName.startsWith( QLatin1String( "PLD:" ) ) );
++    Q_ASSERT( !partName.startsWith( QLatin1String( AKONADI_PARAM_PLD ) ) );
++
      if ( datasize <= 0 ) {
        // request update for this part
-       if ( mFullPayload && !lastRequest->parts.contains( partName ) )
+       if ( mFullPayload && !lastRequest->parts.contains( partName ) ) {
          lastRequest->parts << partName;
+       }
      } else {
        // data available, don't request update
        lastRequest->parts.removeAll( partName );
diff --cc server/src/storage/schematypes.cpp
index 4ebef90,c241037..0d7a900
--- a/server/src/storage/schematypes.cpp
+++ b/server/src/storage/schematypes.cpp
@@@ -24,7 -24,13 +24,14 @@@
  #include <algorithm>
  
  ColumnDescription::ColumnDescription()
-   : size( -1 ), allowNull( true ), isAutoIncrement( false ), isPrimaryKey( false ), isUnique( false ), \
onUpdate( Cascade ), onDelete( Cascade ), noUpdate( false ) +   : size( -1 )
+   , allowNull( true )
+   , isAutoIncrement( false )
+   , isPrimaryKey( false )
+   , isUnique( false )
+   , onUpdate( Cascade )
+   , onDelete( Cascade )
++  , noUpdate( false )
  {
  }
  


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic