feat(EventsDb): add a trigger to delete message_participant entries

This commit is contained in:
Ronan Abhamon 2017-10-11 10:50:50 +02:00
parent 26cc84140d
commit 2aa0652cc9

View file

@ -267,10 +267,11 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {}
soci::use(static_cast<int>(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<int>(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<int>(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) {