From 6ef85b29d7dbf212f6c35bdbf8635db29e52e310 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Thu, 9 Nov 2017 10:16:39 +0100 Subject: [PATCH] feat(MainDb): provide a way to invalid events from query --- src/db/main-db-p.h | 1 + src/db/main-db.cpp | 56 ++++++++++++++++++++++++--------------- src/event-log/event-log.h | 1 + 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index 290c0d42f..fb30249f0 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -113,6 +113,7 @@ private: // --------------------------------------------------------------------------- std::shared_ptr getEventFromCache (long long eventId) const; + void invalidEventsFromQuery (const std::string &query, const std::string &peerAddress); L_DECLARE_PUBLIC(MainDb); }; diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 79a6a211d..d7b194bf1 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -89,8 +89,8 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), ) { L_ASSERT( find_if(filters.cbegin(), filters.cend(), [](const MainDb::Filter &filter) { - return filter == MainDb::NoFilter; - }) == filters.cend() + return filter == MainDb::NoFilter; + }) == filters.cend() ); if (mask == MainDb::NoFilter) @@ -134,7 +134,6 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), void MainDbPrivate::insertContent (long long eventId, const Content &content) { L_Q(); - soci::session *session = dbSession.getBackendSession(); long long contentTypeId = insertContentType(content.getContentType().asString()); @@ -253,15 +252,11 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), } shared_ptr MainDbPrivate::selectConferenceEvent ( - long long eventId, + long long, EventLog::Type type, time_t date, const string &peerAddress ) const { - // Useless here. - (void)eventId; - - // TODO: Use cache. return make_shared( type, date, @@ -352,7 +347,6 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), " AND participant_address.id = participant_address_id", soci::into(notifyId), soci::into(participantAddress), soci::use(eventId); - // TODO: Use cache. return make_shared( type, date, @@ -383,7 +377,6 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), " AND gruu_address.id = gruu_address_id", soci::into(notifyId), soci::into(participantAddress), soci::into(gruuAddress), soci::use(eventId); - // TODO: Use cache. return make_shared( type, date, @@ -410,7 +403,6 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), " AND conference_notified_event.event_id = conference_subject_event.event_id", soci::into(notifyId), soci::into(subject), soci::use(eventId); - // TODO: Use cache. return make_shared( date, Address(peerAddress), @@ -478,7 +470,7 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), soci::use(static_cast(chatMessage->getState())), soci::use(static_cast(chatMessage->getDirection())), soci::use(chatMessage->getImdnMessageId()), soci::use(chatMessage->isSecured() ? 1 : 0); - for (Content *content : chatMessage->getContents()) + for (const Content *content : chatMessage->getContents()) insertContent(eventId, *content); return eventId; @@ -549,6 +541,23 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), return eventLog; } + void MainDbPrivate::invalidEventsFromQuery (const string &query, const string &peerAddress) { + L_Q(); + + soci::session *session = dbSession.getBackendSession(); + soci::rowset rows = (session->prepare << query, soci::use(peerAddress)); + for (const auto &row : rows) { + shared_ptr eventLog = getEventFromCache( + q->getBackend() == AbstractDb::Sqlite3 ? static_cast(row.get(0)) : row.get(0) + ); + if (eventLog) { + const EventLogPrivate *dEventLog = eventLog->getPrivate(); + L_ASSERT(dEventLog->dbKey.isValid()); + dEventLog->dbKey = MainDbEventKey(); + } + } + } + // ----------------------------------------------------------------------------- void MainDb::init () { @@ -1154,19 +1163,15 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), return; } - // TODO: Deal with mask. - - string query; - if (mask == MainDb::NoFilter || mask & ConferenceChatMessageFilter) - query += "SELECT event_id FROM conference_event WHERE chat_room_id = (" - " SELECT id FROM sip_address WHERE value = :peerAddress" - ")"; - - if (query.empty()) - return; + string query = "SELECT event_id FROM conference_event WHERE chat_room_id = (" + " SELECT id FROM sip_address WHERE value = :peerAddress" + ")" + buildSqlEventFilter({ + ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter + }, mask); L_BEGIN_LOG_EXCEPTION + d->invalidEventsFromQuery(query, peerAddress); soci::session *session = d->dbSession.getBackendSession(); *session << "DELETE FROM event WHERE id IN (" + query + ")", soci::use(peerAddress); @@ -1272,6 +1277,13 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), L_BEGIN_LOG_EXCEPTION + d->invalidEventsFromQuery( + "SELECT event_id FROM conference_event WHERE chat_room_id = (" + " SELECT id FROM sip_address WHERE value = :peerAddress" + ")", + peerAddress + ); + soci::session *session = d->dbSession.getBackendSession(); *session << "DELETE FROM chat_room WHERE peer_sip_address_id = (" " SELECT id FROM sip_address WHERE value = :peerAddress" diff --git a/src/event-log/event-log.h b/src/event-log/event-log.h index 3134421e8..9e43aec8c 100644 --- a/src/event-log/event-log.h +++ b/src/event-log/event-log.h @@ -35,6 +35,7 @@ class EventLogPrivate; class LINPHONE_PUBLIC EventLog : public BaseObject { friend class MainDb; + friend class MainDbPrivate; public: L_DECLARE_ENUM(Type, L_ENUM_VALUES_EVENT_LOG_TYPE);