From cdb84c72b38237b04266801b2085f628d5f8c6d8 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 29 Jan 2019 15:57:05 +0000 Subject: [PATCH] Prevent duplicate operation execution --- app/src/main/java/eu/faircode/email/DaoOperation.java | 9 +++++++-- .../java/eu/faircode/email/ServiceSynchronize.java | 10 ++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DaoOperation.java b/app/src/main/java/eu/faircode/email/DaoOperation.java index bfc89b4ceb..8a9c6dd40a 100644 --- a/app/src/main/java/eu/faircode/email/DaoOperation.java +++ b/app/src/main/java/eu/faircode/email/DaoOperation.java @@ -44,7 +44,7 @@ public interface DaoOperation { ", id") LiveData> liveOperations(); - @Query("SELECT operation.* FROM operation" + + String GET_OPS_FOLDER = "SELECT operation.* FROM operation" + " JOIN folder ON folder.id = operation.folder" + " LEFT JOIN message ON message.id = operation.message" + " LEFT JOIN account ON account.id = message.account" + @@ -57,7 +57,12 @@ public interface DaoOperation { " CASE WHEN folder.account IS NULL THEN -1 ELSE 1 END" + // outbox " ELSE 0" + " END" + - ", id") + ", id"; + + @Query(GET_OPS_FOLDER) + List getOperations(long folder); + + @Query(GET_OPS_FOLDER) LiveData> liveOperations(long folder); @Query("SELECT * FROM operation ORDER BY id") diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 3bb098b58b..cd6328880a 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -1229,7 +1229,7 @@ public class ServiceSynchronize extends LifecycleService { db.folder().setFolderError(folder.id, null); } - processOperations(account, folder, operations, isession, istore, ifolder, state); + processOperations(account, folder, isession, istore, ifolder, state); } catch (Throwable ex) { Log.e(folder.name, ex); @@ -1433,13 +1433,15 @@ public class ServiceSynchronize extends LifecycleService { } private void processOperations( - EntityAccount account, EntityFolder folder, List ops, Session isession, - IMAPStore istore, IMAPFolder ifolder, ServiceState state) + EntityAccount account, EntityFolder folder, + Session isession, IMAPStore istore, IMAPFolder ifolder, + ServiceState state) throws MessagingException, JSONException, IOException { try { Log.i(folder.name + " start process"); DB db = DB.getInstance(this); + List ops = db.operation().getOperations(folder.id); Log.i(folder.name + " pending operations=" + ops.size()); for (int i = 0; i < ops.size() && state.running(); i++) { EntityOperation op = ops.get(i); @@ -3023,7 +3025,7 @@ public class ServiceSynchronize extends LifecycleService { Log.i(outbox.name + " process"); db.folder().setFolderSyncState(outbox.id, "syncing"); - processOperations(null, outbox, operations, null, null, null, state); + processOperations(null, outbox, null, null, null, state); db.folder().setFolderError(outbox.id, null); } catch (Throwable ex) { Log.e(outbox.name, ex);