[geary/wip/725929-db-opt: 2/2] Tweak of issue #1



commit b95bc77b0f37cbe466c24368ea26c91db410c644
Author: Jim Nelson <jim yorba org>
Date:   Fri Mar 7 19:02:00 2014 -0800

    Tweak of issue #1
    
    Use IN rather than successive OR's to avoid generating compound
    SELECT queries too long for SQLite to process.

 src/engine/db/db-result.vala                       |    3 +++
 src/engine/imap-db/imap-db-folder.vala             |   14 +++++++-------
 .../imap-engine-account-synchronizer.vala          |    6 ++++++
 3 files changed, 16 insertions(+), 7 deletions(-)
---
diff --git a/src/engine/db/db-result.vala b/src/engine/db/db-result.vala
index f676880..baecd30 100644
--- a/src/engine/db/db-result.vala
+++ b/src/engine/db/db-result.vala
@@ -35,7 +35,10 @@ public class Geary.Db.Result : Geary.Db.Context {
         check_cancelled("Result.next", cancellable);
         
         if (!finished) {
+            Timer timer = new Timer();
             finished = throw_on_error("Result.next", statement.stmt.step(), statement.sql) != Sqlite.ROW;
+            if (timer.elapsed() > 1.0)
+                debug("\n\nDB QUERY STEP \"%s\"\nelapsed=%lf\n\n", statement.sql, timer.elapsed());
             
             log(finished ? "NO ROW" : "ROW");
         }
diff --git a/src/engine/imap-db/imap-db-folder.vala b/src/engine/imap-db/imap-db-folder.vala
index 759228c..85d554f 100644
--- a/src/engine/imap-db/imap-db-folder.vala
+++ b/src/engine/imap-db/imap-db-folder.vala
@@ -2024,7 +2024,7 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
         update_stmt.bind_int(0, to_add);
         update_stmt.bind_int(1, to_add);
         update_stmt.bind_rowid(2, folder_id);
-            
+        
         update_stmt.exec(cancellable);
     }
     
@@ -2078,13 +2078,13 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
         StringBuilder sql = new StringBuilder("""
             SELECT message_id, ordering, remove_marker
             FROM MessageLocationTable
-            WHERE (
+            WHERE message_id IN (
         """);
         bool first = true;
         foreach (ImapDB.EmailIdentifier id in ids) {
             if (!first)
-                sql.append(" OR ");
-            sql.append_printf("message_id = '%s' ", id.message_id.to_string());
+                sql.append(",");
+            sql.append_printf(id.message_id.to_string());
             
             first = false;
         }
@@ -2127,13 +2127,13 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
         StringBuilder sql = new StringBuilder("""
             SELECT message_id, ordering, remove_marker
             FROM MessageLocationTable
-            WHERE (
+            WHERE ordering IN (
         """);
         bool first = true;
         foreach (Imap.UID uid in uids) {
             if (!first)
-                sql.append(" OR ");
-            sql.append_printf("ordering = '%s' ", uid.to_string());
+                sql.append(",");
+            sql.append(uid.value.to_string());
             
             first = false;
         }
diff --git a/src/engine/imap-engine/imap-engine-account-synchronizer.vala 
b/src/engine/imap-engine/imap-engine-account-synchronizer.vala
index 7b22345..d979754 100644
--- a/src/engine/imap-engine/imap-engine-account-synchronizer.vala
+++ b/src/engine/imap-engine/imap-engine-account-synchronizer.vala
@@ -131,6 +131,12 @@ private class Geary.ImapEngine.AccountSynchronizer : Geary.BaseObject {
             if (imap_folder == null)
                 continue;
             
+            // if considering folder not because it's available (i.e. because its contents changed),
+            // and the folder is open, don't process it; MinimalFolder will take care of changes as
+            // they occur, in order to remain synchronized
+            if (imap_folder.get_open_state() != Folder.OpenState.CLOSED)
+                continue;
+            
             // don't requeue the currently processing folder
             if (imap_folder != current_folder)
                 bg_queue.send(imap_folder);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]