diff --git a/src/db/events-db.cpp b/src/db/events-db.cpp index ae2f96949..2ade6da98 100644 --- a/src/db/events-db.cpp +++ b/src/db/events-db.cpp @@ -267,10 +267,11 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} soci::use(static_cast(state)), soci::use(messageEventId), soci::use(sipAddressId) ); statement.execute(true); - if (statement.get_affected_rows() == 0) + if (statement.get_affected_rows() == 0 && state != ChatMessage::State::Displayed) { *session << "INSERT INTO message_participant (message_event_id, sip_address_id, state)" " VALUES (:messageEventId, :sipAddressId, :state)", soci::use(messageEventId), soci::use(sipAddressId), soci::use(static_cast(state)); + } } // ----------------------------------------------------------------------------- @@ -526,6 +527,26 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} " REFERENCES message_event(event_id)" " ON DELETE CASCADE" ")"; + + // Trigger to delete participant_message cache entries. + string displayedId = Utils::toString(static_cast(ChatMessage::State::Displayed)); + string participantMessageDeleter = + "CREATE TRIGGER IF NOT EXISTS message_participant_deleter" + " AFTER UPDATE OF state ON message_participant FOR EACH ROW" + " WHEN NEW.state = "; + participantMessageDeleter += displayedId; + participantMessageDeleter += " AND (SELECT COUNT(*) FROM (" + " SELECT state FROM message_participant WHERE" + " NEW.message_event_id = message_participant.message_event_id" + " AND state <> "; + participantMessageDeleter += displayedId; + participantMessageDeleter += " LIMIT 1" + " )) = 0" + " BEGIN" + " DELETE FROM message_participant WHERE NEW.message_event_id = message_participant.message_event_id;" + " END"; + + *session << participantMessageDeleter; } bool EventsDb::addEvent (const EventLog &eventLog) {