From c6ff25cc7a410416ab3f83565205d4841c97e4cb Mon Sep 17 00:00:00 2001 From: fiaxh Date: Wed, 7 Mar 2018 21:17:15 +0100 Subject: Only assume UUID to be unique for one counterpart+account when deduplicating --- libdino/src/service/database.vala | 22 ++++++++++++++++------ libdino/src/service/message_processor.vala | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) (limited to 'libdino') diff --git a/libdino/src/service/database.vala b/libdino/src/service/database.vala index c668ce17..25db82f8 100644 --- a/libdino/src/service/database.vala +++ b/libdino/src/service/database.vala @@ -273,7 +273,6 @@ public class Database : Qlite.Database { QueryBuilder builder = message.select() .with(message.account_id, "=", account.id) .with(message.counterpart_id, "=", get_jid_id(query_message.counterpart)) - .with(message.counterpart_resource, "=", query_message.counterpart.resourcepart) .with(message.body, "=", query_message.body) .with(message.time, "<", (long) query_message.time.add_minutes(1).to_unix()) .with(message.time, ">", (long) query_message.time.add_minutes(-1).to_unix()); @@ -282,14 +281,25 @@ public class Database : Qlite.Database { } else { builder.with_null(message.stanza_id); } + if (query_message.counterpart.resourcepart != null) { + builder.with(message.counterpart_resource, "=", query_message.counterpart.resourcepart); + } else { + builder.with_null(message.counterpart_resource); + } return builder.count() > 0; } - public bool contains_message_by_stanza_id(string stanza_id, Account account) { - return message.select() - .with(message.stanza_id, "=", stanza_id) - .with(message.account_id, "=", account.id) - .count() > 0; + public bool contains_message_by_stanza_id(Message query_message, Account account) { + QueryBuilder builder = message.select() + .with(message.stanza_id, "=", query_message.stanza_id) + .with(message.counterpart_id, "=", get_jid_id(query_message.counterpart)) + .with(message.account_id, "=", account.id); + if (query_message.counterpart.resourcepart != null) { + builder.with(message.counterpart_resource, "=", query_message.counterpart.resourcepart); + } else { + builder.with_null(message.counterpart_resource); + } + return builder.count() > 0; } public Message? get_message_by_id(int id) { diff --git a/libdino/src/service/message_processor.vala b/libdino/src/service/message_processor.vala index 14db0132..d0e3e79a 100644 --- a/libdino/src/service/message_processor.vala +++ b/libdino/src/service/message_processor.vala @@ -171,7 +171,7 @@ public class MessageProcessor : StreamInteractionModule, Object { public override async bool run(Entities.Message message, Xmpp.MessageStanza stanza, Conversation conversation) { bool is_uuid = message.stanza_id != null && Regex.match_simple("""[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}""", message.stanza_id); - bool new_uuid_msg = is_uuid && !db.contains_message_by_stanza_id(message.stanza_id, conversation.account); + bool new_uuid_msg = is_uuid && !db.contains_message_by_stanza_id(message, conversation.account); bool new_misc_msg = !is_uuid && !db.contains_message(message, conversation.account); bool new_msg = new_uuid_msg || new_misc_msg; return !new_msg; -- cgit v1.2.3-54-g00ecf