From e1d909d1c5e9d380bf0c762d5f8ea1294aa8becb Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 29 Nov 2017 14:12:19 +0100 Subject: [PATCH] feat(MainDb): provide a way to fetch messages from db key --- src/chat/chat-message/chat-message-p.h | 2 - src/chat/chat-message/chat-message.cpp | 12 +++--- src/db/main-db.cpp | 56 +++++++++++++++++++++++++- src/db/main-db.h | 3 ++ 4 files changed, 64 insertions(+), 9 deletions(-) diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index 6d3f2761f..aecdf91d3 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -149,8 +149,6 @@ private: ContentType cContentType; std::string cText; - std::weak_ptr chatEvent; - // TODO: Remove my comment. VARIABLES OK. // Do not expose. diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 2ceb5f27f..aaae7d964 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -586,9 +586,10 @@ void ChatMessagePrivate::store() { return; } - shared_ptr eventLog = chatEvent.lock(); - if (eventLog) { - q->getChatRoom()->getCore()->getPrivate()->mainDb->updateEvent(eventLog); + unique_ptr &mainDb = q->getChatRoom()->getCore()->getPrivate()->mainDb; + if (dbKey.isValid()) { + shared_ptr eventLog = mainDb->getEventFromKey(dbKey); + mainDb->updateEvent(eventLog); if (direction == ChatMessage::Direction::Incoming) { if (!hasFileTransferContent()) { @@ -602,9 +603,8 @@ void ChatMessagePrivate::store() { } } } else { - eventLog = make_shared(time, q->getSharedFromThis()); - chatEvent = eventLog; - q->getChatRoom()->getCore()->getPrivate()->mainDb->addEvent(eventLog); + shared_ptr eventLog = make_shared(time, q->getSharedFromThis()); + mainDb->addEvent(eventLog); if (direction == ChatMessage::Direction::Incoming) { if (hasFileTransferContent()) { diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 95e23bb1c..f14ddc1ca 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1311,6 +1311,60 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), return count; } + shared_ptr MainDb::getEventFromKey (const MainDbKey &dbKey) { + shared_ptr event; + + if (!dbKey.isValid()) { + lWarning() << "Unable to get event from invalid key."; + return event; + } + + unique_ptr &q = dbKey.getPrivate()->core.lock()->getPrivate()->mainDb; + MainDbPrivate *d = q->getPrivate(); + + if (!q->isConnected()) { + lWarning() << "Unable to get event from key. Not connected."; + return event; + } + + const long long &storageId = dbKey.getPrivate()->storageId; + event = d->getEventFromCache(storageId); + if (event) + return event; + + // TODO: Improve. Deal with all events in the future. + static string query = "SELECT peer_sip_address.value, local_sip_address.value, type, event.creation_time" + " FROM event, conference_event, chat_room, sip_address AS peer_sip_address, sip_address as local_sip_address" + " WHERE event.id = :eventId" + " AND conference_event.event_id = event.id" + " AND conference_event.chat_room_id = chat_room.id" + " AND chat_room.peer_sip_address_id = peer_sip_address.id" + " AND chat_room.local_sip_address_id = local_sip_address.id"; + + L_BEGIN_LOG_EXCEPTION + + soci::session *session = d->dbSession.getBackendSession(); + soci::transaction tr(*session); + + string peerSipAddress; + string localSipAddress; + int type; + tm creationTime; + *session << query, soci::into(peerSipAddress), soci::into(localSipAddress), soci::into(type), + soci::into(creationTime), soci::use(storageId); + + event = d->selectGenericConferenceEvent( + storageId, + static_cast(type), + Utils::getTmAsTimeT(creationTime), + ChatRoomId(IdentityAddress(peerSipAddress), IdentityAddress(localSipAddress)) + ); + + L_END_LOG_EXCEPTION + + return event; + } + list> MainDb::getConferenceNotifiedEvents ( const ChatRoomId &chatRoomId, unsigned int lastNotifyId @@ -1449,7 +1503,7 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), if (getUnreadChatMessagesCount(chatRoomId) == 0) return; - string query = "UPDATE FROM conference_chat_message_event" + string query = "UPDATE conference_chat_message_event" " SET state = " + Utils::toString(static_cast(ChatMessage::State::Displayed)) + " "; query += "WHERE"; if (chatRoomId.isValid()) diff --git a/src/db/main-db.h b/src/db/main-db.h index 7c371444e..ac7fc3cb5 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -34,6 +34,7 @@ class ChatMessage; class ChatRoom; class Core; class EventLog; +class MainDbKey; class MainDbPrivate; class MainDb : public AbstractDb, public CoreAccessor { @@ -61,6 +62,8 @@ public: static bool deleteEvent (const std::shared_ptr &eventLog); int getEventsCount (FilterMask mask = NoFilter) const; + static std::shared_ptr getEventFromKey (const MainDbKey &dbKey); + // --------------------------------------------------------------------------- // Conference notified events. // ---------------------------------------------------------------------------