From d9f022bb3f07b5a3dd64502db8e6e0155b2cae24 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 8 Nov 2017 15:37:12 +0100 Subject: [PATCH] feat(MainDb): getConferenceNotifiedEvents supports events cache --- src/db/main-db-p.h | 6 ++++++ src/db/main-db.cpp | 23 ++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index ba4a9c23c..290c0d42f 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -108,6 +108,12 @@ private: long long insertConferenceParticipantDeviceEvent (const std::shared_ptr &eventLog); long long insertConferenceSubjectEvent (const std::shared_ptr &eventLog); + // --------------------------------------------------------------------------- + // Cache API. + // --------------------------------------------------------------------------- + + std::shared_ptr getEventFromCache (long long eventId) const; + L_DECLARE_PUBLIC(MainDb); }; diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 700cf46d6..a9d657136 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -536,6 +536,19 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), return eventId; } +// ----------------------------------------------------------------------------- + + shared_ptr MainDbPrivate::getEventFromCache (long long eventId) const { + auto it = storageIdToEvent.find(eventId); + if (it == storageIdToEvent.cend()) + return nullptr; + + shared_ptr eventLog = it->second.lock(); + // Must exist. If not, implementation bug. + L_ASSERT(eventLog); + return eventLog; + } + // ----------------------------------------------------------------------------- void MainDb::init () { @@ -920,13 +933,17 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), soci::transaction tr(*session); soci::rowset rows = (session->prepare << query, soci::use(peerAddress), soci::use(lastNotifyId)); - for (const auto &row : rows) - events.push_back(d->selectGenericConferenceEvent( - getBackend() == Sqlite3 ? static_cast(row.get(0)) : row.get(0), + for (const auto &row : rows) { + long long eventId = getBackend() == Sqlite3 ? static_cast(row.get(0)) : row.get(0); + shared_ptr eventLog = d->getEventFromCache(eventId); + + events.push_back(eventLog ? eventLog : d->selectGenericConferenceEvent( + eventId, static_cast(row.get(1)), Utils::getTmAsTimeT(row.get(2)), peerAddress )); + } L_END_LOG_EXCEPTION