[geary/wip/725929-db-opt: 2/2] Tweak of issue #1
- From: Jim Nelson <jnelson src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/725929-db-opt: 2/2] Tweak of issue #1
- Date: Sat, 8 Mar 2014 03:04:39 +0000 (UTC)
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]