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) {