From: Timo Sirainen Date: Wed, 29 Apr 2009 01:01:53 +0000 (-0400) Subject: Added struct mail.lookup_abort, which can be used to abort lookups that can't be... X-Git-Tag: 2.0.alpha1~891 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ebe6df72f1309135f02b6a4d2aef1e81a073f91c;p=thirdparty%2Fdovecot%2Fcore.git Added struct mail.lookup_abort, which can be used to abort lookups that can't be done using cache. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/cydir/cydir-mail.c b/src/lib-storage/index/cydir/cydir-mail.c index 548184d9ef..9e938e09cc 100644 --- a/src/lib-storage/index/cydir/cydir-mail.c +++ b/src/lib-storage/index/cydir/cydir-mail.c @@ -22,6 +22,9 @@ static int cydir_mail_stat(struct mail *mail, struct stat *st_r) { const char *path; + if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE) + return mail_set_aborted(mail); + path = cydir_mail_get_path(mail); if (stat(path, st_r) < 0) { if (errno == ENOENT) diff --git a/src/lib-storage/index/dbox/dbox-mail.c b/src/lib-storage/index/dbox/dbox-mail.c index 8af53b0804..2cf76873a5 100644 --- a/src/lib-storage/index/dbox/dbox-mail.c +++ b/src/lib-storage/index/dbox/dbox-mail.c @@ -146,6 +146,9 @@ static int dbox_mail_open(struct dbox_mail *mail, uint32_t prev_file_id = 0; bool deleted; + if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) + return mail_set_aborted(_mail); + do { if (mail->open_file == NULL) { if (dbox_mail_lookup(mbox, mbox->ibox.view, _mail->seq, diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index 66500a45ec..35561293d0 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -73,6 +73,9 @@ static int maildir_mail_stat(struct mail *mail, struct stat *st) const char *path; int fd, ret; + if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE) + return mail_set_aborted(mail); + if (data->access_part != 0 && data->stream == NULL) { /* we're going to open the mail anyway */ struct istream *input; diff --git a/src/lib-storage/index/mbox/mbox-mail.c b/src/lib-storage/index/mbox/mbox-mail.c index 14481de13e..41b8112294 100644 --- a/src/lib-storage/index/mbox/mbox-mail.c +++ b/src/lib-storage/index/mbox/mbox-mail.c @@ -41,6 +41,9 @@ static int mbox_mail_seek(struct index_mail *mail) if (mail->mail.mail.expunged || mbox->syncing) return -1; + if (mail->mail.mail.lookup_abort != MAIL_LOOKUP_ABORT_NEVER) + return mail_set_aborted(&mail->mail.mail); + if (mbox->mbox_stream != NULL && istream_raw_mbox_is_corrupted(mbox->mbox_stream)) { /* clear the corruption by forcing a full resync */ diff --git a/src/lib-storage/index/raw/raw-mail.c b/src/lib-storage/index/raw/raw-mail.c index 2a1736b196..9fc00f17b1 100644 --- a/src/lib-storage/index/raw/raw-mail.c +++ b/src/lib-storage/index/raw/raw-mail.c @@ -14,6 +14,9 @@ static int raw_mail_stat(struct mail *mail) struct raw_mailbox *mbox = (struct raw_mailbox *)mail->box; const struct stat *st; + if (mail->lookup_abort == MAIL_LOOKUP_ABORT_NOT_IN_CACHE) + return mail_set_aborted(mail); + st = i_stream_stat(mbox->input, TRUE); if (st == NULL) { mail_storage_set_critical(mail->box->storage, diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index b5d4e56de0..bcde88c8d4 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -385,6 +385,7 @@ bool mail_storage_set_error_from_errno(struct mail_storage *storage); const char *mail_generate_guid_string(void); void mail_generate_guid_128(uint8_t guid[16]); +int mail_set_aborted(struct mail *mail); void mail_set_expunged(struct mail *mail); void mailbox_set_deleted(struct mailbox *box); diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 8f84f7c320..b1f0dc6689 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -196,6 +196,15 @@ struct mailbox_sync_rec { enum mailbox_sync_type type; }; +enum mail_lookup_abort { + /* Perform everything no matter what it takes */ + MAIL_LOOKUP_ABORT_NEVER = 0, + /* Abort if the operation would require reading message header/body */ + MAIL_LOOKUP_ABORT_READ_MAIL, + /* Abort if the operation can't be done fully using cache file */ + MAIL_LOOKUP_ABORT_NOT_IN_CACHE +}; + struct mail { /* always set */ struct mailbox *box; @@ -205,6 +214,8 @@ struct mail { unsigned int expunged:1; unsigned int has_nuls:1; /* message data is known to contain NULs */ unsigned int has_no_nuls:1; /* -''- known to not contain NULs */ + + enum mail_lookup_abort lookup_abort; }; struct mail_storage_callbacks { diff --git a/src/lib-storage/mail.c b/src/lib-storage/mail.c index 3437249f29..ddc3d05c18 100644 --- a/src/lib-storage/mail.c +++ b/src/lib-storage/mail.c @@ -152,11 +152,20 @@ int mail_get_header_stream(struct mail *mail, return p->v.get_header_stream(mail, headers, stream_r); } +int mail_set_aborted(struct mail *mail) +{ + mail_storage_set_error(mail->box->storage, MAIL_ERROR_NOTPOSSIBLE, + "Mail field not cached"); + return -1; +} + int mail_get_stream(struct mail *mail, struct message_size *hdr_size, struct message_size *body_size, struct istream **stream_r) { struct mail_private *p = (struct mail_private *)mail; + if (mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) + return mail_set_aborted(mail); return p->v.get_stream(mail, hdr_size, body_size, stream_r); }