From: AsamK Date: Sat, 8 Oct 2022 14:21:29 +0000 (+0200) Subject: Do recipient merge in one transaction X-Git-Tag: v0.11.4~18 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/7ab013cee96600cf46836c562648f1cc4cdb6732?ds=sidebyside Do recipient merge in one transaction --- diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index 547607b3..880089e7 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -88,6 +88,7 @@ import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.file.Files; import java.security.SecureRandom; +import java.sql.Connection; import java.sql.SQLException; import java.util.Base64; import java.util.Comparator; @@ -408,9 +409,11 @@ public class SignalAccount implements Closeable { } } - private void mergeRecipients(RecipientId recipientId, RecipientId toBeMergedRecipientId) { + private void mergeRecipients( + final Connection connection, RecipientId recipientId, RecipientId toBeMergedRecipientId + ) throws SQLException { getMessageCache().mergeRecipients(recipientId, toBeMergedRecipientId); - getGroupStore().mergeRecipients(recipientId, toBeMergedRecipientId); + getGroupStore().mergeRecipients(connection, recipientId, toBeMergedRecipientId); } public void removeRecipient(final RecipientId recipientId) { diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java index 538ff294..ece7cde2 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java @@ -192,7 +192,9 @@ public class GroupStore { return Stream.concat(getGroupsV2().stream(), getGroupsV1().stream()).toList(); } - public void mergeRecipients(final RecipientId recipientId, final RecipientId toBeMergedRecipientId) { + public void mergeRecipients( + final Connection connection, final RecipientId recipientId, final RecipientId toBeMergedRecipientId + ) throws SQLException { final var sql = ( """ UPDATE OR REPLACE %s @@ -200,17 +202,13 @@ public class GroupStore { WHERE recipient_id = ? """ ).formatted(TABLE_GROUP_V1_MEMBER); - try (final var connection = database.getConnection()) { - try (final var statement = connection.prepareStatement(sql)) { - statement.setLong(1, recipientId.id()); - statement.setLong(2, toBeMergedRecipientId.id()); - final var updatedRows = statement.executeUpdate(); - if (updatedRows > 0) { - logger.info("Updated {} group members when merging recipients", updatedRows); - } + try (final var statement = connection.prepareStatement(sql)) { + statement.setLong(1, recipientId.id()); + statement.setLong(2, toBeMergedRecipientId.id()); + final var updatedRows = statement.executeUpdate(); + if (updatedRows > 0) { + logger.info("Updated {} group members when merging recipients", updatedRows); } - } catch (SQLException e) { - throw new RuntimeException("Failed update group store", e); } } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java index 247a71eb..f932d497 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java @@ -569,8 +569,8 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re } if (pair.second().isPresent()) { - recipientMergeHandler.mergeRecipients(pair.first(), pair.second().get()); try (final var connection = database.getConnection()) { + recipientMergeHandler.mergeRecipients(connection, pair.first(), pair.second().get()); deleteRecipient(connection, pair.second().get()); } catch (SQLException e) { throw new RuntimeException("Failed update recipient store", e); @@ -931,7 +931,9 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re public interface RecipientMergeHandler { - void mergeRecipients(RecipientId recipientId, RecipientId toBeMergedRecipientId); + void mergeRecipients( + final Connection connection, RecipientId recipientId, RecipientId toBeMergedRecipientId + ) throws SQLException; } private record RecipientWithAddress(RecipientId id, RecipientAddress address) {}