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 */