From cf0d0fd0c6afaeb9cdee276ee0305126b66604b3 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 10 Aug 2015 01:19:14 +0200 Subject: Ported entitystorage to new store API --- common/entitystorage.cpp | 30 +++++++++++++++--------------- common/entitystorage.h | 16 +++++++--------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/common/entitystorage.cpp b/common/entitystorage.cpp index f84e9f5..420c3b0 100644 --- a/common/entitystorage.cpp +++ b/common/entitystorage.cpp @@ -19,16 +19,16 @@ #include "entitystorage.h" -static void scan(const QSharedPointer &storage, const QByteArray &key, std::function callback) +static void scan(const Akonadi2::Storage::Transaction &transaction, const QByteArray &key, std::function callback) { - storage->scan(key, [=](void *keyValue, int keySize, void *dataValue, int dataSize) -> bool { + transaction.scan(key, [=](const QByteArray &key, const QByteArray &value) -> bool { //Skip internals - if (Akonadi2::Storage::isInternalKey(keyValue, keySize)) { + if (Akonadi2::Storage::isInternalKey(key)) { return true; } //Extract buffers - Akonadi2::EntityBuffer buffer(dataValue, dataSize); + Akonadi2::EntityBuffer buffer(value.data(), value.size()); //FIXME implement buffer.isValid() // const auto resourceBuffer = Akonadi2::EntityBuffer::readBuffer(buffer.entity().resource()); @@ -39,16 +39,16 @@ static void scan(const QSharedPointer &storage, const QByteAr // qWarning() << "invalid buffer " << QByteArray::fromRawData(static_cast(keyValue), keySize); // return true; // } - return callback(QByteArray::fromRawData(static_cast(keyValue), keySize), buffer.entity()); + return callback(key, buffer.entity()); }, [](const Akonadi2::Storage::Error &error) { qWarning() << "Error during query: " << error.message; }); } -void EntityStorageBase::readValue(const QSharedPointer &storage, const QByteArray &key, const std::function &resultCallback) +void EntityStorageBase::readValue(const Akonadi2::Storage::Transaction &transaction, const QByteArray &key, const std::function &resultCallback) { - scan(storage, key, [=](const QByteArray &key, const Akonadi2::Entity &entity) { + scan(transaction, key, [=](const QByteArray &key, const Akonadi2::Entity &entity) { const auto metadataBuffer = Akonadi2::EntityBuffer::readBuffer(entity.metadata()); qint64 revision = metadataBuffer ? metadataBuffer->revision() : -1; //This only works for a 1:1 mapping of resource to domain types. @@ -61,11 +61,11 @@ void EntityStorageBase::readValue(const QSharedPointer &stora }); } -static ResultSet fullScan(const QSharedPointer &storage) +static ResultSet fullScan(const Akonadi2::Storage::Transaction &transaction) { //TODO use a result set with an iterator, to read values on demand QVector keys; - scan(storage, QByteArray(), [=, &keys](const QByteArray &key, const Akonadi2::Entity &) { + scan(transaction, QByteArray(), [=, &keys](const QByteArray &key, const Akonadi2::Entity &) { keys << key; return true; }); @@ -73,14 +73,14 @@ static ResultSet fullScan(const QSharedPointer &storage) return ResultSet(keys); } -ResultSet EntityStorageBase::filteredSet(const ResultSet &resultSet, const std::function &filter, const QSharedPointer &storage, qint64 baseRevision, qint64 topRevision) +ResultSet EntityStorageBase::filteredSet(const ResultSet &resultSet, const std::function &filter, const Akonadi2::Storage::Transaction &transaction, qint64 baseRevision, qint64 topRevision) { auto resultSetPtr = QSharedPointer::create(resultSet); //Read through the source values and return whatever matches the filter - std::function)> generator = [this, resultSetPtr, storage, filter](std::function callback) -> bool { + std::function)> generator = [this, resultSetPtr, &transaction, filter](std::function callback) -> bool { while (resultSetPtr->next()) { - readValue(storage, resultSetPtr->id(), [this, filter, callback](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject) { + readValue(transaction, resultSetPtr->id(), [this, filter, callback](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject) { if (filter(domainObject)) { callback(domainObject); } @@ -91,7 +91,7 @@ ResultSet EntityStorageBase::filteredSet(const ResultSet &resultSet, const std:: return ResultSet(generator); } -ResultSet EntityStorageBase::getResultSet(const Akonadi2::Query &query, const QSharedPointer &storage, qint64 baseRevision, qint64 topRevision) +ResultSet EntityStorageBase::getResultSet(const Akonadi2::Query &query, const Akonadi2::Storage::Transaction &transaction, qint64 baseRevision, qint64 topRevision) { QSet appliedFilters; ResultSet resultSet = queryIndexes(query, mResourceInstanceIdentifier, appliedFilters); @@ -99,7 +99,7 @@ ResultSet EntityStorageBase::getResultSet(const Akonadi2::Query &query, const QS //We do a full scan if there were no indexes available to create the initial set. if (appliedFilters.isEmpty()) { - resultSet = fullScan(storage); + resultSet = fullScan(transaction); } auto filter = [remainingFilters, query, baseRevision, topRevision](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject) -> bool { @@ -118,5 +118,5 @@ ResultSet EntityStorageBase::getResultSet(const Akonadi2::Query &query, const QS return true; }; - return filteredSet(resultSet, filter, storage, baseRevision, topRevision); + return filteredSet(resultSet, filter, transaction, baseRevision, topRevision); } diff --git a/common/entitystorage.h b/common/entitystorage.h index a62d474..516a889 100644 --- a/common/entitystorage.h +++ b/common/entitystorage.h @@ -45,9 +45,9 @@ protected: virtual Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr copy(const Akonadi2::ApplicationDomain::ApplicationDomainType &) = 0; virtual ResultSet queryIndexes(const Akonadi2::Query &query, const QByteArray &resourceInstanceIdentifier, QSet &appliedFilters) = 0; - void readValue(const QSharedPointer &storage, const QByteArray &key, const std::function &resultCallback); - ResultSet filteredSet(const ResultSet &resultSet, const std::function &filter, const QSharedPointer &storage, qint64 baseRevision, qint64 topRevision); - ResultSet getResultSet(const Akonadi2::Query &query, const QSharedPointer &storage, qint64 baseRevision, qint64 topRevision); + void readValue(const Akonadi2::Storage::Transaction &transaction, const QByteArray &key, const std::function &resultCallback); + ResultSet filteredSet(const ResultSet &resultSet, const std::function &filter, const Akonadi2::Storage::Transaction &transaction, qint64 baseRevision, qint64 topRevision); + ResultSet getResultSet(const Akonadi2::Query &query, const Akonadi2::Storage::Transaction &transaction, qint64 baseRevision, qint64 topRevision); protected: QByteArray mResourceInstanceIdentifier; @@ -85,23 +85,21 @@ public: virtual void read(const Akonadi2::Query &query, const QPair &revisionRange, const QSharedPointer > &resultProvider) { - auto storage = QSharedPointer::create(Akonadi2::Store::storageLocation(), mResourceInstanceIdentifier); - storage->setDefaultErrorHandler([](const Akonadi2::Storage::Error &error) { + Akonadi2::Storage storage(Akonadi2::Store::storageLocation(), mResourceInstanceIdentifier); + storage.setDefaultErrorHandler([](const Akonadi2::Storage::Error &error) { Warning() << "Error during query: " << error.store << error.message; }); - storage->startTransaction(Akonadi2::Storage::ReadOnly); - //TODO start transaction on indexes as well + auto transaction = storage.createTransaction(Akonadi2::Storage::ReadOnly); Log() << "Querying" << revisionRange.first << revisionRange.second; - auto resultSet = getResultSet(query, storage, revisionRange.first, revisionRange.second); + auto resultSet = getResultSet(query, transaction, revisionRange.first, revisionRange.second); while(resultSet.next([this, resultProvider](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &value) -> bool { auto cloned = copy(*value); resultProvider->add(cloned.template staticCast()); return true; })){}; //TODO replay removals and modifications - storage->abortTransaction(); } }; -- cgit v1.2.3