index-sync.c revision ff635a8e19fa52bad48adf4e8fd2b6839b906a47
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenbool index_mailbox_want_full_sync(struct index_mailbox *ibox,
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen ioloop_time < ibox->sync_last_check + MAILBOX_FULL_SYNC_INTERVAL)
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainenvoid index_mailbox_set_recent_uid(struct index_mailbox *ibox, uint32_t uid)
3fe44a0df5a0bdd80c495f79cbf0e384441d6fccTimo Sirainen i_assert(seq_range_exists(&ibox->recent_flags, uid));
b8a4aab1f117f6760184ad50b1af41ba810b51f9Timo Sirainen seq_range_array_add(&ibox->recent_flags, 64, uid);
81e4bda7d481c57cd049a0a68daab733b1ca9c44Timo Sirainenvoid index_mailbox_set_recent_seq(struct index_mailbox *ibox,
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainenbool index_mailbox_is_recent(struct index_mailbox *ibox, uint32_t uid)
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen return array_is_created(&ibox->recent_flags) &&
9b61a6db87c026656f8d2ae214e4486b98a069c0Timo Sirainenvoid index_mailbox_reset_uidvalidity(struct index_mailbox *ibox)
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen /* can't trust the currently cached recent flags anymore */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenunsigned int index_mailbox_get_recent_count(struct index_mailbox *ibox)
048e40f9364fa68482bc276dd4a5d595a3d742e9Timo Sirainen range = array_get(&ibox->recent_flags, &count);
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen for (i = count; i > 0; ) {
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen /* completely invisible to this view */
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen recent_count -= range[i].seq2 - range[i].seq1 + 1;
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen /* partially invisible */
73583cff4f0ca9ee87204256ca1994adf17cb94cTimo Sirainen recent_count -= range[i].seq2 - hdr->next_uid + 1;
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainenstatic void index_mailbox_expunge_recent(struct index_mailbox *ibox,
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen mail_index_lookup_uid(ibox->view, seq1, &uid);
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen if (seq_range_array_remove(&ibox->recent_flags, uid))
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainenstatic void index_view_sync_recs_get(struct index_mailbox_sync_context *ctx)
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen while (mail_index_view_sync_next(ctx->sync_ctx, &sync_rec)) {
766115d2b2e6dbcf59f90d3b3866851cf6f740feTimo Sirainen if (!mail_index_lookup_seq_range(ctx->ibox->view,
0e5819a061034f1636b124c03a89f67d37c852b1Timo Sirainen } else if (array_is_created(&ctx->hidden_updates)) {
0e5819a061034f1636b124c03a89f67d37c852b1Timo Sirainen seq_range_array_add_range(&ctx->hidden_updates,
d5d23d5ff8b7a06d2ead489ddcf55ee8fb5ca7b6Timo Sirainen /* remove expunged messages from flag updates */
d19d3aa4eafa34b48b7d7d311c9db31e1898576aTimo Sirainen seq_range_array_remove_seq_range(&ctx->flag_updates,
8eb223b84389a7b75a39d46484f5166d221305ebTimo Sirainen seq_range_array_remove_seq_range(&ctx->hidden_updates,
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* remove flag updates from hidden updates */
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen seq_range_array_remove_seq_range(&ctx->hidden_updates,
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainenindex_mailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags,
bc7a4cf2c06702ebaedba9a7c15ce657d5856f63Timo Sirainen struct index_mailbox *ibox = (struct index_mailbox *)box;
bc7a4cf2c06702ebaedba9a7c15ce657d5856f63Timo Sirainen enum mail_index_view_sync_flags sync_flags = 0;
bc7a4cf2c06702ebaedba9a7c15ce657d5856f63Timo Sirainen ctx = i_new(struct index_mailbox_sync_context, 1);
b2e181e33889f0a4a3ba9dc23d676cbfe1bf7782Timo Sirainen if ((flags & MAILBOX_SYNC_FLAG_NO_EXPUNGES) != 0)
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen sync_flags |= MAIL_INDEX_VIEW_SYNC_FLAG_NOEXPUNGES;
aaebcf0da12df7216be69961204fa64ec24c54b9Timo Sirainen if ((flags & MAILBOX_SYNC_FLAG_FIX_INCONSISTENT) != 0) {
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen sync_flags |= MAIL_INDEX_VIEW_SYNC_FLAG_FIX_INCONSISTENT;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen mail_index_view_get_messages_count(ibox->view);
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen ctx->sync_ctx = mail_index_view_sync_begin(ibox->view, sync_flags);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen if ((flags & MAILBOX_SYNC_FLAG_NO_EXPUNGES) == 0) {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen mail_index_view_sync_get_expunges(ctx->sync_ctx,
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen ctx->expunge_pos = array_count(ctx->expunges);
b863b7e3fccf75f90f613b875f02fd1781e14e5eTimo Sirainenindex_mailbox_sync_next_expunge(struct index_mailbox_sync_context *ctx,
return TRUE;
unsigned int count;
return FALSE;
return TRUE;
return TRUE;
uid = 0;
#ifdef DEBUG
unsigned int i, count;
for (i = 0; i < count; i++) {
&delayed_expunges) < 0) {
if (seq1 != 0) {
return ret;
return FALSE;
for (i = 0; i < count1; i++) {
for (j = 0; j < count1; j++) {
if (j == count1)
return FALSE;
return TRUE;
return ret;