mail-index-sync-update.c revision 659fe5d24825b160cae512538088020d97a60239
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen/* Copyright (C) 2004 Timo Sirainen */
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid mail_index_header_update_counts(struct mail_index_header *hdr,
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen if (((old_flags ^ new_flags) & MAIL_SEEN) != 0) {
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen /* different seen-flag */
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen if (((old_flags ^ new_flags) & MAIL_DELETED) != 0) {
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen /* different deleted-flag */
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenvoid mail_index_header_update_lowwaters(struct mail_index_header *hdr,
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainenstatic void mail_index_sync_update_expunges(struct mail_index_update_ctx *ctx,
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen mail_index_header_update_counts(&ctx->hdr, rec->flags, 0);
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainenstatic void mail_index_sync_update_flags(struct mail_index_update_ctx *ctx,
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen ret = mail_index_lookup_uid_range(ctx->view, syncrec->uid1,
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen for (i = 0; i < INDEX_KEYWORDS_BYTE_COUNT; i++) {
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen keyword_mask[i] = ~syncrec->remove_keywords[i];
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen rec->flags = (rec->flags & flag_mask) | syncrec->add_flags;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen for (i = 0; i < INDEX_KEYWORDS_BYTE_COUNT; i++) {
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainen mail_index_header_update_lowwaters(&ctx->hdr, rec);
5137d2d80255938a0f5fb8f3c1a21b34cf11ada3Timo Sirainenstatic int mail_index_grow(struct mail_index *index, unsigned int count)
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen map->records = buffer_get_modifyable_data(map->buffer, NULL);
4b41116563110d00330896a568eff1078c382827Timo Sirainen (map->records_count + count) * sizeof(struct mail_index_record);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen /* when we grow fast, do it exponentially */
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen (map->records_count + count) * sizeof(struct mail_index_record);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen if (file_set_size(index->fd, (off_t)size) < 0)
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen return mail_index_set_syscall_error(index, "file_set_size()");
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenstatic int mail_index_sync_appends(struct mail_index_update_ctx *ctx,
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen unsigned int count)
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen unsigned int i;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen for (i = 0; i < count; i++) {
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen mail_index_header_update_counts(&ctx->hdr, 0, appends[i].flags);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen mail_index_header_update_lowwaters(&ctx->hdr, &appends[i]);
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen mail_transaction_log_view_set_corrupted(ctx->log_view,
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen "Append with UID %u, but next_uid = %u",
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen memcpy(map->records + map->records_count, appends,
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainenint mail_index_sync_update_index(struct mail_index_sync_ctx *sync_ctx,
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen uint32_t count, file_seq, src_idx, dest_idx, dirty_flag;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen unsigned int lock_id;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen sync_ctx->update_idx = sync_ctx->expunge_idx = 0;
c6a57378d3c54988f525f81e19c0c5d132a0770dTimo Sirainen buffer_get_used_size(sync_ctx->appends_buf) != 0;
if (!changed) {
if (seq1 == 0)
if (src_idx == 0) {
if (src_idx != 0) {
ret = 0;
if (append_count > 0)
return ret;