# HG changeset patch # User Timo Sirainen # Date 1183913191 -10800 # Node ID 3ec9ce7cd5e721452a439de56bbeb2e2e3e9e6e3 # Parent a4c80b0ee22b650c96796bad7ff9328d894b85b8 Implemented mail_index_update_header_ext() diff -r a4c80b0ee22b -r 3ec9ce7cd5e7 src/lib-index/mail-index-transaction-private.h --- a/src/lib-index/mail-index-transaction-private.h Sun Jul 08 19:45:59 2007 +0300 +++ b/src/lib-index/mail-index-transaction-private.h Sun Jul 08 19:46:31 2007 +0300 @@ -9,6 +9,13 @@ ARRAY_TYPE(seq_range) remove_seq; }; +struct mail_index_transaction_ext_hdr_update { + uint32_t ext_id; + uint16_t offset; + uint16_t size; + /* unsigned char data[]; */ +}; + struct mail_index_transaction_vfuncs { int (*commit)(struct mail_index_transaction *t, uint32_t *log_file_seq_r, uoff_t *log_file_offset_r); @@ -39,6 +46,8 @@ unsigned char post_hdr_change[sizeof(struct mail_index_header)]; unsigned char post_hdr_mask[sizeof(struct mail_index_header)]; + ARRAY_DEFINE(ext_hdr_updates, + struct mail_index_transaction_ext_hdr_update *); ARRAY_DEFINE(ext_rec_updates, ARRAY_TYPE(seq_array)); ARRAY_DEFINE(ext_resizes, struct mail_transaction_ext_intro); ARRAY_DEFINE(ext_resets, uint32_t); diff -r a4c80b0ee22b -r 3ec9ce7cd5e7 src/lib-index/mail-index-transaction.c --- a/src/lib-index/mail-index-transaction.c Sun Jul 08 19:45:59 2007 +0300 +++ b/src/lib-index/mail-index-transaction.c Sun Jul 08 19:46:31 2007 +0300 @@ -23,6 +23,7 @@ void mail_index_transaction_reset(struct mail_index_transaction *t) { ARRAY_TYPE(seq_array) *recs; + struct mail_index_transaction_ext_hdr_update **ext_hdrs; unsigned i, count; if (array_is_created(&t->ext_rec_updates)) { @@ -34,6 +35,13 @@ } array_free(&t->ext_rec_updates); } + if (array_is_created(&t->ext_hdr_updates)) { + ext_hdrs = array_get_modifiable(&t->ext_hdr_updates, &count); + + for (i = 0; i < count; i++) + i_free(ext_hdrs[i]); + array_free(&t->ext_hdr_updates); + } if (array_is_created(&t->keyword_updates)) { struct mail_index_transaction_keyword_update *u; @@ -860,7 +868,23 @@ uint32_t ext_id, size_t offset, const void *data, size_t size) { - // FIXME + struct mail_index_transaction_ext_hdr_update *hdr, **pos; + + hdr = i_malloc(sizeof(*hdr) + size); + hdr->ext_id = ext_id; + hdr->offset = offset; + hdr->size = size; + memcpy(hdr + 1, data, size); + + if (!array_is_created(&t->ext_hdr_updates)) + i_array_init(&t->ext_hdr_updates, ext_id + 2); + + pos = array_idx_modifiable(&t->ext_hdr_updates, ext_id); + if (*pos != NULL) { + i_panic("mail_index_update_header_ext() doesn't currently " + "support multiple updates to the same ext header"); + } + *pos = hdr; } void mail_index_update_ext(struct mail_index_transaction *t, uint32_t seq, diff -r a4c80b0ee22b -r 3ec9ce7cd5e7 src/lib-index/mail-transaction-log-append.c --- a/src/lib-index/mail-transaction-log-append.c Sun Jul 08 19:45:59 2007 +0300 +++ b/src/lib-index/mail-transaction-log-append.c Sun Jul 08 19:46:31 2007 +0300 @@ -226,12 +226,33 @@ } static void +log_append_ext_hdr_update(struct log_append_context *ctx, + struct mail_index_transaction_ext_hdr_update *hdr) +{ + struct mail_transaction_ext_hdr_update *trans_hdr; + buffer_t *buf; + unsigned int hdr_size; + + t_push(); + hdr_size = sizeof(*trans_hdr) + hdr->size; + buf = buffer_create_static_hard(pool_datastack_create(), hdr_size); + trans_hdr = buffer_append_space_unsafe(buf, sizeof(*trans_hdr)); + trans_hdr->offset = hdr->offset; + trans_hdr->size = hdr->size; + buffer_append(buf, hdr + 1, hdr->size); + log_append_buffer(ctx, buf, NULL, MAIL_TRANSACTION_EXT_HDR_UPDATE); + t_pop(); +} + +static void mail_transaction_log_append_ext_intros(struct log_append_context *ctx) { struct mail_index_transaction *t = ctx->trans; const struct mail_transaction_ext_intro *resize; + struct mail_index_transaction_ext_hdr_update *const *hdrs; struct mail_transaction_ext_reset ext_reset; - unsigned int update_count, resize_count, reset_count, ext_count; + unsigned int update_count, resize_count, reset_count, ext_count = 0; + unsigned int hdrs_count; uint32_t ext_id; const uint32_t *reset; const ARRAY_TYPE(seq_array) *update; @@ -242,6 +263,7 @@ update_count = 0; } else { update = array_get(&t->ext_rec_updates, &update_count); + ext_count = update_count; } if (!array_is_created(&t->ext_resizes)) { @@ -249,6 +271,8 @@ resize_count = 0; } else { resize = array_get(&t->ext_resizes, &resize_count); + if (ext_count < resize_count) + ext_count = resize_count; } if (!array_is_created(&t->ext_resets)) { @@ -256,6 +280,17 @@ reset_count = 0; } else { reset = array_get(&t->ext_resets, &reset_count); + if (ext_count < reset_count) + ext_count = reset_count; + } + + if (!array_is_created(&t->ext_hdr_updates)) { + hdrs = NULL; + hdrs_count = 0; + } else { + hdrs = array_get(&t->ext_hdr_updates, &hdrs_count); + if (ext_count < hdrs_count) + ext_count = hdrs_count; } memset(&ext_reset, 0, sizeof(ext_reset)); @@ -263,7 +298,6 @@ buf = buffer_create_data(pool_datastack_create(), &ext_reset, sizeof(ext_reset)); buffer_set_used_size(buf, sizeof(ext_reset)); - ext_count = I_MAX(I_MAX(update_count, resize_count), reset_count); for (ext_id = 0; ext_id < ext_count; ext_id++) { ext_reset.new_reset_id = @@ -272,12 +306,15 @@ if ((ext_id < resize_count && resize[ext_id].name_size) || (ext_id < update_count && array_is_created(&update[ext_id])) || - ext_reset.new_reset_id != 0) + ext_reset.new_reset_id != 0 || + (ext_id < hdrs_count && hdrs[ext_id] != NULL)) log_append_ext_intro(ctx, ext_id, 0); if (ext_reset.new_reset_id != 0) { log_append_buffer(ctx, buf, NULL, MAIL_TRANSACTION_EXT_RESET); } + if (ext_id < hdrs_count && hdrs[ext_id] != NULL) + log_append_ext_hdr_update(ctx, hdrs[ext_id]); } }