From 6bc6c9a5b15f82b628626232ea24d7a5ee415774 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 29 Nov 2020 10:03:47 +0100 Subject: [PATCH] Prevent message invalidation --- .../java/eu/faircode/email/DaoMessage.java | 106 ++++++++++-------- 1 file changed, 61 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index be473e2dfc..530de944e1 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -587,90 +587,97 @@ public interface DaoMessage { int updateMessage(EntityMessage message); @Query("UPDATE message SET thread = :thread" + - " WHERE account = :account AND thread = :old") + " WHERE account = :account AND thread = :old AND thread <> :thread") int updateMessageThread(long account, String old, String thread); - @Query("UPDATE message SET uid = :uid WHERE id = :id") + @Query("UPDATE message SET uid = :uid WHERE id = :id AND uid <> :uid") int setMessageUid(long id, Long uid); - @Query("UPDATE message SET msgid = :msgid WHERE id = :id") + @Query("UPDATE message SET msgid = :msgid WHERE id = :id AND msgid <> :msgid") int setMessageMsgId(long id, String msgid); - @Query("UPDATE message SET hash = :hash WHERE id = :id") + @Query("UPDATE message SET hash = :hash WHERE id = :id AND hash <> :hash") int setMessageHash(long id, String hash); - @Query("UPDATE message SET priority = :priority WHERE id = :id") + @Query("UPDATE message SET priority = :priority WHERE id = :id AND priority <> :priority") int setMessagePriority(long id, Integer priority); - @Query("UPDATE message SET importance = :importance WHERE id = :id") + @Query("UPDATE message SET importance = :importance WHERE id = :id AND importance <> :importance") int setMessageImportance(long id, Integer importance); - @Query("UPDATE message SET receipt_request = :receipt_request WHERE id = :id") + @Query("UPDATE message SET receipt_request = :receipt_request WHERE id = :id AND receipt_request <> :receipt_request") int setMessageReceiptRequest(long id, Boolean receipt_request); - @Query("UPDATE message SET notifying = :notifying WHERE id = :id") + @Query("UPDATE message SET notifying = :notifying WHERE id = :id AND notifying <> :notifying") int setMessageNotifying(long id, int notifying); - @Query("UPDATE message SET fts = :fts WHERE id = :id") + @Query("UPDATE message SET fts = :fts WHERE id = :id AND fts <> :fts") int setMessageFts(long id, boolean fts); - @Query("UPDATE message SET received = :received WHERE id = :id") + @Query("UPDATE message SET received = :received WHERE id = :id AND received <> :received") int setMessageReceived(long id, long received); - @Query("UPDATE message SET subject = :subject WHERE id = :id") + @Query("UPDATE message SET subject = :subject WHERE id = :id AND subject <> :subject") int setMessageSubject(long id, String subject); - @Query("UPDATE message SET seen = :seen WHERE id = :id") + @Query("UPDATE message SET seen = :seen WHERE id = :id AND seen <> :seen") int setMessageSeen(long id, boolean seen); - @Query("UPDATE message SET flagged = :flagged WHERE id = :id") + @Query("UPDATE message SET flagged = :flagged WHERE id = :id AND flagged <> :flagged") int setMessageFlagged(long id, boolean flagged); - @Query("UPDATE message SET answered = :answered WHERE id = :id") + @Query("UPDATE message SET answered = :answered WHERE id = :id AND answered <> :answered") int setMessageAnswered(long id, boolean answered); - @Query("UPDATE message SET keywords = :keywords WHERE id = :id") + @Query("UPDATE message SET keywords = :keywords WHERE id = :id AND keywords <> :keywords") int setMessageKeywords(long id, String keywords); - @Query("UPDATE message SET labels = :labels WHERE id = :id") + @Query("UPDATE message SET labels = :labels WHERE id = :id AND labels <> :labels") int setMessageLabels(long id, String labels); - @Query("UPDATE message SET ui_seen = :ui_seen WHERE id = :id") + @Query("UPDATE message SET ui_seen = :ui_seen WHERE id = :id AND ui_seen <> :ui_seen") int setMessageUiSeen(long id, boolean ui_seen); - @Query("UPDATE message SET ui_flagged = :ui_flagged, color = :color WHERE id = :id") + @Query("UPDATE message" + + " SET ui_flagged = :ui_flagged, color = :color" + + " WHERE id = :id" + + " AND (ui_flagged <> :ui_flagged OR color <> :color)") int setMessageUiFlagged(long id, boolean ui_flagged, Integer color); - @Query("UPDATE message SET ui_answered = :ui_answered WHERE id = :id") + @Query("UPDATE message SET ui_answered = :ui_answered WHERE id = :id AND ui_answered <> :ui_answered") int setMessageUiAnswered(long id, boolean ui_answered); - @Query("UPDATE message SET ui_hide = :ui_hide WHERE id = :id") + @Query("UPDATE message SET ui_hide = :ui_hide WHERE id = :id AND ui_hide <> :ui_hide") int setMessageUiHide(long id, Boolean ui_hide); - @Query("UPDATE message SET ui_ignored = :ui_ignored WHERE id = :id") + @Query("UPDATE message SET ui_ignored = :ui_ignored WHERE id = :id AND ui_ignored <> :ui_ignored") int setMessageUiIgnored(long id, boolean ui_ignored); - @Query("UPDATE message SET ui_busy = :busy WHERE id = :id") + @Query("UPDATE message SET ui_busy = :busy WHERE id = :id AND ui_busy <> :busy") int setMessageUiBusy(long id, Long busy); - @Query("UPDATE message SET received = :sent, sent = :sent WHERE id = :id") + @Query("UPDATE message" + + " SET received = :sent, sent = :sent" + + " WHERE id = :id" + + " AND (received <> :sent OR sent <> :sent)") int setMessageSent(long id, Long sent); - @Query("UPDATE message SET error = :error WHERE id = :id") + @Query("UPDATE message SET error = :error WHERE id = :id AND error <> :error") int setMessageError(long id, String error); - @Query("UPDATE message SET identity = :identity WHERE id = :id") + @Query("UPDATE message SET identity = :identity WHERE id = :id AND identity <> :identity") int setMessageIdentity(long id, Long identity); - @Query("UPDATE message SET revision = :revision WHERE id = :id") + @Query("UPDATE message SET revision = :revision WHERE id = :id AND revision <> :revision") int setMessageRevision(long id, Integer revision); - @Query("UPDATE message SET revisions = :revisions WHERE id = :id") + @Query("UPDATE message SET revisions = :revisions WHERE id = :id AND revisions <> :revisions") int setMessageRevisions(long id, Integer revisions); @Query("UPDATE message" + " SET content = 0, fts = 0, language = NULL, plain_only = NULL, preview = NULL" + - " WHERE id = :id") + " WHERE id = :id" + + " AND (content <> 0 OR fts <> 0 OR language IS NOT NULL OR plain_only IS NOT NULL OR preview IS NOT NULL)") int resetMessageContent(long id); @Query("UPDATE message" + @@ -680,34 +687,43 @@ public interface DaoMessage { ", plain_only = :plain_only" + ", preview = :preview" + ", warning = :warning" + - " WHERE id = :id") + " WHERE id = :id" + + " AND (content <> :content" + + " OR fts <> 0" + + " OR language <> :language" + + " OR plain_only <> :plain_only" + + " OR preview <> :preview" + + " OR warning <> :warning)") int setMessageContent(long id, boolean content, String language, Boolean plain_only, String preview, String warning); - @Query("UPDATE message SET size = :size, total = :total WHERE id = :id") + @Query("UPDATE message" + + " SET size = :size, total = :total" + + " WHERE id = :id" + + " AND (size <> :size OR total <> :total)") int setMessageSize(long id, Long size, Long total); - @Query("UPDATE message SET headers = :headers WHERE id = :id") + @Query("UPDATE message SET headers = :headers WHERE id = :id AND headers <> :headers") int setMessageHeaders(long id, String headers); - @Query("UPDATE message SET raw = :raw WHERE id = :id") + @Query("UPDATE message SET raw = :raw WHERE id = :id AND raw <> :raw") int setMessageRaw(long id, Boolean raw); - @Query("UPDATE message SET stored = :stored WHERE id = :id") + @Query("UPDATE message SET stored = :stored WHERE id = :id AND stored <> :stored") int setMessageStored(long id, long stored); - @Query("UPDATE message SET plain_only = :plain_only WHERE id = :id") + @Query("UPDATE message SET plain_only = :plain_only WHERE id = :id AND plain_only <> :plain_only") int setMessagePlainOnly(long id, boolean plain_only); - @Query("UPDATE message SET encrypt = :encrypt WHERE id = :id") + @Query("UPDATE message SET encrypt = :encrypt WHERE id = :id AND encrypt <> :encrypt") int setMessageEncrypt(long id, Integer encrypt); - @Query("UPDATE message SET ui_encrypt = :ui_encrypt WHERE id = :id") + @Query("UPDATE message SET ui_encrypt = :ui_encrypt WHERE id = :id AND ui_encrypt <> :ui_encrypt") int setMessageUiEncrypt(long id, Integer ui_encrypt); - @Query("UPDATE message SET verified = :verified WHERE id = :id") + @Query("UPDATE message SET verified = :verified WHERE id = :id AND verified <> :verified") int setMessageVerified(long id, boolean verified); - @Query("UPDATE message SET last_attempt = :last_attempt WHERE id = :id") + @Query("UPDATE message SET last_attempt = :last_attempt WHERE id = :id AND last_attempt <> :last_attempt") int setMessageLastAttempt(long id, long last_attempt); @Query("UPDATE message SET ui_ignored = 1" + @@ -718,22 +734,22 @@ public interface DaoMessage { " WHERE (:folder IS NULL AND folder.unified) OR id = :folder)") int ignoreAll(Long account, Long folder); - @Query("UPDATE message SET ui_found = 1 WHERE id = :id") + @Query("UPDATE message SET ui_found = 1 WHERE id = :id AND ui_found <> 1") int setMessageFound(long id); - @Query("UPDATE message SET ui_found = 0") + @Query("UPDATE message SET ui_found = 0 WHERE ui_found <> 0") int resetSearch(); - @Query("UPDATE message SET ui_snoozed = :wakeup WHERE id = :id") + @Query("UPDATE message SET ui_snoozed = :wakeup WHERE id = :id AND ui_snoozed <> :wakeup") int setMessageSnoozed(long id, Long wakeup); - @Query("UPDATE message SET ui_unsnoozed = :unsnoozed WHERE id = :id") + @Query("UPDATE message SET ui_unsnoozed = :unsnoozed WHERE id = :id AND ui_unsnoozed <> :unsnoozed") int setMessageUnsnoozed(long id, boolean unsnoozed); - @Query("UPDATE message SET uidl = :uidl WHERE id = :id") + @Query("UPDATE message SET uidl = :uidl WHERE id = :id AND uidl <> :uidl") int setMessageUidl(long id, String uidl); - @Query("UPDATE message SET notifying = 0") + @Query("UPDATE message SET notifying = 0 WHERE notifying <> 0") int clearNotifyingMessages(); @Query("UPDATE message SET headers = NULL" + @@ -741,7 +757,7 @@ public interface DaoMessage { " AND account IN (SELECT id FROM account WHERE pop = " + EntityAccount.TYPE_IMAP + ")") int clearMessageHeaders(); - @Query("UPDATE message SET fts = 0") + @Query("UPDATE message SET fts = 0 WHERE fts <> 0") int resetFts(); @Query("DELETE FROM message WHERE id = :id")