mail-index-sync-update.c revision 321241fc56909ccb69d77c6a11686e0c25b4c4d4
40c5626383ebd5e8cf11a636f864023a2aafcd6bDaniel Couto Vale/* Copyright (C) 2004 Timo Sirainen */
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornbergervoid mail_index_sync_replace_map(struct mail_index_sync_map_ctx *ctx,
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger /* if map still exists after this, it's only in views. */
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger mail_index_unmap(view->index, view->index->map);
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller if (ctx->type == MAIL_INDEX_SYNC_HANDLER_INDEX)
40c5626383ebd5e8cf11a636f864023a2aafcd6bDaniel Couto Valemail_index_header_update_counts(struct mail_index *index,
40c5626383ebd5e8cf11a636f864023a2aafcd6bDaniel Couto Vale if (((old_flags ^ new_flags) & MAIL_RECENT) != 0) {
d1860f0434d6460259d04f8952e55df38fe517f7Tim Reddehase /* different recent-flag */
d1860f0434d6460259d04f8952e55df38fe517f7Tim Reddehase hdr->recent_messages_count > hdr->messages_count) {
40c5626383ebd5e8cf11a636f864023a2aafcd6bDaniel Couto Vale "Recent counter wrong in index file %s",
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase hdr->first_recent_uid_lowwater = hdr->next_uid;
71fdc30cc6e637d99cacb455537e7b8fbfe77395henning mueller if (((old_flags ^ new_flags) & MAIL_SEEN) != 0) {
71fdc30cc6e637d99cacb455537e7b8fbfe77395henning mueller /* different seen-flag */
40c5626383ebd5e8cf11a636f864023a2aafcd6bDaniel Couto Vale else if (hdr->seen_messages_count >= hdr->messages_count) {
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger "Seen counter wrong in index file %s",
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller } else if (++hdr->seen_messages_count == hdr->messages_count)
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller hdr->first_unseen_uid_lowwater = hdr->next_uid;
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase if (((old_flags ^ new_flags) & MAIL_DELETED) != 0) {
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase /* different deleted-flag */
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase hdr->deleted_messages_count > hdr->messages_count) {
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase "Deleted counter wrong in index file %s",
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase } else if (--hdr->deleted_messages_count == 0)
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase hdr->first_deleted_uid_lowwater = hdr->next_uid;
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning muellermail_index_header_update_lowwaters(struct mail_index_header *hdr,
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger rec->uid < hdr->first_recent_uid_lowwater)
ac2169141f0b549fc8917a4b1d778f4ba3cab0bfJulian Kornberger rec->uid < hdr->first_unseen_uid_lowwater)
ac2169141f0b549fc8917a4b1d778f4ba3cab0bfJulian Kornberger hdr->first_unseen_uid_lowwater = rec->uid;
ac2169141f0b549fc8917a4b1d778f4ba3cab0bfJulian Kornberger rec->uid < hdr->first_deleted_uid_lowwater)
aa056a2e5efb6505701a4e4a31bf2f7e71ff1738henning muellerstatic int sync_expunge(const struct mail_transaction_expunge *e,
705933deb08bc4269e8c08d50143af3cb5c1c670henning mueller const struct mail_index_expunge_handler *expunge_handlers, *eh;
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger mail_transaction_log_view_set_corrupted(ctx->view->log_view,
aa056a2e5efb6505701a4e4a31bf2f7e71ff1738henning mueller "Invalid UID range in expunge (%u .. %u)",
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger if (!view->map->write_to_disk || view->map->refcount != 1) {
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase /* expunges have to be atomic. so we'll have to copy
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger the mapping, do the changes there and then finally
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger replace the whole index file. to avoid extra disk
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger I/O we copy the index into memory rather than to
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller temporary file */
7ea9649883e1bbe8f2582db1a3c66af8b7206056henning mueller map = mail_index_map_clone(map, map->hdr.record_size);
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale i_assert(MAIL_INDEX_MAP_IS_IN_MEMORY(map));
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger if (mail_index_lookup_uid_range(view, e->uid1, e->uid2,
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger /* don't call expunge handlers if we're syncing view */
4952c0f2ffd64062becdc4efeb38446a904d7ec1Julian Kornberger if (ctx->type != MAIL_INDEX_SYNC_HANDLER_VIEW &&
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger mail_index_sync_init_expunge_handlers(ctx);
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase if (ctx->type != MAIL_INDEX_SYNC_HANDLER_VIEW &&
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase expunge_handlers = array_get(&ctx->expunge_handlers,
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase mail_index_header_update_counts(view->index, &map->hdr,
for (i = 0; i < expunge_handlers_count; i++) {
void *dest;
if (seq1 == 0)
unsigned int count)
void *hdr_copy;
t_push();
t_pop();
t_pop();
const int max_days =
int i, days;
const void *data)
int ret = 0;
t_push();
case MAIL_TRANSACTION_APPEND: {
if (ret <= 0)
case MAIL_TRANSACTION_EXPUNGE:
if (ret <= 0)
case MAIL_TRANSACTION_FLAG_UPDATE: {
if (ret <= 0)
case MAIL_TRANSACTION_HEADER_UPDATE: {
if (ret <= 0)
case MAIL_TRANSACTION_EXT_INTRO: {
if (ret <= 0)
case MAIL_TRANSACTION_EXT_RESET: {
case MAIL_TRANSACTION_EXT_HDR_UPDATE: {
if (ret <= 0)
case MAIL_TRANSACTION_EXT_REC_UPDATE: {
unsigned int record_size;
if (ret <= 0)
case MAIL_TRANSACTION_KEYWORD_UPDATE: {
case MAIL_TRANSACTION_KEYWORD_RESET: {
i_unreached();
t_pop();
return ret;
int sync_only_external)
const void *data;
if (had_dirty)
first_append_uid = 0;
if (sync_only_external) {
} else if (check_ext_offsets) {
&prev_seq,
&prev_offset);
if (first_append_uid == 0)
if (ret < 0) {
if (!sync_only_external)
if (first_append_uid != 0)
had_dirty) {
return ret;