]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Added mail_set_cache_corrupted_reason()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Sun, 28 Feb 2016 18:19:45 +0000 (20:19 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Sun, 28 Feb 2016 19:02:36 +0000 (21:02 +0200)
15 files changed:
src/lib-storage/fail-mail.c
src/lib-storage/index/cydir/cydir-mail.c
src/lib-storage/index/dbox-multi/mdbox-mail.c
src/lib-storage/index/dbox-single/sdbox-mail.c
src/lib-storage/index/imapc/imapc-mail.c
src/lib-storage/index/index-mail.c
src/lib-storage/index/index-mail.h
src/lib-storage/index/maildir/maildir-mail.c
src/lib-storage/index/mbox/mbox-mail.c
src/lib-storage/index/pop3c/pop3c-mail.c
src/lib-storage/index/raw/raw-mail.c
src/lib-storage/mail-storage-private.h
src/lib-storage/mail-storage.h
src/lib-storage/mail.c
src/plugins/virtual/virtual-mail.c

index e9f2bff6df0af45f8940e64e938b03f8b4be2218..4a899bd94c788d103ef441582bfba29336735eb6 100644 (file)
@@ -228,6 +228,13 @@ fail_mail_set_cache_corrupted(struct mail *mail ATTR_UNUSED,
 {
 }
 
+static void
+fail_mail_set_cache_corrupted_reason(struct mail *mail ATTR_UNUSED,
+                                    enum mail_fetch_field field ATTR_UNUSED,
+                                    const char *reason ATTR_UNUSED)
+{
+}
+
 struct mail_vfuncs fail_mail_vfuncs = {
        NULL,
        fail_mail_free,
@@ -263,5 +270,6 @@ struct mail_vfuncs fail_mail_vfuncs = {
        NULL,
        fail_mail_expunge,
        fail_mail_set_cache_corrupted,
-       NULL
+       NULL,
+       fail_mail_set_cache_corrupted_reason
 };
index 4453e8c985312d0b25348c0419c4232e0e9db8f1..03f46eb672e3941a4c3862d480e3b8cec54d78d1 100644 (file)
@@ -165,5 +165,6 @@ struct mail_vfuncs cydir_mail_vfuncs = {
        NULL,
        index_mail_expunge,
        index_mail_set_cache_corrupted,
-       index_mail_opened
+       index_mail_opened,
+       index_mail_set_cache_corrupted_reason
 };
index 9584d1f77f65258db0ef7c1bafbb1cc3468ace6c..0b6611c22171d995d04a33fa36d15b49cdfdcf6a 100644 (file)
@@ -261,5 +261,6 @@ struct mail_vfuncs mdbox_mail_vfuncs = {
        NULL,
        index_mail_expunge,
        index_mail_set_cache_corrupted,
-       index_mail_opened
+       index_mail_opened,
+       index_mail_set_cache_corrupted_reason
 };
index ac9fa490991a0df5122fad294904e03f3c26c51b..184701ddb87387cf0d5b57f034adcb691a6ee1fa 100644 (file)
@@ -170,5 +170,6 @@ struct mail_vfuncs sdbox_mail_vfuncs = {
        NULL,
        index_mail_expunge,
        index_mail_set_cache_corrupted,
-       index_mail_opened
+       index_mail_opened,
+       index_mail_set_cache_corrupted_reason
 };
index ac4d12ea4fbec3550b079ffe4917bb4132ccd522..1923a8f66a2d2b55e8b2cb7361a604ac479eb5ea 100644 (file)
@@ -583,5 +583,6 @@ struct mail_vfuncs imapc_mail_vfuncs = {
        NULL,
        index_mail_expunge,
        index_mail_set_cache_corrupted,
-       index_mail_opened
+       index_mail_opened,
+       index_mail_set_cache_corrupted_reason
 };
index 6f168a175ab6b1d901791f2d6c8a89e33e8a53fd..51435eb9f1ee076a0cfa31ecf4abae19fb0aa26c 100644 (file)
@@ -2115,6 +2115,13 @@ void index_mail_precache(struct mail *mail)
 
 void index_mail_set_cache_corrupted(struct mail *mail,
                                    enum mail_fetch_field field)
+{
+       index_mail_set_cache_corrupted_reason(mail, field, "");
+}
+
+void index_mail_set_cache_corrupted_reason(struct mail *mail,
+                                          enum mail_fetch_field field,
+                                          const char *reason)
 {
        struct index_mail *imail = (struct index_mail *)mail;
        const char *field_name;
@@ -2157,9 +2164,15 @@ void index_mail_set_cache_corrupted(struct mail *mail,
        mail_cache_transaction_reset(mail->transaction->cache_trans);
        imail->data.no_caching = TRUE;
        imail->data.forced_no_caching = TRUE;
-       mail_cache_set_corrupted(mail->box->cache,
-                                "Broken %s for mail UID %u",
-                                field_name, mail->uid);
+       if (reason[0] == '\0') {
+               mail_cache_set_corrupted(mail->box->cache,
+                                        "Broken %s for mail UID %u",
+                                        field_name, mail->uid);
+       } else {
+               mail_cache_set_corrupted(mail->box->cache,
+                                        "Broken %s for mail UID %u: %s",
+                                        field_name, mail->uid, reason);
+       }
 }
 
 int index_mail_opened(struct mail *mail ATTR_UNUSED,
index 8bef46a81ba40e7756966ec8f59a60da86dd042c..df2c6b1858cbe0e5ab5e93d4ebe8fe5c1e66f267 100644 (file)
@@ -235,6 +235,9 @@ void index_mail_expunge(struct mail *mail);
 void index_mail_precache(struct mail *mail);
 void index_mail_set_cache_corrupted(struct mail *mail,
                                    enum mail_fetch_field field);
+void index_mail_set_cache_corrupted_reason(struct mail *mail,
+                                          enum mail_fetch_field field,
+                                          const char *reason);
 int index_mail_opened(struct mail *mail, struct istream **stream);
 int index_mail_stream_check_failure(struct index_mail *mail);
 void index_mail_stream_log_failure_for(struct index_mail *mail,
index 2f0293c75d2727780eeb9251ada61336d0913fb3..9c391276290b0c5837c9018557550283e82083f8 100644 (file)
@@ -753,15 +753,22 @@ maildir_mail_remove_sizes_from_filename(struct mail *mail,
        (void)maildir_file_do(mbox, mail->uid, do_fix_size, &ctx);
 }
 
-static void maildir_mail_set_cache_corrupted(struct mail *_mail,
-                                            enum mail_fetch_field field)
+static void maildir_mail_set_cache_corrupted_reason(struct mail *_mail,
+                                                   enum mail_fetch_field field,
+                                                   const char *reason)
 {
        if (field == MAIL_FETCH_PHYSICAL_SIZE ||
            field == MAIL_FETCH_VIRTUAL_SIZE) {
                maildir_mail_remove_sizes_from_uidlist(_mail);
                maildir_mail_remove_sizes_from_filename(_mail, field);
        }
-       index_mail_set_cache_corrupted(_mail, field);
+       index_mail_set_cache_corrupted_reason(_mail, field, reason);
+}
+
+static void maildir_mail_set_cache_corrupted(struct mail *_mail,
+                                            enum mail_fetch_field field)
+{
+       maildir_mail_set_cache_corrupted_reason(_mail, field, "");
 }
 
 struct mail_vfuncs maildir_mail_vfuncs = {
@@ -799,5 +806,6 @@ struct mail_vfuncs maildir_mail_vfuncs = {
        maildir_update_pop3_uidl,
        index_mail_expunge,
        maildir_mail_set_cache_corrupted,
-       index_mail_opened
+       index_mail_opened,
+       maildir_mail_set_cache_corrupted_reason
 };
index 38487c388268362c2044e20ed1585e56f8c82217..35429194293ee62560bcf332c676805d83e4139b 100644 (file)
@@ -446,5 +446,6 @@ struct mail_vfuncs mbox_mail_vfuncs = {
        NULL,
        index_mail_expunge,
        index_mail_set_cache_corrupted,
-       index_mail_opened
+       index_mail_opened,
+       index_mail_set_cache_corrupted_reason
 };
index 04350e5869ae1622d06ddbd32af3c725090904f8..fe6643ee616a6c581ffa3bb1a3b725befb052ae5 100644 (file)
@@ -302,5 +302,6 @@ struct mail_vfuncs pop3c_mail_vfuncs = {
        NULL,
        index_mail_expunge,
        index_mail_set_cache_corrupted,
-       index_mail_opened
+       index_mail_opened,
+       index_mail_set_cache_corrupted_reason
 };
index 5c0b4c6da3ba5f1a5ae2ab8761881ec4f2ae877c..4cdeafdb738cdca8a8375c50abf25dddeb9a7136 100644 (file)
@@ -149,5 +149,6 @@ struct mail_vfuncs raw_mail_vfuncs = {
        NULL,
        index_mail_expunge,
        index_mail_set_cache_corrupted,
-       index_mail_opened
+       index_mail_opened,
+       index_mail_set_cache_corrupted_reason
 };
index 55839192759b3127d3e927c77e83e7f612f872c2..d1f1a8250c80789e405ef472899f6e2a1387db89 100644 (file)
@@ -446,6 +446,9 @@ struct mail_vfuncs {
        void (*set_cache_corrupted)(struct mail *mail,
                                    enum mail_fetch_field field);
        int (*istream_opened)(struct mail *mail, struct istream **input);
+       void (*set_cache_corrupted_reason)(struct mail *mail,
+                                          enum mail_fetch_field field,
+                                          const char *reason);
 };
 
 union mail_module_context {
index 6f2fe75411429db1f9356d0c72fa013e4394f9a2..4c99849e50b03a8543ea4e2d995aee59d063b4f4 100644 (file)
@@ -897,6 +897,9 @@ void mail_expunge(struct mail *mail);
 void mail_precache(struct mail *mail);
 /* Mark a cached field corrupted and have it recalculated. */
 void mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field);
+void mail_set_cache_corrupted_reason(struct mail *mail,
+                                    enum mail_fetch_field field,
+                                    const char *reason);
 
 /* Return 128 bit GUID using input string. If guid is already 128 bit hex
    encoded, it's returned as-is. Otherwise SHA1 sum is taken and its last
index 4da8ffd5d66c101bf7db3d14512078388625f7db..4be8f73c1a62ddba234b6f9ad497efa7a6f3f714 100644 (file)
@@ -403,10 +403,23 @@ void mail_precache(struct mail *mail)
 }
 
 void mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field)
+{
+       mail_set_cache_corrupted_reason(mail, field, "");
+}
+
+void mail_set_cache_corrupted_reason(struct mail *mail,
+                                    enum mail_fetch_field field,
+                                    const char *reason)
 {
        struct mail_private *p = (struct mail_private *)mail;
 
-       p->v.set_cache_corrupted(mail, field);
+       /* FIXME: v2.3: rename set_cache_corrupted_reason() to just
+          set_cache_corrupted(). we have two here for backwards API
+          compatibility. */
+       if (p->v.set_cache_corrupted_reason != NULL)
+               p->v.set_cache_corrupted_reason(mail, field, reason);
+       else
+               p->v.set_cache_corrupted(mail, field);
 }
 
 void mail_generate_guid_128_hash(const char *guid, guid_128_t guid_128_r)
index f9a61be7e3c7f5dbec64e45424486a8302f6d331..b135e8442a19ca7a5f4a07151ac2cd03c7ee1916 100644 (file)
@@ -468,14 +468,22 @@ static void virtual_mail_expunge(struct mail *mail)
 }
 
 static void
-virtual_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field)
+virtual_mail_set_cache_corrupted_reason(struct mail *mail,
+                                       enum mail_fetch_field field,
+                                       const char *reason)
 {
        struct virtual_mail *vmail = (struct virtual_mail *)mail;
        struct mail *backend_mail;
 
        if (backend_mail_get(vmail, &backend_mail) < 0)
                return;
-       mail_set_cache_corrupted(backend_mail, field);
+       mail_set_cache_corrupted_reason(backend_mail, field, reason);
+}
+
+static void
+virtual_mail_set_cache_corrupted(struct mail *mail, enum mail_fetch_field field)
+{
+       virtual_mail_set_cache_corrupted_reason(mail, field, "");
 }
 
 struct mail_vfuncs virtual_mail_vfuncs = {
@@ -513,5 +521,6 @@ struct mail_vfuncs virtual_mail_vfuncs = {
        virtual_mail_update_pop3_uidl,
        virtual_mail_expunge,
        virtual_mail_set_cache_corrupted,
-       NULL
+       NULL,
+       virtual_mail_set_cache_corrupted_reason
 };