Mercurial > dovecot > original-hg > dovecot-1.2
view src/lib-storage/index/index-sync.c @ 1947:777da553d1d3 HEAD
Recent-flag should work now
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 01 May 2004 21:30:52 +0300 |
parents | 35a947481130 |
children | 9c159272f721 |
line wrap: on
line source
/* Copyright (C) 2002 Timo Sirainen */ #include "lib.h" #include "index-storage.h" int index_storage_sync(struct mailbox *box, enum mailbox_sync_flags flags) { struct index_mailbox *ibox = (struct index_mailbox *)box; struct mail_index_view_sync_ctx *ctx; struct mail_full_flags full_flags; const struct mail_index_record *rec; struct mail_index_sync_rec sync; struct mail_storage_callbacks *sc; const uint32_t *expunges; size_t i, expunges_count; void *sc_context; enum mail_index_sync_type sync_mask; uint32_t seq, new_count, recent_count; int ret, appends; sync_mask = MAIL_INDEX_SYNC_MASK_ALL; if ((flags & MAILBOX_SYNC_FLAG_NO_EXPUNGES) != 0) sync_mask &= ~MAIL_INDEX_SYNC_TYPE_EXPUNGE; if (mail_index_view_sync_begin(ibox->view, sync_mask, &ctx) < 0) { mail_storage_set_index_error(ibox); return -1; } if ((flags & MAILBOX_SYNC_FLAG_NO_EXPUNGES) != 0) { expunges_count = 0; expunges = NULL; } else { expunges = mail_index_view_sync_get_expunges(ctx, &expunges_count); } sc = ibox->storage->callbacks; sc_context = ibox->storage->callback_context; appends = FALSE; memset(&full_flags, 0, sizeof(full_flags)); while ((ret = mail_index_view_sync_next(ctx, &sync)) > 0) { switch (sync.type) { case MAIL_INDEX_SYNC_TYPE_APPEND: appends = TRUE; break; case MAIL_INDEX_SYNC_TYPE_EXPUNGE: /* later */ break; case MAIL_INDEX_SYNC_TYPE_FLAGS: if (sc->update_flags == NULL) break; /* FIXME: hide the flag updates for expunged messages */ for (seq = sync.seq1; seq <= sync.seq2; seq++) { if (mail_index_lookup(ibox->view, seq, &rec) < 0) { ret = -1; break; } full_flags.flags = rec->flags; // FIXME sc->update_flags(&ibox->box, seq, &full_flags, sc_context); } break; } } if (ret < 0) mail_storage_set_index_error(ibox); if (sc->expunge != NULL) { for (i = expunges_count*2; i > 0; i -= 2) { for (seq = expunges[i-1]; seq >= expunges[i-2]; seq--) sc->expunge(&ibox->box, seq, sc_context); } } mail_index_view_sync_end(ctx); if (appends) { new_count = mail_index_view_get_message_count(ibox->view); recent_count = ibox->get_recent_count(ibox); sc->new_messages(&ibox->box, new_count, recent_count, sc_context); } mail_index_view_unlock(ibox->view); return ret; }