Mercurial > dovecot > original-hg > dovecot-1.2
comparison src/lib-storage/index/maildir/maildir-sync.c @ 6027:3b260c6d9207 HEAD
If uidlist gets deleted but indexes not, give UIDs to messages beginning
from index's next_uid instead of from 1 and reassigning new UIDs soon.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 16 Jul 2007 01:21:44 +0300 |
parents | 272796cfee66 |
children | d911d943438e |
comparison
equal
deleted
inserted
replaced
6026:23460b525442 | 6027:3b260c6d9207 |
---|---|
620 } | 620 } |
621 | 621 |
622 return 0; | 622 return 0; |
623 } | 623 } |
624 | 624 |
625 static void maildir_sync_update_next_uid(struct maildir_mailbox *mbox) | |
626 { | |
627 const struct mail_index_header *hdr; | |
628 uint32_t uid_validity, next_uid; | |
629 | |
630 hdr = mail_index_get_header(mbox->ibox.view); | |
631 if (hdr->uid_validity == 0) | |
632 return; | |
633 | |
634 uid_validity = maildir_uidlist_get_uid_validity(mbox->uidlist); | |
635 next_uid = maildir_uidlist_get_next_uid(mbox->uidlist); | |
636 | |
637 if (uid_validity == hdr->uid_validity || uid_validity == 0) { | |
638 /* make sure uidlist's next_uid is at least as large as | |
639 index file's. typically this happens only if uidlist gets | |
640 deleted. */ | |
641 maildir_uidlist_set_uid_validity(mbox->uidlist, | |
642 hdr->uid_validity); | |
643 maildir_uidlist_set_next_uid(mbox->uidlist, | |
644 hdr->next_uid, FALSE); | |
645 } | |
646 } | |
647 | |
625 static int maildir_sync_context(struct maildir_sync_context *ctx, bool forced, | 648 static int maildir_sync_context(struct maildir_sync_context *ctx, bool forced, |
626 bool sync_last_commit) | 649 bool sync_last_commit) |
627 { | 650 { |
628 bool new_changed, cur_changed, full_rescan = FALSE; | 651 bool new_changed, cur_changed, full_rescan = FALSE; |
629 int ret; | 652 int ret; |
721 if (cur_changed) { | 744 if (cur_changed) { |
722 if (maildir_scan_dir(ctx, FALSE) < 0) | 745 if (maildir_scan_dir(ctx, FALSE) < 0) |
723 return -1; | 746 return -1; |
724 } | 747 } |
725 | 748 |
749 maildir_sync_update_next_uid(ctx->mbox); | |
750 | |
726 /* finish uidlist syncing, but keep it still locked */ | 751 /* finish uidlist syncing, but keep it still locked */ |
727 maildir_uidlist_sync_finish(ctx->uidlist_sync_ctx); | 752 maildir_uidlist_sync_finish(ctx->uidlist_sync_ctx); |
728 } | 753 } |
729 | 754 |
730 if (!ctx->mbox->syncing_commit) { | 755 if (!ctx->mbox->syncing_commit) { |