Browse Source

feat(history): Remove group history on quit when selected

The same user may have sent a message both in the group and 1:1, so
generically remove aliases that have no associated messages, rather than
aliases that were used in the group.

Similarly, generically remove authors that have no associated aliases.

The group itself is a chat so will be removed through existing query.
reviewable/pr6561/r52
Anthony Bilinski 3 years ago
parent
commit
1142cc03f8
No known key found for this signature in database
GPG Key ID: 2AA8E0DA1B31FB3C
  1. 2
      src/model/about/aboutfriend.cpp
  2. 33
      src/persistence/history.cpp
  3. 2
      src/persistence/history.h

2
src/model/about/aboutfriend.cpp

@ -127,7 +127,7 @@ bool AboutFriend::clearHistory()
const ToxPk pk = f->getPublicKey(); const ToxPk pk = f->getPublicKey();
History* const history = Nexus::getProfile()->getHistory(); History* const history = Nexus::getProfile()->getHistory();
if (history) { if (history) {
history->removeFriendHistory(pk); history->removeChatHistory(pk);
return true; return true;
} }

33
src/persistence/history.cpp

@ -264,7 +264,7 @@ void History::eraseHistory()
* @brief Erases the chat history of one chat. * @brief Erases the chat history of one chat.
* @param chatId Chat ID to erase. * @param chatId Chat ID to erase.
*/ */
void History::removeFriendHistory(const ToxPk& friendPk) void History::removeChatHistory(const ChatId& chatId)
{ {
if (!isValid()) { if (!isValid()) {
return; return;
@ -276,7 +276,7 @@ void History::removeFriendHistory(const ToxPk& friendPk)
" SELECT faux_offline_pending.id FROM faux_offline_pending " " SELECT faux_offline_pending.id FROM faux_offline_pending "
" LEFT JOIN history ON faux_offline_pending.id = history.id " " LEFT JOIN history ON faux_offline_pending.id = history.id "
" WHERE chat_id="); " WHERE chat_id=");
addChatIdSubQuery(queryString, boundParams, friendPk); addChatIdSubQuery(queryString, boundParams, chatId);
queryString += QStringLiteral( queryString += QStringLiteral(
"); " "); "
"DELETE FROM broken_messages " "DELETE FROM broken_messages "
@ -284,42 +284,45 @@ void History::removeFriendHistory(const ToxPk& friendPk)
" SELECT broken_messages.id FROM broken_messages " " SELECT broken_messages.id FROM broken_messages "
" LEFT JOIN history ON broken_messages.id = history.id " " LEFT JOIN history ON broken_messages.id = history.id "
" WHERE chat_id="); " WHERE chat_id=");
addChatIdSubQuery(queryString, boundParams, friendPk); addChatIdSubQuery(queryString, boundParams, chatId);
queryString += QStringLiteral( queryString += QStringLiteral(
"); " "); "
"DELETE FROM text_messages " "DELETE FROM text_messages "
"WHERE id IN (" "WHERE id IN ("
" SELECT id from history " " SELECT id from history "
" WHERE message_type = 'T' AND chat_id="); " WHERE message_type = 'T' AND chat_id=");
addChatIdSubQuery(queryString, boundParams, friendPk); addChatIdSubQuery(queryString, boundParams, chatId);
queryString += QStringLiteral( queryString += QStringLiteral(
");" ");"
"DELETE FROM file_transfers " "DELETE FROM file_transfers "
"WHERE id IN ( " "WHERE id IN ( "
" SELECT id from history " " SELECT id from history "
" WHERE message_type = 'F' AND chat_id="); " WHERE message_type = 'F' AND chat_id=");
addChatIdSubQuery(queryString, boundParams, friendPk); addChatIdSubQuery(queryString, boundParams, chatId);
queryString += QStringLiteral( queryString += QStringLiteral(
");" ");"
"DELETE FROM system_messages " "DELETE FROM system_messages "
"WHERE id IN ( " "WHERE id IN ( "
" SELECT id from history " " SELECT id from history "
" WHERE message_type = 'S' AND chat_id="); " WHERE message_type = 'S' AND chat_id=");
addChatIdSubQuery(queryString, boundParams, friendPk); addChatIdSubQuery(queryString, boundParams, chatId);
queryString += QStringLiteral(");" queryString += QStringLiteral(");"
"DELETE FROM history WHERE chat_id="); "DELETE FROM history WHERE chat_id=");
addChatIdSubQuery(queryString, boundParams, friendPk); addChatIdSubQuery(queryString, boundParams, chatId);
queryString += QStringLiteral("; " queryString += QStringLiteral("; "
"DELETE FROM chats WHERE id="); "DELETE FROM chats WHERE id=");
addChatIdSubQuery(queryString, boundParams, friendPk); addChatIdSubQuery(queryString, boundParams, chatId);
queryString += QStringLiteral("; "
"DELETE FROM aliases WHERE owner=");
addAuthorIdSubQuery(queryString, boundParams, friendPk);
queryString += QStringLiteral("; "
"DELETE FROM authors WHERE id=");
addAuthorIdSubQuery(queryString, boundParams, friendPk);
queryString += QStringLiteral("; " queryString += QStringLiteral("; "
"VACUUM;"); "DELETE FROM aliases WHERE id NOT IN ( "
" SELECT DISTINCT sender_alias FROM "
" text_messages JOIN file_transfers);");
queryString += QStringLiteral(
"DELETE FROM authors WHERE id NOT IN ( "
" SELECT DISTINCT owner FROM aliases);");
queryString += QStringLiteral("VACUUM;");
RawDatabase::Query query = {queryString, boundParams}; RawDatabase::Query query = {queryString, boundParams};
if (!db->execNow(query)) { if (!db->execNow(query)) {

2
src/persistence/history.h

@ -219,7 +219,7 @@ public:
bool historyExists(const ChatId& chatId); bool historyExists(const ChatId& chatId);
void eraseHistory(); void eraseHistory();
void removeFriendHistory(const ToxPk& friendPk); void removeChatHistory(const ChatId& chatId);
void addNewMessage(const ChatId& chatId, const QString& message, const ToxPk& sender, void addNewMessage(const ChatId& chatId, const QString& message, const ToxPk& sender,
const QDateTime& time, bool isDelivered, ExtensionSet extensions, const QDateTime& time, bool isDelivered, ExtensionSet extensions,
QString dispName, const std::function<void(RowId)>& insertIdCallback = {}); QString dispName, const std::function<void(RowId)>& insertIdCallback = {});

Loading…
Cancel
Save