[evolution-data-server] [IMAPx] Avoid unneeded full flags folder update when no changes made



commit 0aa2a5257c00e8829122d25527be2dd0af76cb7e
Author: Milan Crha <mcrha redhat com>
Date:   Fri Feb 10 16:20:40 2017 +0100

    [IMAPx] Avoid unneeded full flags folder update when no changes made
    
    There had been a check whether folder content changed, but the current
    values were not properly saved and also the UNSEEN response from the SELECT
    command was used like being a number of unseen messages, but it's
    a sequence number of the first unseen message instead.

 src/camel/providers/imapx/camel-imapx-server.c |   48 +++++++++++++++---------
 src/camel/providers/imapx/camel-imapx-utils.c  |    5 ++-
 src/camel/providers/imapx/camel-imapx-utils.h  |    1 +
 3 files changed, 35 insertions(+), 19 deletions(-)
---
diff --git a/src/camel/providers/imapx/camel-imapx-server.c b/src/camel/providers/imapx/camel-imapx-server.c
index d8900b7..a5b1e68 100644
--- a/src/camel/providers/imapx/camel-imapx-server.c
+++ b/src/camel/providers/imapx/camel-imapx-server.c
@@ -1773,7 +1773,7 @@ imapx_untagged_ok_no_bad (CamelIMAPXServer *is,
 
        is->priv->context->sinfo = imapx_parse_status (
                CAMEL_IMAPX_INPUT_STREAM (input_stream),
-               mailbox, cancellable, error);
+               mailbox, TRUE, cancellable, error);
 
        g_clear_object (&mailbox);
 
@@ -2364,7 +2364,7 @@ imapx_completion (CamelIMAPXServer *is,
 
        ic->status = imapx_parse_status (
                CAMEL_IMAPX_INPUT_STREAM (input_stream),
-               mailbox, cancellable, error);
+               mailbox, FALSE, cancellable, error);
 
        g_clear_object (&mailbox);
 
@@ -5053,13 +5053,13 @@ camel_imapx_server_refresh_info_sync (CamelIMAPXServer *is,
        uidnext = camel_imapx_mailbox_get_uidnext (mailbox);
        uidvalidity = camel_imapx_mailbox_get_uidvalidity (mailbox);
        highestmodseq = camel_imapx_mailbox_get_highestmodseq (mailbox);
-       total = camel_folder_summary_count (camel_folder_get_folder_summary (folder));
+       total = camel_folder_summary_count (CAMEL_FOLDER_SUMMARY (imapx_summary));
 
        need_rescan =
                (uidvalidity > 0 && uidvalidity != imapx_summary->validity) ||
                total != messages ||
                imapx_summary->uidnext != uidnext ||
-               camel_folder_summary_get_unread_count (camel_folder_get_folder_summary (folder)) != unseen ||
+               camel_folder_summary_get_unread_count (CAMEL_FOLDER_SUMMARY (imapx_summary)) != unseen ||
                imapx_summary->modseq != highestmodseq;
 
        if (!need_rescan) {
@@ -5073,9 +5073,8 @@ camel_imapx_server_refresh_info_sync (CamelIMAPXServer *is,
        }
 
        if (is->priv->use_qresync && imapx_summary->modseq > 0 && uidvalidity > 0) {
-               imapx_summary->modseq = highestmodseq;
                if (total != messages ||
-                   camel_folder_summary_get_unread_count (camel_folder_get_folder_summary (folder)) != 
unseen ||
+                   camel_folder_summary_get_unread_count (CAMEL_FOLDER_SUMMARY (imapx_summary)) != unseen ||
                    imapx_summary->modseq != highestmodseq) {
                        c (
                                is->priv->tagprefix,
@@ -5083,18 +5082,24 @@ camel_imapx_server_refresh_info_sync (CamelIMAPXServer *is,
                                "total %u / %u, unread %u / %u, modseq %"
                                G_GUINT64_FORMAT " / %" G_GUINT64_FORMAT "\n",
                                total, messages,
-                               camel_folder_summary_get_unread_count (camel_folder_get_folder_summary 
(folder)),
+                               camel_folder_summary_get_unread_count (CAMEL_FOLDER_SUMMARY (imapx_summary)),
                                unseen,
                                imapx_summary->modseq,
                                highestmodseq);
                } else {
+                       imapx_summary->uidnext = uidnext;
+
+                       camel_folder_summary_touch (CAMEL_FOLDER_SUMMARY (imapx_summary));
+                       camel_folder_summary_save (CAMEL_FOLDER_SUMMARY (imapx_summary), NULL);
+                       imapx_update_store_summary (folder);
+
                        c (
                                is->priv->tagprefix,
                                "OK, after QRESYNC we're still in sync. "
                                "total %u / %u, unread %u / %u, modseq %"
                                G_GUINT64_FORMAT " / %" G_GUINT64_FORMAT "\n",
                                total, messages,
-                               camel_folder_summary_get_unread_count (camel_folder_get_folder_summary 
(folder)),
+                               camel_folder_summary_get_unread_count (CAMEL_FOLDER_SUMMARY (imapx_summary)),
                                unseen,
                                imapx_summary->modseq,
                                highestmodseq);
@@ -5116,7 +5121,7 @@ camel_imapx_server_refresh_info_sync (CamelIMAPXServer *is,
                uidl = 1;
        }
 
-       camel_folder_summary_prepare_fetch_all (camel_folder_get_folder_summary (folder), NULL);
+       camel_folder_summary_prepare_fetch_all (CAMEL_FOLDER_SUMMARY (imapx_summary), NULL);
 
        known_uids = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) camel_pstring_free, 
NULL);
 
@@ -5124,6 +5129,13 @@ camel_imapx_server_refresh_info_sync (CamelIMAPXServer *is,
        if (success && uidl != 1)
                success = imapx_server_fetch_changes (is, mailbox, folder, known_uids, 0, uidl, cancellable, 
error);
 
+       if (success) {
+               imapx_summary->modseq = highestmodseq;
+               imapx_summary->uidnext = uidnext;
+
+               camel_folder_summary_touch (CAMEL_FOLDER_SUMMARY (imapx_summary));
+       }
+
        g_mutex_lock (&is->priv->changes_lock);
 
        changes = is->priv->changes;
@@ -5136,9 +5148,9 @@ camel_imapx_server_refresh_info_sync (CamelIMAPXServer *is,
                GPtrArray *array;
                gint ii;
 
-               camel_folder_summary_lock (camel_folder_get_folder_summary (folder));
+               camel_folder_summary_lock (CAMEL_FOLDER_SUMMARY (imapx_summary));
 
-               array = camel_folder_summary_get_array (camel_folder_get_folder_summary (folder));
+               array = camel_folder_summary_get_array (CAMEL_FOLDER_SUMMARY (imapx_summary));
                for (ii = 0; array && ii < array->len; ii++) {
                        const gchar *uid = array->pdata[ii];
 
@@ -5151,11 +5163,11 @@ camel_imapx_server_refresh_info_sync (CamelIMAPXServer *is,
                        }
                }
 
-               camel_folder_summary_unlock (camel_folder_get_folder_summary (folder));
+               camel_folder_summary_unlock (CAMEL_FOLDER_SUMMARY (imapx_summary));
 
                if (removed != NULL) {
-                       camel_folder_summary_remove_uids (camel_folder_get_folder_summary (folder), removed);
-                       camel_folder_summary_touch (camel_folder_get_folder_summary (folder));
+                       camel_folder_summary_remove_uids (CAMEL_FOLDER_SUMMARY (imapx_summary), removed);
+                       camel_folder_summary_touch (CAMEL_FOLDER_SUMMARY (imapx_summary));
 
                        /* Shares UIDs with the 'array'. */
                        g_list_free (removed);
@@ -5164,11 +5176,11 @@ camel_imapx_server_refresh_info_sync (CamelIMAPXServer *is,
                camel_folder_summary_free_array (array);
        }
 
-       if (camel_folder_change_info_changed (changes)) {
-               camel_folder_summary_save (camel_folder_get_folder_summary (folder), NULL);
-               imapx_update_store_summary (folder);
+       camel_folder_summary_save (CAMEL_FOLDER_SUMMARY (imapx_summary), NULL);
+       imapx_update_store_summary (folder);
+
+       if (camel_folder_change_info_changed (changes))
                camel_folder_changed (folder, changes);
-       }
 
        camel_folder_change_info_free (changes);
 
diff --git a/src/camel/providers/imapx/camel-imapx-utils.c b/src/camel/providers/imapx/camel-imapx-utils.c
index 5c3119e..dc5188f 100644
--- a/src/camel/providers/imapx/camel-imapx-utils.c
+++ b/src/camel/providers/imapx/camel-imapx-utils.c
@@ -2405,6 +2405,7 @@ imapx_parse_status_unseen (CamelIMAPXInputStream *stream,
 struct _status_info *
 imapx_parse_status (CamelIMAPXInputStream *stream,
                     CamelIMAPXMailbox *mailbox,
+                   gboolean is_ok_no_bad,
                     GCancellable *cancellable,
                     GError **error)
 {
@@ -2517,7 +2518,9 @@ imapx_parse_status (CamelIMAPXInputStream *stream,
                                break;
 
                        case IMAPX_UNSEEN:
-                               success = imapx_parse_status_unseen (
+                               /* Ignore UNSEEN in OK/NO/BAD, because it's not count of unseen
+                                  messages, but the sequence number of the first unseen message. */
+                               success = is_ok_no_bad || imapx_parse_status_unseen (
                                        stream, mailbox, cancellable, error);
                                break;
 
diff --git a/src/camel/providers/imapx/camel-imapx-utils.h b/src/camel/providers/imapx/camel-imapx-utils.h
index f9970d8..75f4808 100644
--- a/src/camel/providers/imapx/camel-imapx-utils.h
+++ b/src/camel/providers/imapx/camel-imapx-utils.h
@@ -301,6 +301,7 @@ struct _status_info {
 struct _status_info *
                imapx_parse_status              (CamelIMAPXInputStream *stream,
                                                 CamelIMAPXMailbox *mailbox,
+                                                gboolean is_ok_no_bad,
                                                 GCancellable *cancellable,
                                                 GError **error);
 struct _status_info *


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