From 68ce70b0722a4f4eea1e943091c150090c2fb0c6 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 12 Feb 2018 14:47:46 +0100 Subject: [PATCH] Allow storage of participant device state in database. --- src/chat/chat-room/server-group-chat-room-p.h | 4 +++ .../chat-room/server-group-chat-room-stub.cpp | 8 +++++ src/db/main-db-p.h | 1 + src/db/main-db.cpp | 35 ++++++++++++++++++- src/db/main-db.h | 3 ++ 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/chat/chat-room/server-group-chat-room-p.h b/src/chat/chat-room/server-group-chat-room-p.h index 6b9ef0da0..9d8ec8946 100644 --- a/src/chat/chat-room/server-group-chat-room-p.h +++ b/src/chat/chat-room/server-group-chat-room-p.h @@ -26,6 +26,7 @@ #include "chat-room-p.h" #include "server-group-chat-room.h" +#include "conference/participant-device.h" // ============================================================================= @@ -41,6 +42,9 @@ public: std::shared_ptr findFilteredParticipant (const std::shared_ptr &session) const; std::shared_ptr findFilteredParticipant (const IdentityAddress &participantAddress) const; + ParticipantDevice::State getParticipantDeviceState (const std::shared_ptr &device) const; + void setParticipantDeviceState (const std::shared_ptr &device, ParticipantDevice::State state); + void confirmCreation (); void confirmJoining (SalCallOp *op); void confirmRecreation (SalCallOp *op); diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index 0e59145ab..23ea6d49b 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -42,6 +42,14 @@ shared_ptr ServerGroupChatRoomPrivate::findFilteredParticipant (con return nullptr; } +ParticipantDevice::State ServerGroupChatRoomPrivate::getParticipantDeviceState (const std::shared_ptr &device) const { + return device->getState(); +} + +void ServerGroupChatRoomPrivate::setParticipantDeviceState (const std::shared_ptr &device, ParticipantDevice::State state) { + device->setState(state); +} + // ----------------------------------------------------------------------------- void ServerGroupChatRoomPrivate::confirmCreation () {} diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index 5f3ea6896..3223aa00e 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -156,6 +156,7 @@ private: unsigned int getModuleVersion (const std::string &name); void updateModuleVersion (const std::string &name, unsigned int version); + void updateSchema (); // --------------------------------------------------------------------------- // Import. diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index cf92abd52..167e6293e 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -36,7 +36,7 @@ #include "main-db-key-p.h" #include "main-db-p.h" -#define DB_MODULE_VERSION_EVENTS L_VERSION(1, 0, 0) +#define DB_MODULE_VERSION_EVENTS L_VERSION(1, 0, 1) #define DB_MODULE_VERSION_FRIENDS L_VERSION(1, 0, 0) #define DB_MODULE_VERSION_LEGACY_FRIENDS_IMPORT L_VERSION(1, 0, 0) #define DB_MODULE_VERSION_LEGACY_HISTORY_IMPORT L_VERSION(1, 0, 0) @@ -1133,6 +1133,15 @@ void MainDbPrivate::updateModuleVersion (const string &name, unsigned int versio soci::use(name), soci::use(version); } +void MainDbPrivate::updateSchema () { + soci::session *session = dbSession.getBackendSession(); + unsigned int version = getModuleVersion("events"); + + if (version < L_VERSION(1, 0, 1)) { + *session << "ALTER TABLE chat_room_participant_device ADD COLUMN state TINYINT UNSIGNED DEFAULT 0"; + } +} + // ----------------------------------------------------------------------------- #define CHECK_LEGACY_TABLE_EXISTS(SESSION, NAME) \ @@ -1752,6 +1761,8 @@ void MainDb::init () { " version INT UNSIGNED NOT NULL" ") " + charset; + d->updateSchema(); + d->updateModuleVersion("events", DB_MODULE_VERSION_EVENTS); d->updateModuleVersion("friends", DB_MODULE_VERSION_FRIENDS); } @@ -2696,6 +2707,28 @@ void MainDb::enableChatRoomMigration (const ChatRoomId &chatRoomId, bool enable) }; } +void MainDb::updateChatRoomParticipantDevice (const shared_ptr &chatRoom, const shared_ptr &device) { + L_SAFE_TRANSACTION { + L_D(); + + soci::session *session = d->dbSession.getBackendSession(); + soci::transaction tr(*session); + + const long long &dbChatRoomId = d->selectChatRoomId(chatRoom->getChatRoomId()); + const long long &participantSipAddressId = d->selectSipAddressId(device->getParticipant()->getAddress().asString()); + const long long &participantId = d->selectChatRoomParticipantId(dbChatRoomId, participantSipAddressId); + const long long &participantSipDeviceAddressId = d->selectSipAddressId(device->getAddress().asString()); + unsigned int stateInt = static_cast(device->getState()); + *session << "UPDATE chat_room_participant_device SET state = :state" + " WHERE chat_room_participant_id = :participantId AND participant_device_sip_address_id = :participantSipDeviceAddressId", + soci::use(stateInt), soci::use(participantId), soci::use(participantSipDeviceAddressId); + + tr.commit(); + + return true; + }; +} + // ----------------------------------------------------------------------------- bool MainDb::import (Backend, const string ¶meters) { diff --git a/src/db/main-db.h b/src/db/main-db.h index f3301b007..53b9c71be 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -38,6 +38,7 @@ class Core; class EventLog; class MainDbKey; class MainDbPrivate; +class ParticipantDevice; class MainDb : public AbstractDb, public CoreAccessor { friend class MainDbChatMessageKey; @@ -135,6 +136,8 @@ public: ) const; void insertOneToOneConferenceChatRoom (const std::shared_ptr &chatRoom); + void updateChatRoomParticipantDevice (const std::shared_ptr &chatRoom, const std::shared_ptr &device); + // --------------------------------------------------------------------------- // Other. // ---------------------------------------------------------------------------