From b12304668a64eab12bc98e947eb762a26856d00f Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 23 Nov 2017 17:26:10 +0100 Subject: [PATCH] Added update methods for ChatMessageEvents and ChatMessageContent --- src/db/main-db-event-key.h | 1 + src/db/main-db-p.h | 2 + src/db/main-db.cpp | 80 ++++++++++++++++++++++++++++++++++++++ src/db/main-db.h | 1 + 4 files changed, 84 insertions(+) diff --git a/src/db/main-db-event-key.h b/src/db/main-db-event-key.h index 37ea05c35..5b9c90dbf 100644 --- a/src/db/main-db-event-key.h +++ b/src/db/main-db-event-key.h @@ -33,6 +33,7 @@ class MainDbEventKeyPrivate; class MainDbEventKey : public ClonableObject { friend class MainDb; + friend class MainDbPrivate; public: MainDbEventKey (); diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index d51e9ca0b..85fb696cf 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -41,6 +41,7 @@ private: long long insertSipAddress (const std::string &sipAddress); void insertContent (long long messageEventId, const Content &content); + void updateContent (long long messageEventId, long long messageContentId, const Content &content); long long insertContentType (const std::string &contentType); long long insertChatRoom ( long long peerSipAddressId, @@ -114,6 +115,7 @@ private: long long insertConferenceEvent (const std::shared_ptr &eventLog, long long *chatRoomId = nullptr); long long insertConferenceCallEvent (const std::shared_ptr &eventLog); long long insertConferenceChatMessageEvent (const std::shared_ptr &eventLog); + void updateConferenceChatMessageEvent(const std::shared_ptr &eventLog); long long insertConferenceNotifiedEvent (const std::shared_ptr &eventLog, long long *chatRoomId = nullptr); long long insertConferenceParticipantEvent (const std::shared_ptr &eventLog); long long insertConferenceParticipantDeviceEvent (const std::shared_ptr &eventLog); diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 493dfe28f..6752209dc 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -148,6 +148,18 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), soci::use(messageContentId), soci::use(appData.first), soci::use(appData.second); } + void MainDbPrivate::updateContent (long long eventId, long long messageContentId, const Content &content) { + soci::session *session = dbSession.getBackendSession(); + + long long contentTypeId = insertContentType(content.getContentType().asString()); + *session << "UPDATE chat_message_content SET content_type_id=:contentTypeId, body=:body WHERE event_id=:eventId", + soci::use(contentTypeId), soci::use(content.getBodyAsString()), soci::use(eventId); + + for (const auto &appData : content.getAppDataMap()) + *session << "UPDATE chat_message_content_app_data SET name=:name, data=:data WHERE chat_message_content_id=:messageContentId", + soci::use(appData.first), soci::use(appData.second), soci::use(messageContentId); + } + long long MainDbPrivate::insertContentType (const string &contentType) { L_Q(); soci::session *session = dbSession.getBackendSession(); @@ -581,6 +593,27 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), return eventId; } + void MainDbPrivate::updateConferenceChatMessageEvent(const std::shared_ptr &eventLog) { + shared_ptr chatMessage = static_pointer_cast(eventLog)->getChatMessage(); + shared_ptr chatRoom = chatMessage->getChatRoom(); + if (!chatRoom) { + lError() << "Unable to get a valid chat room. It was removed from database."; + return; + } + + const EventLogPrivate *dEventLog = eventLog->getPrivate(); + MainDbEventKeyPrivate *dEventKey = dEventLog->dbKey.getPrivate(); + long long eventId = dEventKey->storageId; + + soci::session *session = dbSession.getBackendSession(); + *session << "UPDATE conference_chat_message_event SET state=:state WHERE event_id=:eventId" + , soci::use(static_cast(chatMessage->getState())), soci::use(eventId); + + /*for (const Content *content : chatMessage->getContents()) + updateContent(eventId, *content);*/ + //TODO check if content needs to be inserted, updated or removed + } + long long MainDbPrivate::insertConferenceNotifiedEvent (const shared_ptr &eventLog, long long *chatRoomId) { long long curChatRoomId; long long eventId = insertConferenceEvent(eventLog, &curChatRoomId); @@ -1014,6 +1047,53 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), return soFarSoGood; } + bool MainDb::updateEvent (const shared_ptr &eventLog) { + L_D(); + + if (!isConnected()) { + lWarning() << "Unable to update event. Not connected."; + return false; + } + + const EventLogPrivate *dEventLog = eventLog->getPrivate(); + if (!dEventLog->dbKey.isValid()) { + lWarning() << "Unable to update an event that wasn't inserted yet!!!"; + return false; + } + + L_BEGIN_LOG_EXCEPTION + + soci::transaction tr(*d->dbSession.getBackendSession()); + + switch (eventLog->getType()) { + case EventLog::Type::None: + return false; + + case EventLog::Type::ConferenceChatMessage: + d->updateConferenceChatMessageEvent(eventLog); + break; + + case EventLog::Type::ConferenceCreated: + case EventLog::Type::ConferenceDestroyed: + case EventLog::Type::ConferenceCallStart: + case EventLog::Type::ConferenceCallEnd: + case EventLog::Type::ConferenceParticipantAdded: + case EventLog::Type::ConferenceParticipantRemoved: + case EventLog::Type::ConferenceParticipantSetAdmin: + case EventLog::Type::ConferenceParticipantUnsetAdmin: + case EventLog::Type::ConferenceParticipantDeviceAdded: + case EventLog::Type::ConferenceParticipantDeviceRemoved: + case EventLog::Type::ConferenceSubjectChanged: + return false; + } + + tr.commit(); + + L_END_LOG_EXCEPTION + + return true; + } + bool MainDb::deleteEvent (const shared_ptr &eventLog) { EventLogPrivate *dEventLog = eventLog->getPrivate(); if (!dEventLog->dbKey.isValid()) { diff --git a/src/db/main-db.h b/src/db/main-db.h index 5e776482b..289ef0a05 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -56,6 +56,7 @@ public: // --------------------------------------------------------------------------- bool addEvent (const std::shared_ptr &eventLog); + bool updateEvent (const std::shared_ptr &eventLog); static bool deleteEvent (const std::shared_ptr &eventLog); int getEventsCount (FilterMask mask = NoFilter) const;