From babbd33142b0c251de8e706770dfb74cbc495650 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 20 Apr 2018 09:13:29 +0200 Subject: [PATCH] Store if we have to send a delivery and/or display notification for a message in DB. --- src/db/internal/statements.cpp | 4 +- src/db/main-db.cpp | 68 ++++++++++++++++++++-------------- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/src/db/internal/statements.cpp b/src/db/internal/statements.cpp index 6b6754228..2dddf1fef 100644 --- a/src/db/internal/statements.cpp +++ b/src/db/internal/statements.cpp @@ -81,7 +81,7 @@ namespace Statements { )", [SelectConferenceEvent] = R"( - SELECT conference_event_view.id AS event_id, type, conference_event_view.creation_time, from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address.value, participant_sip_address.value, conference_event_view.subject, peer_sip_address.value, local_sip_address.value + SELECT conference_event_view.id AS event_id, type, conference_event_view.creation_time, from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address.value, participant_sip_address.value, conference_event_view.subject, delivery_notification_required, display_notification_required, peer_sip_address.value, local_sip_address.value FROM conference_event_view JOIN chat_room ON chat_room.id = chat_room_id JOIN sip_address AS peer_sip_address ON peer_sip_address.id = peer_sip_address_id @@ -94,7 +94,7 @@ namespace Statements { )", [SelectConferenceEvents] = R"( - SELECT conference_event_view.id AS event_id, type, creation_time, from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address.value, participant_sip_address.value, subject + SELECT conference_event_view.id AS event_id, type, creation_time, from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address.value, participant_sip_address.value, subject, delivery_notification_required, display_notification_required FROM conference_event_view LEFT JOIN sip_address AS from_sip_address ON from_sip_address.id = from_sip_address_id LEFT JOIN sip_address AS to_sip_address ON to_sip_address.id = to_sip_address_id diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index b153a4e2e..2f104f576 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -47,7 +47,7 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE namespace { - constexpr unsigned int ModuleVersionEvents = makeVersion(1, 0, 3); + constexpr unsigned int ModuleVersionEvents = makeVersion(1, 0, 4); constexpr unsigned int ModuleVersionFriends = makeVersion(1, 0, 0); constexpr unsigned int ModuleVersionLegacyFriendsImport = makeVersion(1, 0, 0); constexpr unsigned int ModuleVersionLegacyHistoryImport = makeVersion(1, 0, 0); @@ -612,6 +612,8 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( dChatMessage->setTime(Utils::getTmAsTimeT(row.get(5))); dChatMessage->setImdnMessageId(row.get(6)); + dChatMessage->setPositiveDeliveryNotificationRequired(bool(row.get(14))); + dChatMessage->setDisplayNotificationRequired(bool(row.get(15))); dChatMessage->markContentsAsNotLoaded(); dChatMessage->setIsReadOnly(true); @@ -728,16 +730,21 @@ long long MainDbPrivate::insertConferenceChatMessageEvent (const shared_ptrgetDirection()); const string &imdnMessageId = chatMessage->getImdnMessageId(); const int &isSecured = chatMessage->isSecured() ? 1 : 0; + const int &deliveryNotificationRequired = chatMessage->getPrivate()->getPositiveDeliveryNotificationRequired(); + const int &displayNotificationRequired = chatMessage->getPrivate()->getDisplayNotificationRequired(); *dbSession.getBackendSession() << "INSERT INTO conference_chat_message_event (" " event_id, from_sip_address_id, to_sip_address_id," - " time, state, direction, imdn_message_id, is_secured" + " time, state, direction, imdn_message_id, is_secured," + " delivery_notification_required, display_notification_required" ") VALUES (" " :eventId, :localSipaddressId, :remoteSipaddressId," - " :time, :state, :direction, :imdnMessageId, :isSecured" + " :time, :state, :direction, :imdnMessageId, :isSecured," + " :deliveryNotificationRequired, :displayNotificationRequired" ")", soci::use(eventId), soci::use(fromSipAddressId), soci::use(toSipAddressId), soci::use(messageTime), soci::use(state), soci::use(direction), - soci::use(imdnMessageId), soci::use(isSecured); + soci::use(imdnMessageId), soci::use(isSecured), + soci::use(deliveryNotificationRequired), soci::use(displayNotificationRequired); for (const Content *content : chatMessage->getContents()) insertContent(eventId, *content); @@ -998,6 +1005,27 @@ void MainDbPrivate::updateSchema () { soci::use(capabilities), soci::use(capabilities); linphone_config_set_bool(linphone_core_get_config(q->getCore()->getCCore()), "misc", "prefer_basic_chat_room", TRUE); } + if (version < makeVersion(1, 0, 4)) { + *session << "ALTER TABLE conference_chat_message_event ADD COLUMN delivery_notification_required BOOLEAN NOT NULL DEFAULT 0"; + *session << "ALTER TABLE conference_chat_message_event ADD COLUMN display_notification_required BOOLEAN NOT NULL DEFAULT 0"; + + *session << "DROP VIEW IF EXISTS conference_event_view"; + + string query; + if (q->getBackend() == AbstractDb::Backend::Mysql) + query = "CREATE OR REPLACE VIEW conference_event_view AS"; + else + query = "CREATE VIEW IF NOT EXISTS conference_event_view AS"; + *session << query + + " SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject, delivery_notification_required, display_notification_required" + " FROM event" + " LEFT JOIN conference_event ON conference_event.event_id = event.id" + " LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id" + " LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id" + " LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id" + " LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id" + " LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id"; + } } // ----------------------------------------------------------------------------- @@ -1226,19 +1254,23 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { creationTime ); const int &isSecured = message.get(LegacyMessageColIsSecured, 0); + const int deliveryNotificationRequired = 0; + const int displayNotificationRequired = 0; *session << "INSERT INTO conference_event (event_id, chat_room_id)" " VALUES (:eventId, :chatRoomId)", soci::use(eventId), soci::use(chatRoomId); *session << "INSERT INTO conference_chat_message_event (" " event_id, from_sip_address_id, to_sip_address_id," - " time, state, direction, imdn_message_id, is_secured" + " time, state, direction, imdn_message_id, is_secured," + " delivery_notification_required, display_notification_required" ") VALUES (" " :eventId, :localSipAddressId, :remoteSipAddressId," - " :creationTime, :state, :direction, '', :isSecured" + " :creationTime, :state, :direction, '', :isSecured," + " :deliveryNotificationRequired, :displayNotificationRequired" ")", soci::use(eventId), soci::use(localSipAddressId), soci::use(remoteSipAddressId), - soci::use(creationTime), soci::use(state), soci::use(direction), - soci::use(isSecured); + soci::use(creationTime), soci::use(state), soci::use(direction), soci::use(isSecured), + soci::use(deliveryNotificationRequired), soci::use(displayNotificationRequired); if (content) insertContent(eventId, *content); @@ -1584,24 +1616,6 @@ void MainDb::init () { " ON DELETE CASCADE" ") " + charset; - { - string query; - if (getBackend() == Backend::Mysql) - query = "CREATE OR REPLACE VIEW conference_event_view AS"; - else - query = "CREATE VIEW IF NOT EXISTS conference_event_view AS"; - - *session << query + - " SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject" - " FROM event" - " LEFT JOIN conference_event ON conference_event.event_id = event.id" - " LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id" - " LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id" - " LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id" - " LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id" - " LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id"; - } - *session << "CREATE TABLE IF NOT EXISTS db_module_version (" " name" + varcharPrimaryKeyStr(255) + "," @@ -1779,7 +1793,7 @@ shared_ptr MainDb::getEventFromKey (const MainDbKey &dbKey) { *d->dbSession.getBackendSession() << Statements::get(Statements::SelectConferenceEvent), soci::into(row), soci::use(eventId); - ChatRoomId chatRoomId(IdentityAddress(row.get(14)), IdentityAddress(row.get(15))); + ChatRoomId chatRoomId(IdentityAddress(row.get(16)), IdentityAddress(row.get(17))); shared_ptr chatRoom = d->findChatRoom(chatRoomId); if (!chatRoom) return shared_ptr();