Mercurial > dovecot > original-hg > dovecot-1.2
changeset 142:524e78f870a2 HEAD
index_expunge_seek_first() now separates between "not found" and "failure".
also updated it's error message to be more verbose.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 04 Sep 2002 01:51:20 +0300 |
parents | 4d657b92448f |
children | 0bb796d35d2a |
files | src/lib-storage/index/index-expunge.c src/lib-storage/index/index-storage.h src/lib-storage/index/maildir/maildir-expunge.c src/lib-storage/index/mbox/mbox-expunge.c |
diffstat | 4 files changed, 27 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/index-expunge.c Wed Sep 04 00:21:40 2002 +0300 +++ b/src/lib-storage/index/index-expunge.c Wed Sep 04 01:51:20 2002 +0300 @@ -3,36 +3,42 @@ #include "lib.h" #include "index-storage.h" -MailIndexRecord *index_expunge_seek_first(IndexMailbox *ibox, - unsigned int *seq) +int index_expunge_seek_first(IndexMailbox *ibox, unsigned int *seq, + MailIndexRecord **rec) { MailIndexHeader *hdr; - MailIndexRecord *rec; + + i_assert(ibox->index->lock_type == MAIL_LOCK_EXCLUSIVE); hdr = ibox->index->get_header(ibox->index); if (hdr->deleted_messages_count == 0) - return NULL; + return FALSE; /* find mails with DELETED flag and expunge them */ if (hdr->first_deleted_uid_lowwater > 1) { - rec = hdr->first_deleted_uid_lowwater >= hdr->next_uid ? NULL : + *rec = hdr->first_deleted_uid_lowwater >= hdr->next_uid ? NULL : ibox->index->lookup_uid_range(ibox->index, hdr->first_deleted_uid_lowwater, hdr->next_uid-1); - if (rec == NULL) { - i_warning("index header's deleted_messages_count or " - "first_deleted_uid_lowwater is invalid."); - INDEX_MARK_CORRUPTED(ibox->index); - return NULL; + if (*rec == NULL) { + mail_storage_set_critical(ibox->box.storage, + "index header's deleted_messages_count (%u) " + "or first_deleted_uid_lowwater (%u) " + "is invalid.", hdr->deleted_messages_count, + hdr->first_deleted_uid_lowwater); + + /* fsck should be enough to fix it */ + ibox->index->header->flags |= MAIL_INDEX_FLAG_FSCK; + return FALSE; } else { - *seq = ibox->index->get_sequence(ibox->index, rec); + *seq = ibox->index->get_sequence(ibox->index, *rec); } } else { - rec = ibox->index->lookup(ibox->index, 1); + *rec = ibox->index->lookup(ibox->index, 1); *seq = 1; } - return rec; + return TRUE; } int index_storage_expunge(Mailbox *box)
--- a/src/lib-storage/index/index-storage.h Wed Sep 04 00:21:40 2002 +0300 +++ b/src/lib-storage/index/index-storage.h Wed Sep 04 01:51:20 2002 +0300 @@ -39,8 +39,8 @@ int index_mailbox_fix_custom_flags(IndexMailbox *ibox, MailFlags *flags, const char *custom_flags[]); -MailIndexRecord *index_expunge_seek_first(IndexMailbox *ibox, - unsigned int *seq); +int index_expunge_seek_first(IndexMailbox *ibox, unsigned int *seq, + MailIndexRecord **rec); int index_storage_save_into_fd(MailStorage *storage, int fd, const char *path, IOBuffer *buf, size_t data_size);
--- a/src/lib-storage/index/maildir/maildir-expunge.c Wed Sep 04 00:21:40 2002 +0300 +++ b/src/lib-storage/index/maildir/maildir-expunge.c Wed Sep 04 01:51:20 2002 +0300 @@ -36,7 +36,9 @@ MailIndexRecord *rec; unsigned int seq, uid; - rec = index_expunge_seek_first(ibox, &seq); + if (!index_expunge_seek_first(ibox, &seq, &rec)) + return FALSE; + while (rec != NULL) { if (rec->msg_flags & MAIL_DELETED) { /* save UID before deletion */
--- a/src/lib-storage/index/mbox/mbox-expunge.c Wed Sep 04 00:21:40 2002 +0300 +++ b/src/lib-storage/index/mbox/mbox-expunge.c Wed Sep 04 01:51:20 2002 +0300 @@ -13,7 +13,9 @@ blocks. probably better to do it in small blocks than to memmove() megabytes of data.. */ - rec = index_expunge_seek_first(ibox, &seq); + if (!index_expunge_seek_first(ibox, &seq, &rec)) + return FALSE; + while (rec != NULL) { if (rec->msg_flags & MAIL_DELETED) { /* save UID before deletion */