From de5bd0955ac50fe17aaf0a02055cc70836b7e4ae Mon Sep 17 00:00:00 2001 From: Minijackson Date: Wed, 22 Aug 2018 13:45:49 +0200 Subject: Fix "contains" function + write tests for contains and exists --- common/storage.h | 1 + common/storage/entitystore.cpp | 5 ++--- common/storage_common.cpp | 12 +++++++++++ tests/entitystoretest.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/common/storage.h b/common/storage.h index 22d8046..ac6509d 100644 --- a/common/storage.h +++ b/common/storage.h @@ -258,6 +258,7 @@ public: static void recordUid(DataStore::Transaction &transaction, const QByteArray &uid, const QByteArray &type); static void removeUid(DataStore::Transaction &transaction, const QByteArray &uid, const QByteArray &type); static void getUids(const QByteArray &type, const Transaction &, const std::function &); + static bool hasUid(const QByteArray &type, const Transaction &, const QByteArray &uid); bool exists() const; static bool exists(const QString &storageRoot, const QString &name); diff --git a/common/storage/entitystore.cpp b/common/storage/entitystore.cpp index a92de40..454e25a 100644 --- a/common/storage/entitystore.cpp +++ b/common/storage/entitystore.cpp @@ -630,11 +630,10 @@ void EntityStore::readAllUids(const QByteArray &type, const std::functiongetTransaction(), callback); } -bool EntityStore::contains(const QByteArray &type, const QByteArray &uid) +bool EntityStore::contains(const QByteArray & /* type */, const QByteArray &uid) { Q_ASSERT(!uid.isEmpty()); - const auto internalUid = Identifier::fromDisplayByteArray(uid).toInternalByteArray(); - return DataStore::mainDatabase(d->getTransaction(), type).contains(internalUid); + return !DataStore::getRevisionsFromUid(d->getTransaction(), uid).isEmpty(); } bool EntityStore::exists(const QByteArray &type, const QByteArray &uid) diff --git a/common/storage_common.cpp b/common/storage_common.cpp index 09b7707..7c794c3 100644 --- a/common/storage_common.cpp +++ b/common/storage_common.cpp @@ -233,6 +233,18 @@ void DataStore::getUids(const QByteArray &type, const Transaction &transaction, }); } +bool DataStore::hasUid(const QByteArray &type, const Transaction &transaction, const QByteArray &uid) +{ + bool hasTheUid = false; + transaction.openDatabase(type + "uids").scan(uid, [&](const QByteArray &key, const QByteArray &) { + Q_ASSERT(uid == key); + hasTheUid = true; + return false; + }); + + return hasTheUid; +} + bool DataStore::isInternalKey(const char *key) { return key && strncmp(key, s_internalPrefix, s_internalPrefixSize) == 0; diff --git a/tests/entitystoretest.cpp b/tests/entitystoretest.cpp index aab5b3b..608de4c 100644 --- a/tests/entitystoretest.cpp +++ b/tests/entitystoretest.cpp @@ -18,6 +18,7 @@ private slots: void initTestCase() { Sink::AdaptorFactoryRegistry::instance().registerFactory("test"); + Sink::AdaptorFactoryRegistry::instance().registerFactory("test"); } void cleanup() @@ -77,6 +78,52 @@ private slots: } } + void testExistsAndContains() + { + + using namespace Sink; + ResourceContext resourceContext{resourceInstanceIdentifier.toUtf8(), "dummy", AdaptorFactoryRegistry::instance().getFactories("test")}; + Storage::EntityStore store(resourceContext, {}); + + auto mail = ApplicationDomain::ApplicationDomainType::createEntity("res1"); + mail.setExtractedMessageId("messageid"); + mail.setExtractedSubject("boo"); + + auto mail2 = ApplicationDomain::ApplicationDomainType::createEntity("res1"); + mail2.setExtractedMessageId("messageid2"); + mail2.setExtractedSubject("foo"); + + auto mail3 = ApplicationDomain::ApplicationDomainType::createEntity("res1"); + mail3.setExtractedMessageId("messageid2"); + mail3.setExtractedSubject("foo"); + + auto event = ApplicationDomain::ApplicationDomainType::createEntity("res1"); + event.setExtractedUid("messageid2"); + event.setExtractedSummary("foo"); + + store.startTransaction(Storage::DataStore::ReadWrite); + store.add("mail", mail, false); + store.add("mail", mail2, false); + store.add("mail", mail3, false); + store.add("event", event, false); + + mail.setExtractedSubject("foo"); + + store.modify("mail", mail, QByteArrayList{}, false); + store.remove("mail", mail3, false); + store.commitTransaction(); + + QVERIFY(store.contains("mail", mail.identifier())); + QVERIFY(store.contains("mail", mail2.identifier())); + QVERIFY(store.contains("mail", mail3.identifier())); + QVERIFY(store.contains("event", event.identifier())); + + QVERIFY(store.exists("mail", mail.identifier())); + QVERIFY(store.exists("mail", mail2.identifier())); + QVERIFY(!store.exists("mail", mail3.identifier())); + QVERIFY(store.exists("event", event.identifier())); + } + void readAll() { using namespace Sink; -- cgit v1.2.3