summaryrefslogtreecommitdiffstats
path: root/common/facade.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/facade.cpp')
-rw-r--r--common/facade.cpp16
1 files changed, 8 insertions, 8 deletions
diff --git a/common/facade.cpp b/common/facade.cpp
index 2806f4d..92124fc 100644
--- a/common/facade.cpp
+++ b/common/facade.cpp
@@ -203,16 +203,15 @@ void GenericFacade<DomainType>::replaySet(ResultSet &resultSet, Akonadi2::Result
203} 203}
204 204
205template<class DomainType> 205template<class DomainType>
206void GenericFacade<DomainType>::readEntity(const Akonadi2::Storage::Transaction &transaction, const QByteArray &key, const std::function<void(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &, Akonadi2::Operation)> &resultCallback) 206void GenericFacade<DomainType>::readEntity(const Akonadi2::Storage::NamedDatabase &db, const QByteArray &key, const std::function<void(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &, Akonadi2::Operation)> &resultCallback)
207{ 207{
208 const auto bufferType = bufferTypeForDomainType();
209 //This only works for a 1:1 mapping of resource to domain types. 208 //This only works for a 1:1 mapping of resource to domain types.
210 //Not i.e. for tags that are stored as flags in each entity of an imap store. 209 //Not i.e. for tags that are stored as flags in each entity of an imap store.
211 //additional properties that don't have a 1:1 mapping (such as separately stored tags), 210 //additional properties that don't have a 1:1 mapping (such as separately stored tags),
212 //could be added to the adaptor. 211 //could be added to the adaptor.
213 // 212 //
214 // Akonadi2::Storage::getLatest(transaction, bufferTye, key); 213 // Akonadi2::Storage::getLatest(transaction, bufferTye, key);
215 transaction.openDatabase(bufferType + ".main").findLatest(key, [=](const QByteArray &key, const QByteArray &value) -> bool { 214 db.findLatest(key, [=](const QByteArray &key, const QByteArray &value) -> bool {
216 Akonadi2::EntityBuffer buffer(value.data(), value.size()); 215 Akonadi2::EntityBuffer buffer(value.data(), value.size());
217 const Akonadi2::Entity &entity = buffer.entity(); 216 const Akonadi2::Entity &entity = buffer.entity();
218 const auto metadataBuffer = Akonadi2::EntityBuffer::readBuffer<Akonadi2::Metadata>(entity.metadata()); 217 const auto metadataBuffer = Akonadi2::EntityBuffer::readBuffer<Akonadi2::Metadata>(entity.metadata());
@@ -270,15 +269,15 @@ ResultSet GenericFacade<DomainType>::loadIncrementalResultSet(qint64 baseRevisio
270} 269}
271 270
272template<class DomainType> 271template<class DomainType>
273ResultSet GenericFacade<DomainType>::filterSet(const ResultSet &resultSet, const std::function<bool(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject)> &filter, const Akonadi2::Storage::Transaction &transaction, bool initialQuery) 272ResultSet GenericFacade<DomainType>::filterSet(const ResultSet &resultSet, const std::function<bool(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject)> &filter, const Akonadi2::Storage::NamedDatabase &db, bool initialQuery)
274{ 273{
275 auto resultSetPtr = QSharedPointer<ResultSet>::create(resultSet); 274 auto resultSetPtr = QSharedPointer<ResultSet>::create(resultSet);
276 275
277 //Read through the source values and return whatever matches the filter 276 //Read through the source values and return whatever matches the filter
278 std::function<bool(std::function<void(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &, Akonadi2::Operation)>)> generator = [this, resultSetPtr, &transaction, filter, initialQuery](std::function<void(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &, Akonadi2::Operation)> callback) -> bool { 277 std::function<bool(std::function<void(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &, Akonadi2::Operation)>)> generator = [this, resultSetPtr, &db, filter, initialQuery](std::function<void(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &, Akonadi2::Operation)> callback) -> bool {
279 while (resultSetPtr->next()) { 278 while (resultSetPtr->next()) {
280 //readEntity is only necessary if we actually want to filter or know the operation type (but not a big deal if we do it always I guess) 279 //readEntity is only necessary if we actually want to filter or know the operation type (but not a big deal if we do it always I guess)
281 readEntity(transaction, resultSetPtr->id(), [this, filter, callback, initialQuery](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject, Akonadi2::Operation operation) { 280 readEntity(db, resultSetPtr->id(), [this, filter, callback, initialQuery](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject, Akonadi2::Operation operation) {
282 //Always remove removals, they probably don't match due to non-available properties 281 //Always remove removals, they probably don't match due to non-available properties
283 if (filter(domainObject) || operation == Akonadi2::Operation_Removal) { 282 if (filter(domainObject) || operation == Akonadi2::Operation_Removal) {
284 if (initialQuery) { 283 if (initialQuery) {
@@ -319,17 +318,18 @@ std::function<bool(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr
319} 318}
320 319
321template<class DomainType> 320template<class DomainType>
322qint64 GenericFacade<DomainType>::load(const Akonadi2::Query &query, const std::function<ResultSet(Akonadi2::Storage::Transaction &, QSet<QByteArray> &)> &baseSetRetriever, Akonadi2::ResultProviderInterface<typename DomainType::Ptr> &resultProvider) 321qint64 GenericFacade<DomainType>::load(const Akonadi2::Query &query, const std::function<ResultSet(Akonadi2::Storage::Transaction &, QSet<QByteArray> &)> &baseSetRetriever, Akonadi2::ResultProviderInterface<typename DomainType::Ptr> &resultProvider, bool initialQuery)
323{ 322{
324 Akonadi2::Storage storage(Akonadi2::storageLocation(), mResourceInstanceIdentifier); 323 Akonadi2::Storage storage(Akonadi2::storageLocation(), mResourceInstanceIdentifier);
325 storage.setDefaultErrorHandler([](const Akonadi2::Storage::Error &error) { 324 storage.setDefaultErrorHandler([](const Akonadi2::Storage::Error &error) {
326 Warning() << "Error during query: " << error.store << error.message; 325 Warning() << "Error during query: " << error.store << error.message;
327 }); 326 });
328 auto transaction = storage.createTransaction(Akonadi2::Storage::ReadOnly); 327 auto transaction = storage.createTransaction(Akonadi2::Storage::ReadOnly);
328 auto db = transaction.openDatabase(bufferTypeForDomainType() + ".main");
329 329
330 QSet<QByteArray> remainingFilters; 330 QSet<QByteArray> remainingFilters;
331 auto resultSet = baseSetRetriever(transaction, remainingFilters); 331 auto resultSet = baseSetRetriever(transaction, remainingFilters);
332 auto filteredSet = filterSet(resultSet, getFilter(remainingFilters, query), transaction, initialQuery); 332 auto filteredSet = filterSet(resultSet, getFilter(remainingFilters, query), db, initialQuery);
333 replaySet(filteredSet, resultProvider); 333 replaySet(filteredSet, resultProvider);
334 resultProvider.setRevision(Akonadi2::Storage::maxRevision(transaction)); 334 resultProvider.setRevision(Akonadi2::Storage::maxRevision(transaction));
335 return Akonadi2::Storage::maxRevision(transaction); 335 return Akonadi2::Storage::maxRevision(transaction);