Hello community, here is the log from the commit of package akonadi-runtime for openSUSE:Factory checked in at 2013-07-30 15:55:58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/akonadi-runtime (Old) and /work/SRC/openSUSE:Factory/.akonadi-runtime.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "akonadi-runtime" Changes: -------- --- /work/SRC/openSUSE:Factory/akonadi-runtime/akonadi-runtime.changes 2013-07-22 16:33:15.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.akonadi-runtime.new/akonadi-runtime.changes 2013-07-30 15:55:59.000000000 +0200 @@ -1,0 +2,10 @@ +Thu Jul 25 19:02:36 UTC 2013 - [email protected] + +- Update to 1.10.2 + * Fix PostgreSQL support (once more) + * Changes from version 1.10.1: + * Fix PostgreSQL support + * Optimize appending flags to items + * Introduce CHANGEDSINCE parameter to FETCH command + +------------------------------------------------------------------- Old: ---- akonadi-1.10.0.tar.bz2 New: ---- akonadi-1.10.2.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ akonadi-runtime.spec ++++++ --- /var/tmp/diff_new_pack.cXReY2/_old 2013-07-30 15:56:01.000000000 +0200 +++ /var/tmp/diff_new_pack.cXReY2/_new 2013-07-30 15:56:01.000000000 +0200 @@ -17,7 +17,7 @@ Name: akonadi-runtime -Version: 1.10.0 +Version: 1.10.2 Release: 0 %define rversion %{version} Summary: PIM Storage Service ++++++ akonadi-1.10.0.tar.bz2 -> akonadi-1.10.2.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.10.0/CMakeLists.txt new/akonadi-1.10.2/CMakeLists.txt --- old/akonadi-1.10.0/CMakeLists.txt 2013-07-09 18:56:12.000000000 +0200 +++ new/akonadi-1.10.2/CMakeLists.txt 2013-07-25 14:48:43.000000000 +0200 @@ -73,7 +73,7 @@ set(AKONADI_VERSION_MAJOR "1") set(AKONADI_VERSION_MINOR "10") -set(AKONADI_VERSION_PATCH "0") +set(AKONADI_VERSION_PATCH "2") set(AKONADI_VERSION "${AKONADI_VERSION_MAJOR}.${AKONADI_VERSION_MINOR}.${AKONADI_VERSION_PATCH}") set(AKONADI_VERSION_STRING "${AKONADI_VERSION}") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.10.0/Mainpage.dox new/akonadi-1.10.2/Mainpage.dox --- old/akonadi-1.10.0/Mainpage.dox 2013-07-09 18:56:12.000000000 +0200 +++ new/akonadi-1.10.2/Mainpage.dox 2013-07-25 14:48:43.000000000 +0200 @@ -315,6 +315,6 @@ // DOXYGEN_EXCLUDE = sqlplugin server/control server/akonadictl server/tests // DOXYGEN_PROJECTNAME=Akonadi -// DOXYGEN_PROJECTVERSION=1.10.0 +// DOXYGEN_PROJECTVERSION=1.10.2 // vim:ts=4:sw=4:expandtab:filetype=doxygen diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.10.0/NEWS new/akonadi-1.10.2/NEWS --- old/akonadi-1.10.0/NEWS 2013-07-09 18:56:12.000000000 +0200 +++ new/akonadi-1.10.2/NEWS 2013-07-25 14:48:43.000000000 +0200 @@ -1,3 +1,13 @@ +1.10.2 23-July-2013 +---------------------------------------------- +- Fix PostgreSQL support (once more) + +1.10.1 22-July-2013 +---------------------------------------------- +- Fix PostgreSQL support +- Optimize appending flags to items +- Introduce CHANGEDSINCE parameter to FETCH command + 1.10.0 09-July-2013 ---------------------------------------------- - Memory optimizations diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.10.0/libs/protocol_p.h new/akonadi-1.10.2/libs/protocol_p.h --- old/akonadi-1.10.0/libs/protocol_p.h 2013-07-09 18:56:12.000000000 +0200 +++ new/akonadi-1.10.2/libs/protocol_p.h 2013-07-25 14:48:43.000000000 +0200 @@ -84,6 +84,7 @@ #define AKONADI_PARAM_RESOURCE "RESOURCE" #define AKONADI_PARAM_ANCESTORS "ANCESTORS" #define AKONADI_PARAM_IGNOREERRORS "IGNOREERRORS" +#define AKONADI_PARAM_CHANGEDSINCE "CHANGEDSINCE" #define AKONADI_PARAM_PERSISTENTSEARCH "PERSISTENTSEARCH" #define AKONADI_PARAM_PERSISTENTSEARCH_QUERYLANG "QUERYLANGUAGE" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.10.0/server/src/akonadiconnection.cpp new/akonadi-1.10.2/server/src/akonadiconnection.cpp --- old/akonadi-1.10.0/server/src/akonadiconnection.cpp 2013-07-09 18:56:12.000000000 +0200 +++ new/akonadi-1.10.2/server/src/akonadiconnection.cpp 2013-07-25 14:48:43.000000000 +0200 @@ -113,7 +113,7 @@ Response greeting; greeting.setUntagged(); - greeting.setString("OK Akonadi Almost IMAP Server [PROTOCOL 32]"); + greeting.setString("OK Akonadi Almost IMAP Server [PROTOCOL 33]"); // don't send before the event loop is active, since waitForBytesWritten() can cause interesting reentrancy issues // TODO should be QueueConnection, but unfortunately that doesn't work (yet), since // "this" belongs to the wrong thread, but that requires a slightly larger refactoring diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.10.0/server/src/handler/fetchhelper.cpp new/akonadi-1.10.2/server/src/handler/fetchhelper.cpp --- old/akonadi-1.10.0/server/src/handler/fetchhelper.cpp 2013-07-09 18:56:12.000000000 +0200 +++ new/akonadi-1.10.2/server/src/handler/fetchhelper.cpp 2013-07-25 14:48:43.000000000 +0200 @@ -42,6 +42,7 @@ #include <QtCore/QStringList> #include <QtCore/QUuid> #include <QtCore/QVariant> +#include <QtCore/QDateTime> #include <QtSql/QSqlDatabase> #include <QtSql/QSqlError> #include <QtSql/QSqlQuery> @@ -156,6 +157,10 @@ if ( mScope.scope() != Scope::Invalid ) ItemQueryHelper::scopeToQuery( mScope, mConnection, itemQuery ); + if ( mChangedSince.isValid() ) { + itemQuery.addValueCondition( PimItem::datetimeFullColumnName(), Query::GreaterOrEqual, mChangedSince.toUTC() ); + } + if ( !itemQuery.exec() ) { throw HandlerException("Unable to list items"); } @@ -466,6 +471,12 @@ mAncestorDepth = HandlerHelper::parseDepth( mStreamParser->readString() ); } else if ( buffer == AKONADI_PARAM_IGNOREERRORS ) { mIgnoreErrors = true; + } else if ( buffer == AKONADI_PARAM_CHANGEDSINCE ) { + bool ok = false; + mChangedSince = QDateTime::fromTime_t( mStreamParser->readNumber( &ok ) ); + if ( !ok ) { + throw HandlerException( "Invalid CHANGEDSINCE timestamp" ); + } } else { throw HandlerException( "Invalid command argument" ); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.10.0/server/src/handler/fetchhelper.h new/akonadi-1.10.2/server/src/handler/fetchhelper.h --- old/akonadi-1.10.0/server/src/handler/fetchhelper.h 2013-07-09 18:56:12.000000000 +0200 +++ new/akonadi-1.10.2/server/src/handler/fetchhelper.h 2013-07-25 14:48:43.000000000 +0200 @@ -76,6 +76,7 @@ bool mExternalPayloadSupported; bool mRemoteRevisionRequested; bool mIgnoreErrors; + QDateTime mChangedSince; }; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.10.0/server/src/storage/datastore.cpp new/akonadi-1.10.2/server/src/storage/datastore.cpp --- old/akonadi-1.10.0/server/src/storage/datastore.cpp 2013-07-09 18:56:12.000000000 +0200 +++ new/akonadi-1.10.2/server/src/storage/datastore.cpp 2013-07-25 14:48:43.000000000 +0200 @@ -208,8 +208,9 @@ } QueryBuilder qb2( PimItemFlagRelation::tableName(), QueryBuilder::Insert ); - qb2.setColumnValue( PimItemFlagRelation::leftFullColumnName(), insIds ); - qb2.setColumnValue( PimItemFlagRelation::rightFullColumnName(), insFlags ); + qb2.setColumnValue( PimItemFlagRelation::leftColumn(), insIds ); + qb2.setColumnValue( PimItemFlagRelation::rightColumn(), insFlags ); + qb2.setIdentificationColumn( QString() ); if ( !qb2.exec() ) { return false; } @@ -218,29 +219,82 @@ return true; } +bool DataStore::doAppendItemsFlag( const PimItem::List &items, const Flag &flag, + const QSet<Entity::Id> &existing, const Collection &col) +{ + QVariantList flagIds; + QVariantList appendIds; + PimItem::List appendItems; + Q_FOREACH ( const PimItem &item, items ) { + if ( existing.contains( item.id() ) ) { + continue; + } + + flagIds << flag.id(); + appendIds << item.id(); + appendItems << item; + } + + QueryBuilder qb2( PimItemFlagRelation::tableName(), QueryBuilder::Insert ); + qb2.setColumnValue( PimItemFlagRelation::leftColumn(), appendIds ); + qb2.setColumnValue( PimItemFlagRelation::rightColumn(), flagIds ); + qb2.setIdentificationColumn( QString() ); + if ( !qb2.exec() ) { + akDebug() << "Failed to execute query:" << qb2.query().lastError(); + return false; + } + + mNotificationCollector->itemsFlagsChanged( appendItems, QSet<QByteArray>() << flag.name().toLatin1(), + QSet<QByteArray>(), col ); + + return true; +} + + bool DataStore::appendItemsFlags( const PimItem::List &items, const QVector<Flag> &flags, - bool& flagsChanged, bool checkIfExists, - const Collection &col ) + bool& flagsChanged, bool checkIfExists, + const Collection &col ) { QSet<QByteArray> added; - Q_FOREACH( const PimItem &item, items ) { - flagsChanged = false; - if ( !item.isValid() ) - return false; - if ( flags.isEmpty() ) - return true; - for ( int i = 0; i < flags.count(); ++i ) { - if ( !checkIfExists || !item.relatesToFlag( flags[ i ] ) ) { - flagsChanged = true; - added << flags[ i ].name().toLatin1(); - if ( !item.addFlag( flags[i] ) ) - return false; + QVariantList itemsIds; + Q_FOREACH ( const PimItem &item, items ) { + itemsIds.append( item.id() ); + } + + flagsChanged = false; + Q_FOREACH ( const Flag &flag, flags ) { + QSet<PimItem::Id> existing; + if ( checkIfExists ) { + QueryBuilder qb( PimItemFlagRelation::tableName(), QueryBuilder::Select ); + Query::Condition cond; + cond.addValueCondition( PimItemFlagRelation::rightColumn(), Query::Equals, flag.id() ); + cond.addValueCondition( PimItemFlagRelation::leftColumn(), Query::In, itemsIds ); + qb.addColumn( PimItemFlagRelation::leftColumn() ); + qb.addCondition( cond ); + + if ( !qb.exec() ) { + akDebug() << "Failed to execute query:" << qb.query().lastError(); + return false; + } + + QSqlQuery query = qb.query(); + if ( query.size() == items.count() ) { + continue; } + + flagsChanged = true; + + while ( query.next() ) { + existing << query.value( 0 ).value<PimItem::Id>(); + } + } + + if ( !doAppendItemsFlag( items, flag, existing, col ) ) { + return false; } } - mNotificationCollector->itemsFlagsChanged( items, added, QSet<QByteArray>(), col ); return true; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.10.0/server/src/storage/datastore.h new/akonadi-1.10.2/server/src/storage/datastore.h --- old/akonadi-1.10.0/server/src/storage/datastore.h 2013-07-09 18:56:12.000000000 +0200 +++ new/akonadi-1.10.2/server/src/storage/datastore.h 2013-07-25 14:48:43.000000000 +0200 @@ -262,6 +262,9 @@ void debugLastQueryError( const QSqlQuery &query, const char* actionDescription ) const; private: + bool doAppendItemsFlag( const PimItem::List &items, const Flag &flag, + const QSet<PimItem::Id> &existing, const Collection &col ); + /** Converts the given date/time to the database format, i.e. "YYYY-MM-DD HH:MM:SS". @param dateTime the date/time in UTC -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
