diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 3d1ce0b7df..58e8f4998c 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -2969,17 +2969,28 @@ class Core { private static void onPurgeFolder(Context context, EntityFolder folder) { // POP3 - DB db = DB.getInstance(context); - try { - db.beginTransaction(); + int count = 0; + int purged = 0; + do { + if (count > 0) { + try { + Thread.sleep(YIELD_DURATION); + } catch (InterruptedException ignored) { + } + } - int purged = db.message().deleteHiddenMessages(folder.id); - Log.i(folder.name + " purge count=" + purged); + DB db = DB.getInstance(context); + try { + db.beginTransaction(); + count = db.message().deleteHiddenMessages(folder.id, 100); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } + purged += count; + Log.i(folder.name + " purge count=" + count + "/" + purged); + } while (count > 0); } private static void onRule(Context context, JSONArray jargs, EntityMessage message) throws JSONException, MessagingException { diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 5664f1f9e1..bfed8867ae 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -947,10 +947,12 @@ public interface DaoMessage { " AND NOT uid IS NULL") int deleteBrowsedMessages(long folder, long before); - @Query("DELETE FROM message" + + @Query("DELETE FROM message WHERE id IN (" + + " SELECT id FROM message" + " WHERE folder = :folder" + - " AND ui_hide") - int deleteHiddenMessages(long folder); + " AND ui_hide" + + " LIMIT :limit)") + int deleteHiddenMessages(long folder, int limit); @Query("DELETE FROM message" + " WHERE folder = :folder" +