diff options
Diffstat (limited to 'common/facade.cpp')
-rw-r--r-- | common/facade.cpp | 16 |
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 | ||
205 | template<class DomainType> | 205 | template<class DomainType> |
206 | void GenericFacade<DomainType>::readEntity(const Akonadi2::Storage::Transaction &transaction, const QByteArray &key, const std::function<void(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &, Akonadi2::Operation)> &resultCallback) | 206 | void 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 | ||
272 | template<class DomainType> | 271 | template<class DomainType> |
273 | ResultSet GenericFacade<DomainType>::filterSet(const ResultSet &resultSet, const std::function<bool(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject)> &filter, const Akonadi2::Storage::Transaction &transaction, bool initialQuery) | 272 | ResultSet 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 | ||
321 | template<class DomainType> | 320 | template<class DomainType> |
322 | qint64 GenericFacade<DomainType>::load(const Akonadi2::Query &query, const std::function<ResultSet(Akonadi2::Storage::Transaction &, QSet<QByteArray> &)> &baseSetRetriever, Akonadi2::ResultProviderInterface<typename DomainType::Ptr> &resultProvider) | 321 | qint64 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); |