summaryrefslogtreecommitdiffstats
path: root/dummyresource/facade.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dummyresource/facade.cpp')
-rw-r--r--dummyresource/facade.cpp44
1 files changed, 41 insertions, 3 deletions
diff --git a/dummyresource/facade.cpp b/dummyresource/facade.cpp
index 1477fcf..f603c56 100644
--- a/dummyresource/facade.cpp
+++ b/dummyresource/facade.cpp
@@ -147,15 +147,51 @@ void DummyResourceFacade::readValue(QSharedPointer<Akonadi2::Storage> storage, c
147 }); 147 });
148} 148}
149 149
150Async::Job<void> DummyResourceFacade::load(const Akonadi2::Query &query, const std::function<void(const Akonadi2::ApplicationDomain::Event::Ptr &)> &resultCallback) 150Async::Job<void> DummyResourceFacade::load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr> > &resultProvider)
151{ 151{
152 return synchronizeResource(query.syncOnDemand, query.processAll).then<void>([=](Async::Future<void> &future) { 152 auto runner = QSharedPointer<QueryRunner>::create(query);
153 //The runner only lives as long as the resultProvider
154 resultProvider->setQueryRunner(runner);
155 runner->setQuery([this, resultProvider, query](qint64 oldRevision, qint64 newRevision) -> Async::Job<qint64> {
156 return Async::start<qint64>([this, resultProvider, query](Async::Future<qint64> &future) {
157 //TODO only emit changes and don't replace everything
158 resultProvider->clear();
159 //rerun query
160 std::function<void(const Akonadi2::ApplicationDomain::Event::Ptr &)> addCallback = std::bind(&Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr>::add, resultProvider, std::placeholders::_1);
161 load(query, addCallback).then<void, qint64>([resultProvider, &future](qint64 queriedRevision) {
162 //TODO set revision in result provider?
163 //TODO update all existing results with new revision
164 resultProvider->complete();
165 future.setValue(queriedRevision);
166 future.setFinished();
167 }).exec();
168 });
169 });
170
171 auto resourceAccess = mResourceAccess;
172 //TODO we need to somehow disconnect this
173 QObject::connect(resourceAccess.data(), &Akonadi2::ResourceAccess::revisionChanged, [runner](qint64 newRevision) {
174 runner->revisionChanged(newRevision);
175 });
176
177 return Async::start<void>([runner](Async::Future<void> &future) {
178 runner->run().then<void>([&future]() {
179 //TODO if not live query, destroy runner.
180 future.setFinished();
181 }).exec();
182 });
183}
184
185Async::Job<qint64> DummyResourceFacade::load(const Akonadi2::Query &query, const std::function<void(const Akonadi2::ApplicationDomain::Event::Ptr &)> &resultCallback)
186{
187 return synchronizeResource(query.syncOnDemand, query.processAll).then<qint64>([=](Async::Future<qint64> &future) {
153 //Now that the sync is complete we can execute the query 188 //Now that the sync is complete we can execute the query
154 const auto preparedQuery = prepareQuery(query); 189 const auto preparedQuery = prepareQuery(query);
155 190
156 auto storage = QSharedPointer<Akonadi2::Storage>::create(Akonadi2::Store::storageLocation(), "org.kde.dummy"); 191 auto storage = QSharedPointer<Akonadi2::Storage>::create(Akonadi2::Store::storageLocation(), "org.kde.dummy");
157 192
158 //TODO use transaction over full query and record store revision. We'll need it to update the query. 193 storage->startTransaction(Akonadi2::Storage::ReadOnly);
194 const qint64 revision = storage->maxRevision();
159 195
160 //Index lookups 196 //Index lookups
161 QVector<QByteArray> keys; 197 QVector<QByteArray> keys;
@@ -177,6 +213,8 @@ Async::Job<void> DummyResourceFacade::load(const Akonadi2::Query &query, const s
177 readValue(storage, key, resultCallback, preparedQuery); 213 readValue(storage, key, resultCallback, preparedQuery);
178 } 214 }
179 } 215 }
216 storage->abortTransaction();
217 future.setValue(revision);
180 future.setFinished(); 218 future.setFinished();
181 }); 219 });
182} 220}