diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index f76f89833d..9f72d6eb65 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -82,6 +82,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; +import java.util.stream.IntStream; import javax.mail.Address; import javax.mail.FetchProfile; @@ -1209,9 +1210,11 @@ class Core { // Delete local messages not at remote Log.i(folder.name + " delete=" + uids.size()); - for (Long uid : uids) { - int count = db.message().deleteMessage(folder.id, uid); - Log.i(folder.name + " delete local uid=" + uid + " count=" + count); + for (int i = 0; i < uids.size(); i += SYNC_BATCH_SIZE) { + int to = Math.min(uids.size(), i + SYNC_BATCH_SIZE); + long[] isub = IntStream.range(i, to).mapToLong(l -> uids.get(l)).toArray(); + int count = db.message().deleteMessages(folder.id, isub); + Log.i(folder.name + " delete local uid=" + Arrays.toString(isub) + " count=" + count); } List rules = db.rule().getEnabledRules(folder.id); diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 65b78b997f..74dd5f4824 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -483,6 +483,11 @@ public interface DaoMessage { " AND uid = :uid") int deleteMessage(long folder, long uid); + @Query("DELETE FROM message" + + " WHERE folder = :folder" + + " AND uid IN(:uids)") + int deleteMessages(long folder, long[] uids); + @Query("DELETE FROM message" + " WHERE folder = :folder" + " AND NOT uid IS NULL")