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