From 65978c70ad68de092c9f5eb55325c80b45495add Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 24 Nov 2017 15:56:46 +0100 Subject: [PATCH] feat(MainDb): insert participants on chat room insertion --- src/conference/participant.h | 2 +- src/core/core-chat-room.cpp | 48 +++++++--------- src/core/core-p.h | 3 - src/db/main-db-p.h | 5 +- src/db/main-db.cpp | 106 +++++++++++++++++++++++------------ src/db/main-db.h | 2 +- 6 files changed, 93 insertions(+), 73 deletions(-) diff --git a/src/conference/participant.h b/src/conference/participant.h index 00c0a687a..f80bb77a0 100644 --- a/src/conference/participant.h +++ b/src/conference/participant.h @@ -52,7 +52,7 @@ public: explicit Participant (const IdentityAddress &address); explicit Participant (IdentityAddress &&address); - const IdentityAddress& getAddress () const; + const IdentityAddress &getAddress () const; bool isAdmin () const; private: diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index 3b09ef51a..be48b1dcc 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -80,40 +80,16 @@ shared_ptr CorePrivate::createBasicChatRoom (const ChatRoomId &chatRoo void CorePrivate::insertChatRoom (const shared_ptr &chatRoom) { L_ASSERT(chatRoom); + L_Q(); - const ChatRoomId &chatRoomId = chatRoom->getChatRoomId(); - deleteChatRoom(chatRoomId); + q->deleteChatRoom(chatRoom); chatRooms.push_back(chatRoom); - chatRoomsById[chatRoomId] = chatRoom; -} - -void CorePrivate::deleteChatRoom (const ChatRoomId &chatRoomId) { - auto it = chatRoomsById.find(chatRoomId); - if (it != chatRoomsById.end()) { - auto it = find_if(chatRooms.begin(), chatRooms.end(), [&chatRoomId](const shared_ptr &chatRoom) { - return chatRoomId == chatRoom->getChatRoomId(); - }); - if (it != chatRooms.end()) { - chatRooms.erase(it); - return; - } - lError() << "Unable to remove chat room: (peer=" << - chatRoomId.getPeerAddress().asString() << ", local=" << chatRoomId.getLocalAddress().asString() << ")."; - } + chatRoomsById[chatRoom->getChatRoomId()] = chatRoom; } void CorePrivate::insertChatRoomWithDb (const shared_ptr &chatRoom) { L_ASSERT(chatRoom->getState() == ChatRoom::State::Created); - mainDb->insertChatRoom( - chatRoom->getChatRoomId(), - chatRoom->getCapabilities(), - chatRoom->getSubject() - ); -} - -void CorePrivate::deleteChatRoomWithDb (const ChatRoomId &chatRoomId) { - deleteChatRoom(chatRoomId); - mainDb->deleteChatRoom(chatRoomId); + mainDb->insertChatRoom(chatRoom); } // ----------------------------------------------------------------------------- @@ -209,7 +185,21 @@ shared_ptr Core::getOrCreateBasicChatRoomFromUri (const string &peerAd void Core::deleteChatRoom (const shared_ptr &chatRoom) { CorePrivate *d = chatRoom->getCore()->getPrivate(); - d->deleteChatRoomWithDb(chatRoom->getChatRoomId()); + + const ChatRoomId &chatRoomId = chatRoom->getChatRoomId(); + auto it = d->chatRoomsById.find(chatRoomId); + if (it != d->chatRoomsById.end()) { + auto it = find(d->chatRooms.begin(), d->chatRooms.end(), chatRoom); + if (it != d->chatRooms.end()) { + d->chatRooms.erase(it); + return; + } + lError() << "Unable to remove chat room: (peer=" << + chatRoomId.getPeerAddress().asString() << ", local=" << chatRoomId.getLocalAddress().asString() << ")."; + } + + d->mainDb->deleteChatRoom(chatRoomId); } + LINPHONE_END_NAMESPACE diff --git a/src/core/core-p.h b/src/core/core-p.h index 386c1b140..c5bb47458 100644 --- a/src/core/core-p.h +++ b/src/core/core-p.h @@ -39,9 +39,6 @@ public: LinphoneCore *cCore = nullptr; private: - void deleteChatRoom (const ChatRoomId &chatRoomId); - void deleteChatRoomWithDb (const ChatRoomId &chatRoomId); - std::list> chatRooms; std::unordered_map> chatRoomsById; diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index 5c547bc68..9a46ac4e4 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -47,10 +47,9 @@ private: long long peerSipAddressId, long long localSipAddressId, int capabilities, - const tm &creationTime, - const std::string &subject + const tm &creationTime ); - long long insertChatRoom (const ChatRoomId &chatRoomId, int capabilities, const tm &creationTime, const std::string &subject); + long long insertChatRoom (const std::shared_ptr &chatRoom); void insertChatRoomParticipant (long long chatRoomId, long long sipAddressId, bool isAdmin); void insertChatMessageParticipant (long long messageEventId, long long sipAddressId, int state); diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 96610b9e1..9064db231 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -186,42 +186,59 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), long long peerSipAddressId, long long localSipAddressId, int capabilities, - const tm &creationTime, - const string &subject + const tm &creationTime ) { L_Q(); soci::session *session = dbSession.getBackendSession(); long long id = selectChatRoomId(peerSipAddressId, localSipAddressId); - if (id < 0) { - lInfo() << "Insert new chat room in database: (peer=" << peerSipAddressId << - ", local=" << localSipAddressId << ", capabilities=" << capabilities << ")."; - *session << "INSERT INTO chat_room (" - " peer_sip_address_id, local_sip_address_id, creation_time, last_update_time, capabilities, subject" - ") VALUES (:peerSipAddressId, :localSipAddressId, :creationTime, :lastUpdateTime, :capabilities, :subject)", - soci::use(peerSipAddressId), soci::use(localSipAddressId), soci::use(creationTime), soci::use(creationTime), - soci::use(capabilities), soci::use(subject); + if (id >= 0) + return id; - return q->getLastInsertId(); - } + lInfo() << "Insert new chat room in database: (peer=" << peerSipAddressId << + ", local=" << localSipAddressId << ", capabilities=" << capabilities << ")."; + *session << "INSERT INTO chat_room (" + " peer_sip_address_id, local_sip_address_id, creation_time, last_update_time, capabilities" + ") VALUES (:peerSipAddressId, :localSipAddressId, :creationTime, :lastUpdateTime, :capabilities)", + soci::use(peerSipAddressId), soci::use(localSipAddressId), soci::use(creationTime), soci::use(creationTime), + soci::use(capabilities); - return id; + return q->getLastInsertId(); } - long long MainDbPrivate::insertChatRoom ( - const ChatRoomId &chatRoomId, - int capabilities, - const tm &creationTime, - const string &subject - ) { - return insertChatRoom ( - insertSipAddress(chatRoomId.getPeerAddress().asString()), - insertSipAddress(chatRoomId.getLocalAddress().asString()), - capabilities, - creationTime, - subject - ); + long long MainDbPrivate::insertChatRoom (const std::shared_ptr &chatRoom) { + L_Q(); + + soci::session *session = dbSession.getBackendSession(); + + const ChatRoomId &chatRoomId = chatRoom->getChatRoomId(); + long long peerSipAddressId = selectSipAddressId(chatRoomId.getPeerAddress().asString()); + long long localSipAddressId = selectSipAddressId(chatRoomId.getLocalAddress().asString()); + + long long id = selectChatRoomId(peerSipAddressId, localSipAddressId); + if (id >= 0) { + lWarning() << "Unable to insert chat room (it already exists): (peer=" << peerSipAddressId << + ", local=" << localSipAddressId << ")."; + return id; + } + + lInfo() << "Insert new chat room in database: (peer=" << peerSipAddressId << + ", local=" << localSipAddressId << ")."; + + tm creationTime = Utils::getTimeTAsTm(chatRoom->getCreationTime()); + + *session << "INSERT INTO chat_room (" + " peer_sip_address_id, local_sip_address_id, creation_time, last_update_time, capabilities, subject" + ") VALUES (:peerSipAddressId, :localSipAddressId, :creationTime, :lastUpdateTime, :capabilities, :subject)", + soci::use(peerSipAddressId), soci::use(localSipAddressId), soci::use(creationTime), soci::use(creationTime), + soci::use(static_cast(chatRoom->getCapabilities())), soci::use(chatRoom->getSubject()); + + id = q->getLastInsertId(); + for (const auto &participant : chatRoom->getParticipants()) + insertChatRoomParticipant(id, selectSipAddressId(participant->getAddress().asString()), participant->isAdmin()); + + return id; } void MainDbPrivate::insertChatRoomParticipant (long long chatRoomId, long long sipAddressId, bool isAdmin) { @@ -651,18 +668,37 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), } long long MainDbPrivate::insertConferenceParticipantEvent (const shared_ptr &eventLog) { - long long eventId = insertConferenceNotifiedEvent(eventLog); + long long chatRoomId; + long long eventId = insertConferenceNotifiedEvent(eventLog, &chatRoomId); if (eventId < 0) return -1; + shared_ptr participantEvent = + static_pointer_cast(eventLog); + long long participantAddressId = insertSipAddress( - static_pointer_cast(eventLog)->getParticipantAddress().asString() + participantEvent->getParticipantAddress().asString() ); soci::session *session = dbSession.getBackendSession(); *session << "INSERT INTO conference_participant_event (event_id, participant_sip_address_id)" " VALUES (:eventId, :participantAddressId)", soci::use(eventId), soci::use(participantAddressId); + bool isAdmin = eventLog->getType() == EventLog::Type::ConferenceParticipantSetAdmin; + switch (eventLog->getType()) { + case EventLog::Type::ConferenceParticipantAdded: + case EventLog::Type::ConferenceParticipantSetAdmin: + case EventLog::Type::ConferenceParticipantUnsetAdmin: + insertChatRoomParticipant(chatRoomId, participantAddressId, isAdmin); + break; + + case EventLog::Type::ConferenceParticipantRemoved: + // TODO: Deal with remove. + + default: + break; + } + return eventId; } @@ -1537,7 +1573,7 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), return chatRooms; } - void MainDb::insertChatRoom (const ChatRoomId &chatRoomId, int capabilities, const string &subject) { + void MainDb::insertChatRoom (const shared_ptr &chatRoom) { L_D(); if (!isConnected()) { @@ -1545,18 +1581,17 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), return; } + const ChatRoomId &chatRoomId = chatRoom->getChatRoomId(); DurationLogger durationLogger( - "Insert chat room: peer=" + chatRoomId.getPeerAddress().asString() + - ", local=" + chatRoomId.getLocalAddress().asString() + - ", capabilities=" + Utils::toString(capabilities) + - ", subject=" + subject + ")." + "Insert chat room: (peer=" + chatRoomId.getPeerAddress().asString() + + ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); L_BEGIN_LOG_EXCEPTION soci::transaction tr(*d->dbSession.getBackendSession()); - d->insertChatRoom(chatRoomId, capabilities, Utils::getTimeTAsTm(time(0)), subject); + d->insertChatRoom(chatRoom); tr.commit(); @@ -1711,8 +1746,7 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), remoteSipAddressId, localSipAddressId, static_cast(ChatRoom::Capabilities::Basic), - creationTime, - "" + creationTime ); *session << "INSERT INTO conference_event (event_id, chat_room_id)" diff --git a/src/db/main-db.h b/src/db/main-db.h index 289ef0a05..6c2975efa 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -100,7 +100,7 @@ public: // --------------------------------------------------------------------------- std::list> getChatRooms () const; - void insertChatRoom (const ChatRoomId &chatRoomId, int capabilities, const std::string &subject); + void insertChatRoom (const std::shared_ptr &chatRoom); void deleteChatRoom (const ChatRoomId &chatRoomId); // ---------------------------------------------------------------------------