Mercurial > dovecot > original-hg > dovecot-1.2
changeset 33:148cdb150e64 HEAD
A bit better index file truncating: Truncate it also when first hole reaches
to end of file, even if all messages weren't deleted.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 26 Aug 2002 23:15:09 +0300 |
parents | b7d7474cbcb2 |
children | a3d77e73f99b |
files | src/lib-index/mail-index.c |
diffstat | 1 files changed, 24 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index.c Mon Aug 26 23:13:57 2002 +0300 +++ b/src/lib-index/mail-index.c Mon Aug 26 23:15:09 2002 +0300 @@ -1018,7 +1018,10 @@ } else if (rec->uid < index->header->first_unseen_uid_lowwater) index->header->first_unseen_uid_lowwater = rec->uid; - index->header->seen_messages_count--; + if (index->header->seen_messages_count == 0) + index->header->flags |= MAIL_INDEX_FLAG_FSCK; + else + index->header->seen_messages_count--; } else if ((old_flags & MAIL_DELETED) == 0 && (new_flags & MAIL_DELETED)) { /* undeleted -> deleted */ @@ -1032,22 +1035,34 @@ } else if ((old_flags & MAIL_DELETED) && (new_flags & MAIL_DELETED) == 0) { /* deleted -> undeleted */ - index->header->deleted_messages_count--; + if (index->header->deleted_messages_count == 0) + index->header->flags |= MAIL_INDEX_FLAG_FSCK; + else + index->header->deleted_messages_count--; } } static int mail_index_truncate(MailIndex *index) { + /* truncate index file */ + if (ftruncate(index->fd, index->header->first_hole_position) < 0) + return FALSE; + /* update header */ index->header->first_hole_position = 0; index->header->first_hole_records = 0; - /* truncate index file */ - if (ftruncate(index->fd, sizeof(MailIndexHeader)) < 0) + if (index->header->messages_count == 0) { + /* all mail was deleted, truncate data file */ + if (!mail_index_data_reset(index->data)) + return FALSE; + } + + index->dirty_mmap = TRUE; + if (!mmap_update(index)) return FALSE; - /* truncate data file */ - return mail_index_data_reset(index->data); + return TRUE; } int mail_index_expunge(MailIndex *index, MailIndexRecord *rec, @@ -1115,8 +1130,9 @@ hdr->messages_count--; index_mark_flag_changes(index, rec, rec->msg_flags, 0); - if (hdr->messages_count == 0) { - /* all messages are deleted, truncate the index files */ + if ((hdr->first_hole_position - sizeof(MailIndexHeader)) / + sizeof(MailIndexRecord) == hdr->messages_count) { + /* the hole reaches end of file, truncate it */ (void)mail_index_truncate(index); } else { /* update deleted_space in data file */