From 0a2d20c474206553d5c981fd2a772188083101e9 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 29 Oct 2015 17:52:45 +0100 Subject: Updated the index on modifications and removals. Misses tests. --- common/index.cpp | 5 +++++ common/index.h | 2 +- common/storage.h | 8 +++++++- common/storage_lmdb.cpp | 17 ++++++++++++++--- examples/dummyresource/resourcefactory.cpp | 29 +++++++++++------------------ 5 files changed, 38 insertions(+), 23 deletions(-) diff --git a/common/index.cpp b/common/index.cpp index f752f5f..2fc0fe3 100644 --- a/common/index.cpp +++ b/common/index.cpp @@ -19,6 +19,11 @@ void Index::add(const QByteArray &key, const QByteArray &value) mDb.write(key, value); } +void Index::remove(const QByteArray &key, const QByteArray &value) +{ + mDb.remove(key, value); +} + void Index::lookup(const QByteArray &key, const std::function &resultHandler, const std::function &errorHandler) { diff --git a/common/index.h b/common/index.h index e1b7e3a..0ca32af 100644 --- a/common/index.h +++ b/common/index.h @@ -29,7 +29,7 @@ public: Index(const QByteArray &name, Akonadi2::Storage::Transaction &); void add(const QByteArray &key, const QByteArray &value); - // void remove(const QByteArray &key, const QByteArray &value); + void remove(const QByteArray &key, const QByteArray &value); void lookup(const QByteArray &key, const std::function &resultHandler, const std::function &errorHandler); diff --git a/common/storage.h b/common/storage.h index aa0be4c..a4137ce 100644 --- a/common/storage.h +++ b/common/storage.h @@ -63,10 +63,16 @@ public: bool write(const QByteArray &key, const QByteArray &value, const std::function &errorHandler = std::function()); /** - * Remove a value + * Remove a key */ void remove(const QByteArray &key, const std::function &errorHandler = std::function()); + /** + * Remove a key-value pair + */ + void remove(const QByteArray &key, const QByteArray &value, + const std::function &errorHandler = std::function()); + /** * Read values with a given key. * diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp index be5a9da..1516e69 100644 --- a/common/storage_lmdb.cpp +++ b/common/storage_lmdb.cpp @@ -148,6 +148,12 @@ bool Storage::NamedDatabase::write(const QByteArray &sKey, const QByteArray &sVa void Storage::NamedDatabase::remove(const QByteArray &k, const std::function &errorHandler) +{ + remove(k, QByteArray(), errorHandler); +} + +void Storage::NamedDatabase::remove(const QByteArray &k, const QByteArray &value, + const std::function &errorHandler) { if (!d || !d->transaction) { Error error(d->name.toLatin1(), ErrorCodes::GenericError, "Not open"); @@ -161,14 +167,19 @@ void Storage::NamedDatabase::remove(const QByteArray &k, MDB_val key; key.mv_size = k.size(); key.mv_data = const_cast(static_cast(k.data())); - rc = mdb_del(d->transaction, d->dbi, &key, 0); + if (value.isEmpty()) { + rc = mdb_del(d->transaction, d->dbi, &key, 0); + } else { + MDB_val data; + data.mv_size = value.size(); + data.mv_data = const_cast(static_cast(value.data())); + rc = mdb_del(d->transaction, d->dbi, &key, &data); + } if (rc) { Error error(d->name.toLatin1(), ErrorCodes::GenericError, QString("Error on mdb_del: %1 %2").arg(rc).arg(mdb_strerror(rc)).toLatin1()); errorHandler ? errorHandler(error) : d->defaultErrorHandler(error); } - - return; } int Storage::NamedDatabase::scan(const QByteArray &k, diff --git a/examples/dummyresource/resourcefactory.cpp b/examples/dummyresource/resourcefactory.cpp index 0a2e90b..b742611 100644 --- a/examples/dummyresource/resourcefactory.cpp +++ b/examples/dummyresource/resourcefactory.cpp @@ -41,13 +41,6 @@ #define ENTITY_TYPE_EVENT "event" #define ENTITY_TYPE_MAIL "mail" -static void index(const QByteArray &index, const QVariant &value, const QByteArray &uid, Akonadi2::Storage::Transaction &transaction) -{ - if (value.isValid()) { - Index(index, transaction).add(value.toByteArray(), uid); - } -} - /** * Index types: * * uid - property @@ -74,13 +67,20 @@ public: add(newEntity.getProperty("remoteId"), uid, transaction); } - void modifiedEntity(const QByteArray &key, qint64 revision, const Akonadi2::ApplicationDomain::BufferAdaptor &oldEntity, const Akonadi2::ApplicationDomain::BufferAdaptor &newEntity, Akonadi2::Storage::Transaction &transaction) Q_DECL_OVERRIDE + void modifiedEntity(const QByteArray &uid, qint64 revision, const Akonadi2::ApplicationDomain::BufferAdaptor &oldEntity, const Akonadi2::ApplicationDomain::BufferAdaptor &newEntity, Akonadi2::Storage::Transaction &transaction) Q_DECL_OVERRIDE { + Akonadi2::ApplicationDomain::TypeImplementation::removeIndex(uid, oldEntity, transaction); + Akonadi2::ApplicationDomain::TypeImplementation::index(uid, newEntity, transaction); + remove(oldEntity.getProperty("remoteId"), uid, transaction); + add(newEntity.getProperty("remoteId"), uid, transaction); } - void deletedEntity(const QByteArray &key, qint64 revision, const Akonadi2::ApplicationDomain::BufferAdaptor &oldEntity, Akonadi2::Storage::Transaction &transaction) Q_DECL_OVERRIDE + void deletedEntity(const QByteArray &uid, qint64 revision, const Akonadi2::ApplicationDomain::BufferAdaptor &oldEntity, Akonadi2::Storage::Transaction &transaction) Q_DECL_OVERRIDE { + Akonadi2::ApplicationDomain::TypeImplementation::removeIndex(uid, oldEntity, transaction); + remove(oldEntity.getProperty("remoteId"), uid, transaction); } + private: void add(const QVariant &value, const QByteArray &uid, Akonadi2::Storage::Transaction &transaction) { @@ -89,16 +89,9 @@ private: } } - void remove(const QByteArray &uid, Akonadi2::Storage::Transaction &transaction) - { - //Knowning the indexed value would probably help removing the uid efficiently. Otherwise we have to execute a full scan. - // Index(mIndexIdentifier, transaction).remove(uid); - } - - void modify(Akonadi2::Storage::Transaction &transaction) + void remove(const QVariant &value, const QByteArray &uid, Akonadi2::Storage::Transaction &transaction) { - //Knowning the indexed value would probably help removing the uid efficiently. Otherwise we have to execute a full scan. - // Index(mIndexIdentifier, transaction).remove(uid); + Index(mIndexIdentifier, transaction).remove(value.toByteArray(), uid); } QByteArray mIndexIdentifier; -- cgit v1.2.3