From 615fc9df81555ce5a2b16747640beba43e109ef4 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 7 Oct 2015 16:26:52 +0200 Subject: Always get the latest revision directly from storage We can just as well read the latest available revision from storage. --- common/entitystorage.cpp | 3 ++- common/entitystorage.h | 9 +++++---- common/facade.h | 18 +++++++++--------- 3 files changed, 16 insertions(+), 14 deletions(-) (limited to 'common') diff --git a/common/entitystorage.cpp b/common/entitystorage.cpp index 60d58ad..c60135e 100644 --- a/common/entitystorage.cpp +++ b/common/entitystorage.cpp @@ -121,8 +121,9 @@ ResultSet EntityStorageBase::loadInitialResultSet(const Akonadi2::Query &query, return resultSet; } -ResultSet EntityStorageBase::getResultSet(const Akonadi2::Query &query, Akonadi2::Storage::Transaction &transaction, qint64 baseRevision, qint64 topRevision) +ResultSet EntityStorageBase::getResultSet(const Akonadi2::Query &query, Akonadi2::Storage::Transaction &transaction, qint64 baseRevision) { + const qint64 topRevision = Akonadi2::Storage::maxRevision(transaction); QSet remainingFilters = query.propertyFilter.keys().toSet(); ResultSet resultSet; const bool initialQuery = (baseRevision == 0); diff --git a/common/entitystorage.h b/common/entitystorage.h index f1d7f84..68b9e46 100644 --- a/common/entitystorage.h +++ b/common/entitystorage.h @@ -54,7 +54,7 @@ protected: * TODO: Resources should be able to customize this for cases where an entity is not the same as a single buffer. */ void readEntity(const Akonadi2::Storage::Transaction &transaction, const QByteArray &key, const std::function &resultCallback); - ResultSet getResultSet(const Akonadi2::Query &query, Akonadi2::Storage::Transaction &transaction, qint64 baseRevision, qint64 topRevision); + ResultSet getResultSet(const Akonadi2::Query &query, Akonadi2::Storage::Transaction &transaction, qint64 baseRevision); protected: QByteArray mResourceInstanceIdentifier; @@ -99,7 +99,7 @@ protected: public: - virtual void read(const Akonadi2::Query &query, const QPair &revisionRange, const QSharedPointer > &resultProvider) + virtual qint64 read(const Akonadi2::Query &query, qint64 baseRevision, const QSharedPointer > &resultProvider) { Akonadi2::Storage storage(Akonadi2::storageLocation(), mResourceInstanceIdentifier); storage.setDefaultErrorHandler([](const Akonadi2::Storage::Error &error) { @@ -108,10 +108,10 @@ public: auto transaction = storage.createTransaction(Akonadi2::Storage::ReadOnly); - Log() << "Querying" << revisionRange.first << revisionRange.second; + Log() << "Querying" << baseRevision; //TODO fallback in case the old revision is no longer available to clear + redo complete initial scan // - auto resultSet = getResultSet(query, transaction, revisionRange.first, revisionRange.second); + auto resultSet = getResultSet(query, transaction, baseRevision); while(resultSet.next([this, resultProvider](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &value, Akonadi2::Operation operation) -> bool { switch (operation) { case Akonadi2::Operation_Creation: @@ -128,6 +128,7 @@ public: } return true; })){}; + return Akonadi2::Storage::maxRevision(transaction); } }; diff --git a/common/facade.h b/common/facade.h index dab1578..5ed3bde 100644 --- a/common/facade.h +++ b/common/facade.h @@ -44,7 +44,7 @@ class QueryRunner : public QObject { Q_OBJECT public: - typedef std::function(qint64 oldRevision, qint64 newRevision)> QueryFunction; + typedef std::function(qint64 oldRevision)> QueryFunction; QueryRunner(const Akonadi2::Query &query) : mLatestRevision(0) {}; /** @@ -53,10 +53,11 @@ public: KAsync::Job run(qint64 newRevision = 0) { //TODO: JOBAPI: that last empty .then should not be necessary + //TODO: remove newRevision if (mLatestRevision == newRevision && mLatestRevision > 0) { return KAsync::null(); } - return queryFunction(mLatestRevision, newRevision).then([this](qint64 revision) { + return queryFunction(mLatestRevision).then([this](qint64 revision) { mLatestRevision = revision + 1; }).then([](){}); } @@ -160,9 +161,9 @@ public: { auto runner = QSharedPointer::create(query); QWeakPointer > weakResultProvider = resultProvider; - runner->setQuery([this, weakResultProvider, query] (qint64 oldRevision, qint64 newRevision) -> KAsync::Job { - return KAsync::start([this, weakResultProvider, query, oldRevision, newRevision](KAsync::Future &future) { - Trace() << "Executing query " << oldRevision << newRevision; + runner->setQuery([this, weakResultProvider, query] (qint64 oldRevision) -> KAsync::Job { + return KAsync::start([this, weakResultProvider, query, oldRevision](KAsync::Future &future) { + Trace() << "Executing query " << oldRevision; auto resultProvider = weakResultProvider.toStrongRef(); if (!resultProvider) { Warning() << "Tried executing query after result provider is already gone"; @@ -170,7 +171,7 @@ public: future.setFinished(); return; } - load(query, resultProvider, oldRevision, newRevision).template then([&future](qint64 queriedRevision) { + load(query, resultProvider, oldRevision).template then([&future](qint64 queriedRevision) { //TODO set revision in result provider? //TODO update all existing results with new revision future.setValue(queriedRevision); @@ -213,11 +214,10 @@ protected: } private: - virtual KAsync::Job load(const Akonadi2::Query &query, const QSharedPointer > &resultProvider, qint64 oldRevision, qint64 newRevision) + virtual KAsync::Job load(const Akonadi2::Query &query, const QSharedPointer > &resultProvider, qint64 oldRevision) { return KAsync::start([=]() -> qint64 { - mStorage->read(query, qMakePair(oldRevision, newRevision), resultProvider); - return newRevision; + return mStorage->read(query, oldRevision, resultProvider); }); } -- cgit v1.2.3