Hello community,
here is the log from the commit of package akonadi-runtime for openSUSE:Factory checked in at 2014-04-08 22:36:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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 2014-03-30 07:54:02.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.akonadi-runtime.new/akonadi-runtime.changes 2014-04-08 22:36:54.000000000 +0200
@@ -1,0 +2,7 @@
+Tue Apr 8 16:44:42 UTC 2014 - tittiatcoke@gmail.com
+
+- Update to 1.12.1
+ * Bugfix releases. Resolves performance issues with the baloo
+ indexer and prevents dataloss when copying large email collections
+
+-------------------------------------------------------------------
Old:
----
akonadi-1.12.0.tar.bz2
New:
----
akonadi-1.12.1.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ akonadi-runtime.spec ++++++
--- /var/tmp/diff_new_pack.Loskmr/_old 2014-04-08 22:36:55.000000000 +0200
+++ /var/tmp/diff_new_pack.Loskmr/_new 2014-04-08 22:36:55.000000000 +0200
@@ -17,9 +17,8 @@
Name: akonadi-runtime
-Version: 1.12.0
+Version: 1.12.1
Release: 0
-%define rversion %{version}
%define rname akonadi
Summary: PIM Storage Service
License: LGPL-2.1+
@@ -68,7 +67,7 @@
service.
%prep
-%setup -q -n %{rname}-%{rversion}
+%setup -q -n %{rname}-%{version}
%build
%cmake_kde4 -d build -- -DCONFIG_INSTALL_DIR=/etc -DINSTALL_QSQLITE_IN_QT_PREFIX=TRUE -DWITH_SOPRANO=FALSE
++++++ akonadi-1.12.0.tar.bz2 -> akonadi-1.12.1.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/CMakeLists.txt new/akonadi-1.12.1/CMakeLists.txt
--- old/akonadi-1.12.0/CMakeLists.txt 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/CMakeLists.txt 2014-04-07 23:02:16.000000000 +0200
@@ -50,7 +50,7 @@
set(AKONADI_VERSION_MAJOR "1")
set(AKONADI_VERSION_MINOR "12")
-set(AKONADI_VERSION_PATCH "0")
+set(AKONADI_VERSION_PATCH "1")
set(AKONADI_VERSION "${AKONADI_VERSION_MAJOR}.${AKONADI_VERSION_MINOR}.${AKONADI_VERSION_PATCH}")
set(AKONADI_VERSION_STRING "${AKONADI_VERSION}")
@@ -125,15 +125,6 @@
include(${QT_USE_FILE})
endif()
-# Missing in FindQt4.cmake until Dec 2011: setting QT_NO_DEBUG_OUTPUT
-if(CMAKE_BUILD_TYPE)
- string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_TOLOWER)
-endif()
-
-if(NOT CMAKE_BUILD_TYPE_TOLOWER MATCHES "debug")
- add_definitions(-DQT_NO_DEBUG_OUTPUT)
-endif()
-
if(STATIC_LIBRARY)
set(LIBRARY_TYPE STATIC)
set(AKONADI_STATIC_LIBS ON)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/NEWS new/akonadi-1.12.1/NEWS
--- old/akonadi-1.12.0/NEWS 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/NEWS 2014-04-07 23:02:16.000000000 +0200
@@ -1,3 +1,12 @@
+1.12.1 07-April-2014
+----------------------------------------------
+- Fixed deadlock in SearchManager
+- Fixed notification emission when appending items
+- Fixed ItemRetriever ignoring changeSince argument
+- Fixed X-AKAPPEND command response
+- Fixed RID-based FETCH
+- Fixed data loss in case of long-lasting copy or move operations
+
1.12.0 25-March-2014
----------------------------------------------
- Improved 'akonadictl status' command output
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/cachecleaner.cpp new/akonadi-1.12.1/server/src/cachecleaner.cpp
--- old/akonadi-1.12.0/server/src/cachecleaner.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/cachecleaner.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -28,6 +28,55 @@
using namespace Akonadi::Server;
CacheCleaner *CacheCleaner::sInstance = 0;
+QMutex CacheCleanerInhibitor::sLock;
+int CacheCleanerInhibitor::sInhibitCount = 0;
+
+CacheCleanerInhibitor::CacheCleanerInhibitor( bool doInhibit )
+ : mInhibited( false )
+{
+ if ( doInhibit ) {
+ inhibit();
+ }
+}
+
+CacheCleanerInhibitor::~CacheCleanerInhibitor()
+{
+ if ( mInhibited ) {
+ uninhibit();
+ }
+}
+
+void CacheCleanerInhibitor::inhibit()
+{
+ if ( mInhibited ) {
+ akError() << "Cannot recursively inhibit an inhibitor";
+ return;
+ }
+
+ sLock.lock();
+ if ( ++sInhibitCount == 1 ) {
+ CacheCleaner::self()->inhibit( true );
+ }
+ sLock.unlock();
+ mInhibited = true;
+}
+
+void CacheCleanerInhibitor::uninhibit()
+{
+ if ( !mInhibited ) {
+ akError() << "Cannot uninhibit an uninhibited inhibitor"; // aaaw yeah
+ return;
+ }
+ mInhibited = false;
+
+ sLock.lock();
+ Q_ASSERT( sInhibitCount > 0 );
+ if ( --sInhibitCount == 0 ) {
+ CacheCleaner::self()->inhibit( false );
+ }
+ sLock.unlock();
+}
+
CacheCleaner::CacheCleaner( QObject *parent )
: CollectionScheduler( parent )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/cachecleaner.h new/akonadi-1.12.1/server/src/cachecleaner.h
--- old/akonadi-1.12.0/server/src/cachecleaner.h 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/cachecleaner.h 2014-04-07 23:02:16.000000000 +0200
@@ -22,12 +22,39 @@
#include "collectionscheduler.h"
+#include <QMutex>
+
namespace Akonadi {
namespace Server {
class Collection;
/**
+ * A RAII helper class to temporarily stop the CacheCleaner. This allows long-lasting
+ * operations to safely retrieve all data from resource and perform an operation on them
+ * (like move or copy) without risking that the cache will be cleaned in the meanwhile
+ *
+ * The inhibitor is recursive, so it's possible to create multiple instances of the
+ * CacheCleanerInhibitor and the CacheCleaner will be inhibited until all instances
+ * are destroyed again. However it's not possible to inhibit a single inhibitor
+ * multiple times.
+ */
+class CacheCleanerInhibitor
+{
+ public:
+ CacheCleanerInhibitor( bool inhibit = true );
+ ~CacheCleanerInhibitor();
+
+ void inhibit();
+ void uninhibit();
+
+ private:
+ static QMutex sLock;
+ static int sInhibitCount;
+ bool mInhibited;
+};
+
+/**
Cache cleaner thread.
*/
class CacheCleaner : public CollectionScheduler
@@ -52,6 +79,9 @@
private:
static CacheCleaner *sInstance;
+
+ friend class CacheCleanerInhibitor;
+
};
} // namespace Server
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/collectionscheduler.cpp new/akonadi-1.12.1/server/src/collectionscheduler.cpp
--- old/akonadi-1.12.0/server/src/collectionscheduler.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/collectionscheduler.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -20,10 +20,86 @@
#include "collectionscheduler.h"
#include "storage/datastore.h"
+#include "akdebug.h"
#include <QDateTime>
#include <QCoreApplication>
+namespace Akonadi {
+namespace Server {
+
+/**
+ * @warning: QTimer's methods are not virtual, so it's necessary to always call
+ * methods on pointer to PauseableTimer!
+ */
+class PauseableTimer : public QTimer
+{
+ public:
+ PauseableTimer( QObject *parent = 0 )
+ : QTimer( parent )
+ {
+ }
+
+ void start( int interval )
+ {
+ mStarted = QDateTime::currentDateTime();
+ mPaused = QDateTime();
+ QTimer::start( interval );
+ }
+
+ void start()
+ {
+ start( interval() );
+ }
+
+ void stop()
+ {
+ mStarted = QDateTime();
+ mPaused = QDateTime();
+ QTimer::stop();
+ }
+
+ void pause()
+ {
+ if ( !isActive() ) {
+ akError() << "Cannot pause an inactive timer";
+ return;
+ }
+ if ( isPaused() ) {
+ akError() << "Cannot pause an already paused timer";
+ return;
+ }
+
+ mPaused = QDateTime::currentDateTime();
+ stop();
+ }
+
+ void resume()
+ {
+ if ( !isPaused() ) {
+ akError() << "Cannot resume a timer that is not paused.";
+ return;
+ }
+
+ start( interval() - ( mStarted.secsTo( mPaused ) * 1000 ) );
+ mPaused = QDateTime();
+ // Update mStarted so that pause() can be called repeatedly
+ mStarted = QDateTime::currentDateTime();
+ }
+
+ bool isPaused() const
+ {
+ return !mPaused.isNull();
+ }
+
+ private:
+ QDateTime mStarted;
+ QDateTime mPaused;
+};
+
+} // namespace Server
+} // namespace Akonadi
+
using namespace Akonadi::Server;
CollectionScheduler::CollectionScheduler( QObject *parent )
@@ -33,7 +109,7 @@
// make sure we are created from the main thread, ie. before all other threads start to potentially use us
Q_ASSERT( QThread::currentThread() == QCoreApplication::instance()->thread() );
- mScheduler = new QTimer( this );
+ mScheduler = new PauseableTimer( this );
mScheduler->setSingleShot( true );
connect( mScheduler, SIGNAL(timeout()),
this, SLOT(schedulerTimeout()) );
@@ -53,6 +129,15 @@
DataStore::self()->close();
}
+void CollectionScheduler::inhibit( bool inhibit )
+{
+ if ( inhibit && mScheduler->isActive() && !mScheduler->isPaused() ) {
+ mScheduler->pause();
+ } else if ( !inhibit && mScheduler->isPaused() ) {
+ mScheduler->resume();
+ }
+}
+
int CollectionScheduler::minimumInterval() const
{
return mMinInterval;
@@ -123,6 +208,11 @@
void CollectionScheduler::startScheduler()
{
+ // Don't restart timer if we are paused.
+ if ( mScheduler->isPaused() ) {
+ return;
+ }
+
QMutexLocker locker( &mScheduleLock );
if ( mSchedule.isEmpty() ) {
// Stop the timer. It will be started again once some collection is scheduled
@@ -188,6 +278,9 @@
void CollectionScheduler::schedulerTimeout()
{
+ // Call stop() explicitly to reset the timer
+ mScheduler->stop();
+
mScheduleLock.lock();
const uint timestamp = mSchedule.constBegin().key();
const QList<Collection> collections = mSchedule.values( timestamp );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/collectionscheduler.h new/akonadi-1.12.1/server/src/collectionscheduler.h
--- old/akonadi-1.12.0/server/src/collectionscheduler.h 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/collectionscheduler.h 2014-04-07 23:02:16.000000000 +0200
@@ -32,6 +32,7 @@
namespace Server {
class Collection;
+class PauseableTimer;
class CollectionScheduler: public QThread
{
@@ -66,6 +67,8 @@
virtual int collectionScheduleInterval( const Collection &collection ) = 0;
virtual void collectionExpired( const Collection &collection ) = 0;
+ void inhibit( bool inhibit = true );
+
protected Q_SLOTS:
void initScheduler();
void schedulerTimeout();
@@ -75,7 +78,7 @@
protected:
QMutex mScheduleLock;
QMultiMap mSchedule;
- QTimer *mScheduler;
+ PauseableTimer *mScheduler;
int mMinInterval;
};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/handler/akappend.cpp new/akonadi-1.12.1/server/src/handler/akappend.cpp
--- old/akonadi-1.12.0/server/src/handler/akappend.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/handler/akappend.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -220,11 +220,13 @@
// parse optional date/time string
QDateTime dateTime;
if ( m_streamParser->hasDateTime() ) {
- dateTime = m_streamParser->readDateTime();
+ dateTime = m_streamParser->readDateTime().toUTC();
// FIXME Should we return an error if m_dateTime is invalid?
+ } else {
+ // if date/time is not given then it will be set to the current date/time
+ // converted to UTC.
+ dateTime = QDateTime::currentDateTime().toUTC();
}
- // if date/time is not given then it will be set to the current date/time
- // by the database
// FIXME: The streaming/reading of all item parts can hold the transaction for
// unnecessary long time -> should we wrap the PimItem into one transaction
@@ -247,7 +249,7 @@
const Collection col = HandlerHelper::collectionFromIdOrName( mailbox );
const Flag::List flagList = HandlerHelper::resolveFlags( itemFlags );
bool flagsChanged = false;
- if ( !db->appendItemsFlags( PimItem::List() << item, flagList, flagsChanged, false, col ) ) {
+ if ( !db->appendItemsFlags( PimItem::List() << item, flagList, flagsChanged, false, col, true ) ) {
return failureResponse( "Unable to append item flags." );
}
@@ -303,11 +305,14 @@
PreprocessorManager::instance()->beginHandleItem( item, db );
}
+ // Date time is always stored in UTC time zone by the server.
+ const QString datetime = QLocale::c().toString( item.datetime(), QLatin1String( "dd-MMM-yyyy hh:mm:ss +0000" ) );
+
// ...aaaaaand done.
Response response;
response.setTag( tag() );
response.setUserDefined();
- response.setString( "[UIDNEXT " + QByteArray::number( item.id() ) + ']' );
+ response.setString( "[UIDNEXT " + QByteArray::number( item.id() ) + " DATETIME " + ImapParser::quote( datetime.toUtf8() ) + ']' );
Q_EMIT responseAvailable( response );
response.setSuccess();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/handler/colcopy.cpp new/akonadi-1.12.1/server/src/handler/colcopy.cpp
--- old/akonadi-1.12.0/server/src/handler/colcopy.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/handler/colcopy.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -21,6 +21,7 @@
#include "connection.h"
#include "handlerhelper.h"
+#include "cachecleaner.h"
#include "storage/datastore.h"
#include "storage/transaction.h"
#include "storage/itemretriever.h"
@@ -98,6 +99,8 @@
return failureResponse( "No valid target specified" );
}
+ CacheCleanerInhibitor inhibitor;
+
// retrieve all not yet cached items of the source
ItemRetriever retriever( connection() );
retriever.setCollection( source, true );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/handler/colmove.cpp new/akonadi-1.12.1/server/src/handler/colmove.cpp
--- old/akonadi-1.12.0/server/src/handler/colmove.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/handler/colmove.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -26,6 +26,7 @@
#include
#include
#include
+#include
#include
using namespace Akonadi;
@@ -61,6 +62,8 @@
return successResponse( "COLMOVE complete - nothing to do" );
}
+ CacheCleanerInhibitor inhibitor;
+
// retrieve all not yet cached items of the source
ItemRetriever retriever( connection() );
retriever.setCollection( source, true );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/handler/copy.cpp new/akonadi-1.12.1/server/src/handler/copy.cpp
--- old/akonadi-1.12.0/server/src/handler/copy.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/handler/copy.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -21,6 +21,7 @@
#include "connection.h"
#include "handlerhelper.h"
+#include "cachecleaner.h"
#include "storage/datastore.h"
#include "storage/itemqueryhelper.h"
@@ -74,6 +75,8 @@
return failureResponse( "No items specified" );
}
+ CacheCleanerInhibitor inhibitor;
+
ItemRetriever retriever( connection() );
retriever.setItemSet( set );
retriever.setRetrieveFullPayload( true );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/handler/fetch.cpp new/akonadi-1.12.1/server/src/handler/fetch.cpp
--- old/akonadi-1.12.0/server/src/handler/fetch.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/handler/fetch.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -23,6 +23,7 @@
#include "connection.h"
#include "fetchhelper.h"
#include "response.h"
+#include "cachecleaner.h"
#include
@@ -39,6 +40,8 @@
// sequence set
mScope.parseScope( m_streamParser );
+ CacheCleanerInhibitor inhibitor;
+
FetchHelper fetchHelper( connection(), mScope, FetchScope( m_streamParser ) );
connect( &fetchHelper, SIGNAL(responseAvailable(Akonadi::Server::Response)),
this, SIGNAL(responseAvailable(Akonadi::Server::Response)) );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/handler/fetchhelper.cpp new/akonadi-1.12.1/server/src/handler/fetchhelper.cpp
--- old/akonadi-1.12.0/server/src/handler/fetchhelper.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/handler/fetchhelper.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -284,6 +284,7 @@
retriever.setScope( mScope );
retriever.setRetrieveParts( mFetchScope.requestedPayloads() );
retriever.setRetrieveFullPayload( mFetchScope.fullPayload() );
+ retriever.setChangedSince( mFetchScope.changedSince() );
if ( !retriever.exec() && !mFetchScope.ignoreErrors() ) { // There we go, retrieve the missing parts from the resource.
if ( mConnection->resourceContext().isValid() ) {
throw HandlerException( QString::fromLatin1( "Unable to fetch item from backend (collection %1, resource %2) : %3" )
@@ -303,6 +304,9 @@
// error if query did not find any item and scope is not listing items but
// a request for a specific item
if ( !itemQuery.isValid() ) {
+ if ( mFetchScope.ignoreErrors() ) {
+ return true;
+ }
switch ( mScope.scope() ) {
case Scope::Uid: // fall through
case Scope::Rid: // fall through
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/handler/modify.cpp new/akonadi-1.12.1/server/src/handler/modify.cpp
--- old/akonadi-1.12.0/server/src/handler/modify.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/handler/modify.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -33,6 +33,7 @@
#include
#include
#include
+#include
using namespace Akonadi;
using namespace Akonadi::Server;
@@ -63,6 +64,8 @@
QByteArray line = m_streamParser->readUntilCommandEnd();
m_streamParser->insertData( "\n" );
+ CacheCleanerInhibitor inhibitor( false );
+
int p = 0;
if ( ( p = line.indexOf( AKONADI_PARAM_PARENT ) ) > 0 ) {
QByteArray tmp;
@@ -70,6 +73,7 @@
const Collection newParent = HandlerHelper::collectionFromIdOrName( tmp );
if ( newParent.isValid() && collection.parentId() != newParent.id()
&& collection.resourceId() != newParent.resourceId() ) {
+ inhibitor.inhibit();
ItemRetriever retriever( connection() );
retriever.setCollection( collection, true );
retriever.setRetrieveFullPayload( true );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/handler/move.cpp new/akonadi-1.12.1/server/src/handler/move.cpp
--- old/akonadi-1.12.0/server/src/handler/move.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/handler/move.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -23,6 +23,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -46,6 +47,8 @@
const Collection destination = CollectionQueryHelper::singleCollectionFromScope( destScope, connection() );
const Resource destResource = destination.resource();
+ CacheCleanerInhibitor inhibitor;
+
// make sure all the items we want to move are in the cache
ItemRetriever retriever( connection() );
retriever.setScope( mScope );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/handler/searchpersistent.cpp new/akonadi-1.12.1/server/src/handler/searchpersistent.cpp
--- old/akonadi-1.12.0/server/src/handler/searchpersistent.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/handler/searchpersistent.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -112,7 +112,7 @@
return failureResponse( "Unable to commit transaction" );
}
- SearchManager::instance()->updateSearchAsync( col );
+ SearchManager::instance()->updateSearch( col );
const QByteArray b = HandlerHelper::collectionToByteArray( col );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/search/searchmanager.cpp new/akonadi-1.12.1/server/src/search/searchmanager.cpp
--- old/akonadi-1.12.0/server/src/search/searchmanager.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/search/searchmanager.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -202,8 +202,10 @@
void SearchManager::scheduleSearchUpdate()
{
- // Reset if the timer is active
- mSearchUpdateTimer->start();
+ // Reset if the timer is active (use QueuedConnection to invoke start() from
+ // the thread the QTimer lives in instead of caller's thread, otherwise crashes
+ // and weird things can happen.
+ QMetaObject::invokeMethod( mSearchUpdateTimer, "start", Qt::QueuedConnection );
}
void SearchManager::searchUpdateTimeout()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/search/searchtaskmanager.cpp new/akonadi-1.12.1/server/src/search/searchtaskmanager.cpp
--- old/akonadi-1.12.0/server/src/search/searchtaskmanager.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/search/searchtaskmanager.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -214,7 +214,7 @@
Q_FOREVER {
akDebug() << "Search loop is waiting, will wake again in" << timeout << "ms";
- mWait.wait( &mLock, timeout ); // wait for a minute
+ mWait.wait( &mLock, timeout );
if ( mShouldStop ) {
Q_FOREACH (SearchTask *task, mTasklist ) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/storage/datastore.cpp new/akonadi-1.12.1/server/src/storage/datastore.cpp
--- old/akonadi-1.12.0/server/src/storage/datastore.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/storage/datastore.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -244,7 +244,8 @@
}
bool DataStore::doAppendItemsFlag( const PimItem::List &items, const Flag &flag,
- const QSetEntity::Id &existing, const Collection &col )
+ const QSetEntity::Id &existing, const Collection &col,
+ bool silent )
{
QVariantList flagIds;
QVariantList appendIds;
@@ -272,15 +273,17 @@
return false;
}
- mNotificationCollector->itemsFlagsChanged( appendItems, QSet<QByteArray>() << flag.name().toLatin1(),
- QSet<QByteArray>(), col );
+ if ( !silent ) {
+ 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 )
+ const Collection &col, bool silent )
{
QSet<QByteArray> added;
@@ -317,7 +320,7 @@
}
}
- if ( !doAppendItemsFlag( items, flag, existing, col ) ) {
+ if ( !doAppendItemsFlag( items, flag, existing, col, silent ) ) {
return false;
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/storage/datastore.h new/akonadi-1.12.1/server/src/storage/datastore.h
--- old/akonadi-1.12.0/server/src/storage/datastore.h 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/storage/datastore.h 2014-04-07 23:02:16.000000000 +0200
@@ -120,7 +120,7 @@
/* --- ItemFlags ----------------------------------------------------- */
bool setItemsFlags( const PimItem::List &items, const QVector<Flag> &flags );
bool appendItemsFlags( const PimItem::List &items, const QVector<Flag> &flags, bool &flagsChanged,
- bool checkIfExists = true, const Collection &col = Collection() );
+ bool checkIfExists = true, const Collection &col = Collection(), bool silent = false );
bool removeItemsFlags( const PimItem::List &items, const QVector<Flag> &flags );
/* --- ItemTags ----------------------------------------------------- */
@@ -272,7 +272,8 @@
private:
bool doAppendItemsFlag( const PimItem::List &items, const Flag &flag,
- const QSetPimItem::Id &existing, const Collection &col );
+ const QSetPimItem::Id &existing, const Collection &col,
+ bool silent );
bool doAppendItemsTag( const PimItem::List &items, const Tag &tag,
const QSetEntity::Id &existing, const Collection &col );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/storage/itemqueryhelper.cpp new/akonadi-1.12.1/server/src/storage/itemqueryhelper.cpp
--- old/akonadi-1.12.0/server/src/storage/itemqueryhelper.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/storage/itemqueryhelper.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -65,7 +65,8 @@
qb.addJoin( QueryBuilder::InnerJoin, Collection::tableName(),
PimItem::collectionIdFullColumnName(), Collection::idFullColumnName() );
qb.addValueCondition( Collection::resourceIdFullColumnName(), Query::Equals, connection->resourceContext().id() );
- } else if ( connection->selectedCollectionId() > 0 ) {
+ }
+ if ( connection->selectedCollectionId() > 0 ) {
qb.addValueCondition( PimItem::collectionIdFullColumnName(), Query::Equals, connection->selectedCollectionId() );
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/storage/itemretriever.cpp new/akonadi-1.12.1/server/src/storage/itemretriever.cpp
--- old/akonadi-1.12.0/server/src/storage/itemretriever.cpp 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/storage/itemretriever.cpp 2014-04-07 23:02:16.000000000 +0200
@@ -115,6 +115,11 @@
return mScope;
}
+void ItemRetriever::setChangedSince( const QDateTime &changedSince )
+{
+ mChangedSince = changedSince;
+}
+
QStringList ItemRetriever::retrieveParts() const
{
return mParts;
@@ -171,6 +176,11 @@
QString::fromLatin1( mConnection->sessionId() ) );
}
+ if ( mChangedSince.isValid() ) {
+ qb.addValueCondition( PimItem::datetimeFullColumnName(), Query::GreaterOrEqual,
+ mChangedSince.toUTC() );
+ }
+
qb.addSortColumn( PimItem::idFullColumnName(), Query::Ascending );
if ( !qb.exec() ) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/akonadi-1.12.0/server/src/storage/itemretriever.h new/akonadi-1.12.1/server/src/storage/itemretriever.h
--- old/akonadi-1.12.0/server/src/storage/itemretriever.h 2014-03-25 14:32:48.000000000 +0100
+++ new/akonadi-1.12.1/server/src/storage/itemretriever.h 2014-04-07 23:02:16.000000000 +0200
@@ -54,6 +54,7 @@
void setRetrieveParts( const QStringList &parts );
QStringList retrieveParts() const;
void setRetrieveFullPayload( bool fullPayload );
+ void setChangedSince( const QDateTime &changedSince );
void setItemSet( const ImapSet &set, const Collection &collection = Collection() );
void setItemSet( const ImapSet &set, bool isUid );
void setItem( const Entity::Id &id );
@@ -84,6 +85,7 @@
QStringList mParts;
bool mFullPayload;
bool mRecursive;
+ QDateTime mChangedSince;
mutable QByteArray mLastError;
};
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org