From d9dd4843bbd1166503a9fd83fe2482de6334707a Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 19 Jan 2023 22:00:37 +0100 Subject: [PATCH] Cloud sync: triggers for account/identity last modified time --- .../eu/faircode/email/AdapterAccount.java | 3 ++- .../java/eu/faircode/email/CloudSync.java | 12 +++++++--- app/src/main/java/eu/faircode/email/DB.java | 23 +++++++++++++++++++ .../java/eu/faircode/email/EntityAccount.java | 4 +++- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterAccount.java b/app/src/main/java/eu/faircode/email/AdapterAccount.java index f370a893d7..dd75da777d 100644 --- a/app/src/main/java/eu/faircode/email/AdapterAccount.java +++ b/app/src/main/java/eu/faircode/email/AdapterAccount.java @@ -258,7 +258,8 @@ public class AdapterAccount extends RecyclerView.Adapter last) @@ -189,8 +192,11 @@ public class CloudSync { boolean ipassword = (account.auth_type == ServiceAuthenticator.AUTH_TYPE_PASSWORD); if (iexisting == null || - EntityIdentity.areEqual(identity, iexisting, ipassword, false)) + !EntityIdentity.areEqual(identity, iexisting, ipassword, false)) { Helper.writeText(ifile, identity.toJSON().toString()); + if (identity.last_modified != null) + ifile.setLastModified(identity.last_modified); + } long itime = ifile.lastModified(); if (itime > last) diff --git a/app/src/main/java/eu/faircode/email/DB.java b/app/src/main/java/eu/faircode/email/DB.java index eb643daaee..ae48686311 100644 --- a/app/src/main/java/eu/faircode/email/DB.java +++ b/app/src/main/java/eu/faircode/email/DB.java @@ -139,6 +139,7 @@ public abstract class DB extends RoomDatabase { "cache_size", "cache_spill", "soft_heap_limit", "hard_heap_limit", "mmap_size", "foreign_keys", "auto_vacuum", + "recursive_triggers", "compile_options" )); @@ -470,6 +471,11 @@ public abstract class DB extends RoomDatabase { cursor.moveToNext(); // required } + Log.i("Set PRAGMA recursive_triggers=off"); + try (Cursor cursor = db.query("PRAGMA recursive_triggers=off;")) { + cursor.moveToNext(); // required + } + // https://www.sqlite.org/pragma.html for (String pragma : DB_PRAGMAS) if (!"compile_options".equals(pragma) || BuildConfig.DEBUG) @@ -486,6 +492,9 @@ public abstract class DB extends RoomDatabase { if (BuildConfig.DEBUG && false) { db.execSQL("DROP TRIGGER IF EXISTS `attachment_insert`"); db.execSQL("DROP TRIGGER IF EXISTS `attachment_delete`"); + + db.execSQL("DROP TRIGGER IF EXISTS `account_update`"); + db.execSQL("DROP TRIGGER IF EXISTS `identity_update`"); } createTriggers(db); @@ -547,6 +556,20 @@ public abstract class DB extends RoomDatabase { " AND OLD.encryption IS NULL" + " AND NOT ((OLD.disposition = 'inline' OR (OLD.related IS NOT 0 AND OLD.cid IS NOT NULL)) AND OLD.type IN (" + images + "));" + " END"); + + db.execSQL("CREATE TRIGGER IF NOT EXISTS account_update" + + " AFTER UPDATE ON account" + + " BEGIN" + + " UPDATE account SET last_modified = strftime('%s') * 1000" + + " WHERE (NEW.auth_type = " + AUTH_TYPE_PASSWORD + " OR OLD.password = NEW.password);" + + " END"); + + db.execSQL("CREATE TRIGGER IF NOT EXISTS identity_update" + + " AFTER UPDATE ON identity" + + " BEGIN" + + " UPDATE identity SET last_modified = strftime('%s') * 1000" + + " WHERE (NEW.auth_type = " + AUTH_TYPE_PASSWORD + " OR OLD.password = NEW.password);" + + " END"); } private static void logMigration(int startVersion, int endVersion) { diff --git a/app/src/main/java/eu/faircode/email/EntityAccount.java b/app/src/main/java/eu/faircode/email/EntityAccount.java index f519b96982..6c4f64ade4 100644 --- a/app/src/main/java/eu/faircode/email/EntityAccount.java +++ b/app/src/main/java/eu/faircode/email/EntityAccount.java @@ -475,7 +475,9 @@ public class EntityAccount extends EntityOrder implements Serializable { (!state || Objects.equals(a1.max_size, other.max_size)) && (!state || Objects.equals(a1.capabilities, other.capabilities)) && (!state || Objects.equals(a1.capability_idle, other.capability_idle)) && - (!state || Objects.equals(a1.capability_utf8, other.capability_utf8))); + (!state || Objects.equals(a1.capability_utf8, other.capability_utf8)) && + (!state || Objects.equals(a1.capability_uidl, other.capability_uidl)) && + (!state || Objects.equals(a1.last_modified, other.last_modified))); } @Override