Hello community, here is the log from the commit of package akonadi-runtime for openSUSE:Factory checked in at Sat Oct 8 11:40:50 CEST 2011.
-------- --- openSUSE:Factory/akonadi-runtime/akonadi-runtime.changes 2011-09-23 01:51:34.000000000 +0200 +++ akonadi-runtime/akonadi-runtime.changes 2011-10-08 00:30:32.000000000 +0200 @@ -1,0 +2,15 @@ +Fri Oct 7 22:07:50 UTC 2011 - [email protected] + +- Update to 1.6.2 + - Do not update item revision if only the RID or RREV changed. + - Fix usage of wrong ids for part filenames. + - Only set item dirty flag if the payload changed. + - Only drop content mimetype for unsubscribed collections in LIST/LSUB. +- 1.6.1 changes: + - Fix crash on agent launcher exit. + - Fix valgrind-ing agents running in the agent launcher. + - Fix restarting of agents in broken state. + - Fix pipe naming on multi-user Windows systems. + - Raise MySQL timeout. + +------------------------------------------------------------------- calling whatdependson for head-i586 Old: ---- akonadi-1.6.0.tar.bz2 New: ---- akonadi-1.6.2.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ akonadi-runtime.spec ++++++ --- /var/tmp/diff_new_pack.erzFEH/_old 2011-10-08 11:40:31.000000000 +0200 +++ /var/tmp/diff_new_pack.erzFEH/_new 2011-10-08 11:40:31.000000000 +0200 @@ -18,8 +18,8 @@ Name: akonadi-runtime -Version: 1.6.0 -Release: 5 +Version: 1.6.2 +Release: 1 %define rversion %{version} License: LGPLv2.1+ Summary: PIM Storage Service ++++++ akonadi-1.6.0.tar.bz2 -> akonadi-1.6.2.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/CMakeLists.txt new/akonadi-1.6.2/CMakeLists.txt --- old/akonadi-1.6.0/CMakeLists.txt 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/CMakeLists.txt 2011-10-03 12:02:01.000000000 +0200 @@ -10,9 +10,10 @@ include(CTest) include(CTestConfig.cmake) option(AKONADI_BUILD_TESTS "Build the Akonadi unit tests." TRUE) +option(AKONADI_BUILD_QSQLITE "Build the Sqlite backend." TRUE) +option(AKONADI_USE_STRIGI_SEARCH "Build Akonadi with strigi as search engine." FALSE) option(INSTALL_QSQLITE_IN_QT_PREFIX "Install the QSQLite plugin in QT_PLUGIN_DIR" FALSE) option(STATIC_LIBRARY "Build Akonadi as a static library." FALSE) -option(AKONADI_USE_STRIGI_SEARCH "Build Akonadi with strigi as search engine." FALSE) if (NOT DEFINED DATABASE_BACKEND) set(DATABASE_BACKEND "MYSQL" CACHE STRING "The default database backend to use for Akonadi. Can be either MYSQL, POSTGRES or SQLITE") @@ -55,7 +56,7 @@ set(AKONADI_VERSION_MAJOR "1") set(AKONADI_VERSION_MINOR "6") -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}") @@ -88,6 +89,7 @@ set ( _backend ${ARGV0} ) if ( "${_backend}" STREQUAL "SQLITE" ) set(AKONADI_DATABASE_BACKEND QSQLITE3) + set(AKONADI_BUILD_QSQLITE TRUE) else() if ( "${_backend}" STREQUAL "POSTGRES" ) set(AKONADI_DATABASE_BACKEND QPSQL) @@ -184,9 +186,11 @@ set (SQLITE_REQUIRED "FALSE") endif() -set(SQLITE_MIN_VERSION 3.6.23) -find_package(Sqlite) -macro_log_feature(SQLITE_FOUND "Sqlite" "Sqlite database library" "http://www.sqlite.org" ${SQLITE_REQUIRED} "${SQLITE_MIN_VERSION}" "") +if(AKONADI_BUILD_QSQLITE) + set(SQLITE_MIN_VERSION 3.6.23) + find_package(Sqlite) + macro_log_feature(SQLITE_FOUND "Sqlite" "Sqlite database library" "http://www.sqlite.org" ${SQLITE_REQUIRED} "${SQLITE_MIN_VERSION}" "") +endif() ############### Compilers flags ############### diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/Mainpage.dox new/akonadi-1.6.2/Mainpage.dox --- old/akonadi-1.6.0/Mainpage.dox 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/Mainpage.dox 2011-10-03 12:02:01.000000000 +0200 @@ -315,6 +315,6 @@ // DOXYGEN_EXCLUDE = sqlplugin server/control server/akonadictl server/tests // DOXYGEN_PROJECTNAME=Akonadi -// DOXYGEN_PROJECTVERSION=1.6.0 +// DOXYGEN_PROJECTVERSION=1.6.2 // vim:ts=4:sw=4:expandtab:filetype=doxygen diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/NEWS new/akonadi-1.6.2/NEWS --- old/akonadi-1.6.0/NEWS 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/NEWS 2011-10-03 12:02:01.000000000 +0200 @@ -1,3 +1,18 @@ +1.6.2 03-October-2011 +--------------------------------------------- +- Do not update item revision if only the RID or RREV changed. +- Fix usage of wrong ids for part filenames. +- Only set item dirty flag if the payload changed. +- Only drop content mimetype for unsubscribed collections in LIST/LSUB. + +1.6.1 15-September-2011 +--------------------------------------------- +- Fix crash on agent launcher exit. +- Fix valgrind-ing agents running in the agent launcher. +- Fix restarting of agents in broken state. +- Fix pipe naming on multi-user Windows systems. +- Raise MySQL timeout. + 1.6.0 10-July-2011 --------------------------------------------- - Enable external payload storage unconditionally. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/agentserver/agentpluginloader.cpp new/akonadi-1.6.2/agentserver/agentpluginloader.cpp --- old/akonadi-1.6.0/agentserver/agentpluginloader.cpp 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/agentserver/agentpluginloader.cpp 2011-10-03 12:02:01.000000000 +0200 @@ -25,13 +25,8 @@ AgentPluginLoader::~AgentPluginLoader() { - QHash<QString, QPluginLoader*>::iterator it = m_pluginLoaders.begin(); - while ( it != m_pluginLoaders.end() ) { - it.value()->unload(); - ++it; - } - qDeleteAll( m_pluginLoaders ); + m_pluginLoaders.clear(); } QPluginLoader *AgentPluginLoader::load( const QString &pluginName ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/agentserver/agentpluginloader.h new/akonadi-1.6.2/agentserver/agentpluginloader.h --- old/akonadi-1.6.0/agentserver/agentpluginloader.h 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/agentserver/agentpluginloader.h 2011-10-03 12:02:01.000000000 +0200 @@ -26,7 +26,7 @@ { public: /** - Unloads and deletes all instantiated QPluginLoaders. + Deletes all instantiated QPluginLoaders. */ ~AgentPluginLoader(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/server/control/agentprocessinstance.cpp new/akonadi-1.6.2/server/control/agentprocessinstance.cpp --- old/akonadi-1.6.0/server/control/agentprocessinstance.cpp 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/server/control/agentprocessinstance.cpp 2011-10-03 12:02:01.000000000 +0200 @@ -82,7 +82,7 @@ void AgentProcessInstance::restartWhenIdle() { if ( mController->isRunning() ) { - if ( status() == 0 ) { + if ( status() != 1 ) { mController->restartOnceWhenFinished(); quit(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/server/control/agentthreadinstance.cpp new/akonadi-1.6.2/server/control/agentthreadinstance.cpp --- old/akonadi-1.6.0/server/control/agentthreadinstance.cpp 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/server/control/agentthreadinstance.cpp 2011-10-03 12:02:01.000000000 +0200 @@ -68,7 +68,7 @@ void AgentThreadInstance::restartWhenIdle() { - if ( status() == 0 && !identifier().isEmpty() ) { + if ( status() != 1 && !identifier().isEmpty() ) { org::freedesktop::Akonadi::AgentServer agentServer( QLatin1String("org.freedesktop.Akonadi.AgentServer"), QLatin1String("/AgentServer"), QDBusConnection::sessionBus() ); agentServer.stopAgent( identifier() ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/server/control/processcontrol.cpp new/akonadi-1.6.2/server/control/processcontrol.cpp --- old/akonadi-1.6.0/server/control/processcontrol.cpp 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/server/control/processcontrol.cpp 2011-10-03 12:02:01.000000000 +0200 @@ -165,11 +165,20 @@ } } +static bool listContains( const QStringList &list, const QString &pattern ) +{ + foreach ( const QString &s, list ) { + if ( s.contains( pattern ) ) + return true; + } + return false; +} + void ProcessControl::start() { #ifdef Q_OS_UNIX QString agentValgrind = getEnv( "AKONADI_VALGRIND" ); - if ( !agentValgrind.isEmpty() && mApplication.contains( agentValgrind ) ) { + if ( !agentValgrind.isEmpty() && (mApplication.contains( agentValgrind ) || listContains( mArguments, agentValgrind )) ) { mArguments.prepend( mApplication ); const QString originalArguments = mArguments.join( QString::fromLocal8Bit( " " ) ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/server/src/akonadi.cpp new/akonadi-1.6.2/server/src/akonadi.cpp --- old/akonadi-1.6.0/server/src/akonadi.cpp 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/server/src/akonadi.cpp 2011-10-03 12:02:01.000000000 +0200 @@ -54,6 +54,11 @@ #endif #include <stdlib.h> +#ifdef Q_WS_WIN +#include <windows.h> +#include <Sddl.h> +#endif + using namespace Akonadi; static AkonadiServer *s_instance = 0; @@ -88,7 +93,42 @@ QSettings connectionSettings( connectionSettingsFile, QSettings::IniFormat ); #ifdef Q_OS_WIN - QString namedPipe = settings.value( QLatin1String( "Connection/NamedPipe" ), QLatin1String( "Akonadi" ) ).toString(); + HANDLE hToken = NULL; + PSID sid; + QString userID; + + OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &hToken); + if(hToken) + { + DWORD size; + PTOKEN_USER userStruct; + + GetTokenInformation(hToken, TokenUser, NULL, 0, &size); + if( ERROR_INSUFFICIENT_BUFFER == GetLastError() ) + { + userStruct = reinterpret_cast<PTOKEN_USER>( new BYTE[size] ); + GetTokenInformation(hToken, TokenUser, userStruct, size, &size); + + int sidLength = GetLengthSid(userStruct->User.Sid); + sid = (PSID) malloc(sidLength); + CopySid(sidLength, sid, userStruct->User.Sid); + CloseHandle(hToken); + delete [] userStruct; + } + + LPWSTR s; + if (!ConvertSidToStringSidW(sid, &s)) { + akError() << "Could not determine user id for current process."; + userID = QString(); + } else { + userID = QString::fromUtf16(reinterpret_cast<ushort*>(s)); + LocalFree(s); + } + free(sid); + } + QString defaultPipe = QLatin1String( "Akonadi-" ) + userID; + + QString namedPipe = settings.value( QLatin1String( "Connection/NamedPipe" ), defaultPipe ).toString(); #ifdef Q_OS_WINCE if ( !listen( QHostAddress::LocalHost, 31414 ) ) #else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/server/src/handler/list.cpp new/akonadi-1.6.2/server/src/handler/list.cpp --- old/akonadi-1.6.0/server/src/handler/list.cpp 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/server/src/handler/list.cpp 2011-10-03 12:02:01.000000000 +0200 @@ -82,9 +82,11 @@ } } + const bool isUnsubscribed = mOnlySubscribed && !root.subscribed(); + // filter if this node isn't needed by it's children - bool hidden = (mResource.isValid() && root.resourceId() != mResource.id()) - || (mOnlySubscribed && !root.subscribed()) + const bool hidden = (mResource.isValid() && root.resourceId() != mResource.id()) + || isUnsubscribed || (!mMimeTypes.isEmpty() && !intersect( mMimeTypes, root.mimeTypes()) ); if ( !childrenFound && hidden ) @@ -94,7 +96,7 @@ Collection dummy = root; DataStore *db = connection()->storageBackend(); db->activeCachePolicy( dummy ); - const QByteArray b = HandlerHelper::collectionToByteArray( dummy, hidden, mIncludeStatistics, mAncestorDepth, ancestors ); + const QByteArray b = HandlerHelper::collectionToByteArray( dummy, isUnsubscribed, mIncludeStatistics, mAncestorDepth, ancestors ); Response response; response.setUntagged(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/server/src/handler/store.cpp new/akonadi-1.6.2/server/src/handler/store.cpp --- old/akonadi-1.6.0/server/src/handler/store.cpp 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/server/src/handler/store.cpp 2011-10-03 12:02:01.000000000 +0200 @@ -45,6 +45,15 @@ using namespace Akonadi; +static bool payloadChanged( const QSet<QByteArray> &changes ) +{ + foreach ( const QByteArray &change, changes ) { + if ( change.startsWith( "PLD:" ) ) + return true; + } + return false; +} + Store::Store( Scope::SelectionScope scope ) : Handler() , mScope( scope ) @@ -135,12 +144,12 @@ if ( pimItems.at( i ).rev() != (int)mPreviousRevision ) throw HandlerException( "[LLCONFLICT] Item was modified elsewhere, aborting STORE." ); } - pimItems[ i ].setRev( pimItems[ i ].rev() + 1 ); } QSet<QByteArray> changes; qint64 partSizes = 0; bool invalidateCache = false; + bool undirty = false; bool silent = false; // apply modifications @@ -218,6 +227,7 @@ else if ( command == AKONADI_PARAM_UNDIRTY ) { m_streamParser->readString(); // read the 'false' string item.setDirty( false ); + undirty = true; } else if ( command == AKONADI_PARAM_INVALIDATECACHE ) { @@ -334,17 +344,31 @@ } QString datetime; - if ( !changes.isEmpty() ) { + if ( !changes.isEmpty() || invalidateCache || undirty ) { + // update item size if ( pimItems.size() == 1 && (mSize > 0 || partSizes > 0) ) pimItems.first().setSize( qMax( mSize, partSizes ) ); + const bool onlyRemoteIdChanged = (changes.size() == 1 && changes.contains( AKONADI_PARAM_REMOTEID )); + const bool onlyRemoteRevisionChanged = (changes.size() == 1 && changes.contains( AKONADI_PARAM_REMOTEREVISION )); + const bool onlyRemoteIdAndRevisionChanged = (changes.size() == 2 && changes.contains( AKONADI_PARAM_REMOTEID ) + && changes.contains( AKONADI_PARAM_REMOTEREVISION )); + + // If only the remote id and/or the remote revision changed, we don't have to increase the REV, + // because these updates do not change the payload and can only be done by the owning resource -> no conflicts possible + const bool revisionNeedsUpdate = (!changes.isEmpty() && !onlyRemoteIdChanged && !onlyRemoteRevisionChanged && !onlyRemoteIdAndRevisionChanged); + // run update query and prepare change notifications for ( int i = 0; i < pimItems.count(); ++i ) { + + if ( revisionNeedsUpdate ) + pimItems[ i ].setRev( pimItems[ i ].rev() + 1 ); + PimItem &item = pimItems[ i ]; item.setDatetime( modificationtime ); item.setAtime( modificationtime ); - if ( !connection()->isOwnerResource( item ) ) + if ( !connection()->isOwnerResource( item ) && payloadChanged( changes ) ) item.setDirty( true ); if ( !item.update() ) throw HandlerException( "Unable to write item changes into the database" ); @@ -355,7 +379,8 @@ } } - store->notificationCollector()->itemChanged( item, changes ); + if ( !changes.isEmpty() ) + store->notificationCollector()->itemChanged( item, changes ); if ( !silent ) sendPimItemResponse( item ); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/server/src/storage/mysql-global-mobile.conf new/akonadi-1.6.2/server/src/storage/mysql-global-mobile.conf --- old/akonadi-1.6.0/server/src/storage/mysql-global-mobile.conf 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/server/src/storage/mysql-global-mobile.conf 2011-10-03 12:02:01.000000000 +0200 @@ -53,7 +53,7 @@ innodb_flush_log_at_trx_commit=2 # Do not drop the connection to the DB after 8 hours of inactivity -wait_timeout=1296000 +wait_timeout=31536000 [client] default-character-set=utf8 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/server/src/storage/mysql-global.conf new/akonadi-1.6.2/server/src/storage/mysql-global.conf --- old/akonadi-1.6.0/server/src/storage/mysql-global.conf 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/server/src/storage/mysql-global.conf 2011-10-03 12:02:01.000000000 +0200 @@ -53,7 +53,7 @@ innodb_flush_log_at_trx_commit=2 # Do not drop the connection to the DB after 8 hours of inactivity -wait_timeout=1296000 +wait_timeout=31536000 [client] default-character-set=utf8 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/server/src/storage/parthelper.cpp new/akonadi-1.6.2/server/src/storage/parthelper.cpp --- old/akonadi-1.6.0/server/src/storage/parthelper.cpp 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/server/src/storage/parthelper.cpp 2011-10-03 12:02:01.000000000 +0200 @@ -32,6 +32,14 @@ using namespace Akonadi; +static QString fileNameForPart( Part *part ) +{ + Q_ASSERT( part->id() >= 0 ); + const QString dataDir = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/file_db_data" ) ) + QDir::separator(); + Q_ASSERT( dataDir != QDir::separator() ); + return dataDir + QString::number( part->id() ); +} + void PartHelper::update( Part *part, const QByteArray &data, qint64 dataSize ) { if (!part) @@ -47,7 +55,7 @@ if ( storeExternal ) { QString fileName = origFileName; if ( fileName.isEmpty() ) - fileName = fileNameForId( part->pimItemId() ); + fileName = fileNameForPart( part ); QString rev = QString::fromAscii("_r0"); if ( fileName.contains( QString::fromAscii("_r") ) ) { int revIndex = fileName.indexOf(QString::fromAscii("_r")); @@ -110,7 +118,7 @@ if ( storeInFile && result ) { - QString fileName = PartHelper::fileNameForId( part->id() ); + QString fileName = fileNameForPart( part ); fileName += QString::fromUtf8("_r0"); QFile file( fileName ); @@ -193,14 +201,6 @@ return translateData( part.data(), part.external() ); } -QString PartHelper::fileNameForId( qint64 id ) -{ - Q_ASSERT( id >= 0 ); - const QString dataDir = XdgBaseDirs::saveDir( "data", QLatin1String( "akonadi/file_db_data" ) ) + QDir::separator(); - Q_ASSERT( dataDir != QDir::separator() ); - return dataDir + QString::number(id); -} - bool Akonadi::PartHelper::truncate(Part& part) { if ( part.external() ) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.6.0/server/src/storage/parthelper.h new/akonadi-1.6.2/server/src/storage/parthelper.h --- old/akonadi-1.6.0/server/src/storage/parthelper.h 2011-07-10 14:19:34.000000000 +0200 +++ new/akonadi-1.6.2/server/src/storage/parthelper.h 2011-10-03 12:02:01.000000000 +0200 @@ -69,8 +69,6 @@ * This is more efficient than using update since it does not require the data to be loaded. */ bool truncate( Part &part ); - - QString fileNameForId( qint64 id ); } } continue with "q"... Remember to have fun... -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
