From fec65e98d7016e84f305ecb221125888513566cc Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 28 Nov 2017 14:09:57 +0100 Subject: [PATCH] feat(MainDb): add a function to find a message by imdn id --- src/db/main-db.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++--- src/db/main-db.h | 8 +++++- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index ee45b91c2..de08c61b3 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -225,7 +225,7 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), return q->getLastInsertId(); } - long long MainDbPrivate::insertChatRoom (const std::shared_ptr &chatRoom) { + long long MainDbPrivate::insertChatRoom (const shared_ptr &chatRoom) { L_Q(); soci::session *session = dbSession.getBackendSession(); @@ -298,7 +298,7 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), soci::use(eventId), soci::use(sipAddressId), soci::use(state); } - long long MainDbPrivate::selectSipAddressId (const std::string &sipAddress) const { + long long MainDbPrivate::selectSipAddressId (const string &sipAddress) const { soci::session *session = dbSession.getBackendSession(); long long id; @@ -667,7 +667,7 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), return eventId; } - void MainDbPrivate::updateConferenceChatMessageEvent(const std::shared_ptr &eventLog) { + void MainDbPrivate::updateConferenceChatMessageEvent (const shared_ptr &eventLog) { shared_ptr chatMessage = static_pointer_cast(eventLog)->getChatMessage(); shared_ptr chatRoom = chatMessage->getChatRoom(); if (!chatRoom) { @@ -1443,6 +1443,62 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), return static_pointer_cast(chatList.front())->getChatMessage(); } + list> MainDb::findChatMessages ( + const ChatRoomId &chatRoomId, + const string &imdnMessageId + ) const { + L_D(); + + list> chatMessages; + + if (!isConnected()) { + lWarning() << "Unable to find chat messages. Not connected."; + return chatMessages; + } + + const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); + string query = "SELECT id, type, creation_time FROM event" + " WHERE id IN (" + " SELECT event_id FROM conference_event" + " WHERE event_id IN (SELECT event_id FROM conference_chat_message_event WHERE imdn_message_id = :imdnMessageId)" + " AND chat_room_id = :chatRoomId" + " )"; + + DurationLogger durationLogger( + "Find chat messages: (peer=" + chatRoomId.getPeerAddress().asString() + + ", local=" + chatRoomId.getLocalAddress().asString() + ")." + ); + + L_BEGIN_LOG_EXCEPTION + + soci::session *session = d->dbSession.getBackendSession(); + soci::transaction tr(*session); + + soci::rowset rows = (session->prepare << query, soci::use(imdnMessageId), soci::use(dbChatRoomId)); + for (const auto &row : rows) { + long long eventId = d->resolveId(row, 0); + shared_ptr event = d->getEventFromCache(eventId); + + if (!event) + event = d->selectGenericConferenceEvent( + eventId, + static_cast(row.get(1)), + Utils::getTmAsTimeT(row.get(2)), + chatRoomId + ); + + if (event) { + L_ASSERT(event->getType() == EventLog::Type::ConferenceChatMessage); + chatMessages.push_back(static_pointer_cast(event)->getChatMessage()); + } else + lWarning() << "Unable to fetch event: " << eventId; + } + + L_END_LOG_EXCEPTION + + return chatMessages; + } + list> MainDb::getHistory (const ChatRoomId &chatRoomId, int nLast, FilterMask mask) const { return getHistoryRange(chatRoomId, 0, nLast, mask); } diff --git a/src/db/main-db.h b/src/db/main-db.h index c9303b8c1..2cd5de58f 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -77,7 +77,13 @@ public: int getUnreadChatMessagesCount (const ChatRoomId &chatRoomId = ChatRoomId()) const; void markChatMessagesAsRead (const ChatRoomId &chatRoomId = ChatRoomId()) const; std::list> getUnreadChatMessages (const ChatRoomId &chatRoomId = ChatRoomId()) const; - std::shared_ptr getLastChatMessage (const ChatRoomId &chatRoomId = ChatRoomId()) const; + + std::shared_ptr getLastChatMessage (const ChatRoomId &chatRoomId) const; + + std::list> findChatMessages ( + const ChatRoomId &chatRoomId, + const std::string &imdnMessageId + ) const; // --------------------------------------------------------------------------- // Conference events.