[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