From d6e6cab8b284167a9c8fd30ae669354d8315b3aa Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sat, 10 Oct 2015 14:13:27 +0200 Subject: Create a new revision for removals as well. So we can replay the change. --- common/pipeline.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'common') diff --git a/common/pipeline.cpp b/common/pipeline.cpp index 38029a3..b05cb2f 100644 --- a/common/pipeline.cpp +++ b/common/pipeline.cpp @@ -172,6 +172,7 @@ KAsync::Job Pipeline::newEntity(void const *command, size_t size) auto metadataBuilder = Akonadi2::MetadataBuilder(metadataFbb); metadataBuilder.add_revision(newRevision); metadataBuilder.add_processed(false); + metadataBuilder.add_operation(Akonadi2::Operation_Creation); auto metadataBuffer = metadataBuilder.Finish(); Akonadi2::FinishMetadataBuffer(metadataFbb, metadataBuffer); @@ -277,6 +278,7 @@ KAsync::Job Pipeline::modifiedEntity(void const *command, size_t size) auto metadataBuilder = Akonadi2::MetadataBuilder(metadataFbb); metadataBuilder.add_revision(newRevision); metadataBuilder.add_processed(false); + metadataBuilder.add_operation(Akonadi2::Operation_Modification); auto metadataBuffer = metadataBuilder.Finish(); Akonadi2::FinishMetadataBuffer(metadataFbb, metadataBuffer); @@ -300,8 +302,6 @@ KAsync::Job Pipeline::deletedEntity(void const *command, size_t size) { Trace() << "Pipeline: Deleted Entity"; - const qint64 newRevision = Akonadi2::Storage::maxRevision(d->transaction) + 1; - { flatbuffers::Verifier verifyer(reinterpret_cast(command), size); if (!Akonadi2::Commands::VerifyDeleteEntityBuffer(verifyer)) { @@ -315,11 +315,21 @@ KAsync::Job Pipeline::deletedEntity(void const *command, size_t size) const QByteArray key = QByteArray(reinterpret_cast(deleteEntity->entityId()->Data()), deleteEntity->entityId()->size()); const qint64 baseRevision = deleteEntity->revision(); - //TODO instead of deleting the entry, a new revision should be created that marks the entity as deleted - //TODO remove all revisions? - d->transaction.openDatabase(bufferType + ".main").remove(Akonadi2::Storage::assembleKey(key, baseRevision)); - Akonadi2::Storage::setMaxRevision(d->transaction, newRevision); - Akonadi2::Storage::recordRevision(d->transaction, newRevision, key, bufferType); + const qint64 newRevision = Akonadi2::Storage::maxRevision(d->transaction) + 1; + + //Add metadata buffer + flatbuffers::FlatBufferBuilder metadataFbb; + auto metadataBuilder = Akonadi2::MetadataBuilder(metadataFbb); + metadataBuilder.add_revision(newRevision); + metadataBuilder.add_processed(false); + metadataBuilder.add_operation(Akonadi2::Operation_Removal); + auto metadataBuffer = metadataBuilder.Finish(); + Akonadi2::FinishMetadataBuffer(metadataFbb, metadataBuffer); + + flatbuffers::FlatBufferBuilder fbb; + EntityBuffer::assembleEntityBuffer(fbb, metadataFbb.GetBufferPointer(), metadataFbb.GetSize(), 0, 0, 0, 0); + + storeNewRevision(newRevision, fbb, bufferType, key); Log() << "Pipeline: deleted entity: "<< newRevision; return KAsync::start([this, key, bufferType, newRevision](KAsync::Future &future) { -- cgit v1.2.3