mail-index-transaction-export.c revision fad068d459cc7b04fedade4e0bb343be62e6d310
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornberger/* Copyright (c) 2003-2010 Dovecot authors, see the included COPYING file */
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornberger#include "mail-index-transaction-private.h"
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornberger struct mail_transaction_log_append_ctx *append_ctx;
492757fbefce7e6aee4a7515983a44d19a542ccchardiklog_append_buffer(struct mail_index_export_context *ctx,
7daf1bcad83f7bcb6f4e1076f925664bbd2d4f36hardik const buffer_t *buf, enum mail_transaction_type type)
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornberger mail_transaction_log_append_add(ctx->append_ctx, type,
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornbergerlog_get_hdr_update_buffer(struct mail_index_transaction *t, bool prepend)
d6cf50ae9519bdb5252081061b3d6a7e0ccde20bEugen Kuksa memset(&u, 0, sizeof(u));
d6cf50ae9519bdb5252081061b3d6a7e0ccde20bEugen Kuksa data = prepend ? t->pre_hdr_change : t->post_hdr_change;
d6cf50ae9519bdb5252081061b3d6a7e0ccde20bEugen Kuksa mask = prepend ? t->pre_hdr_mask : t->post_hdr_mask;
d6cf50ae9519bdb5252081061b3d6a7e0ccde20bEugen Kuksa buf = buffer_create_dynamic(pool_datastack_create(), 256);
d6cf50ae9519bdb5252081061b3d6a7e0ccde20bEugen Kuksa for (offset = 0; offset <= sizeof(t->pre_hdr_change); offset++) {
d6cf50ae9519bdb5252081061b3d6a7e0ccde20bEugen Kuksa if (offset < sizeof(t->pre_hdr_change) && mask[offset]) {
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornbergerstatic void log_append_ext_intro(struct mail_index_export_context *ctx,
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornberger struct mail_index_transaction *t = ctx->trans;
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornberger const struct mail_index_registered_ext *rext;
736e78aff9e67436c35d4835c24fca667f3cadf3Julian Kornberger struct mail_transaction_ext_intro *intro, *resizes;
e5b8591fc3e19ccd4a33757ebcabff27b4ca01ceEugen Kuksa !mail_index_map_get_ext_idx(t->view->index->map, ext_id, &idx)) {
e5b8591fc3e19ccd4a33757ebcabff27b4ca01ceEugen Kuksa /* new extension */
e5b8591fc3e19ccd4a33757ebcabff27b4ca01ceEugen Kuksa rext = array_idx(&t->view->index->extensions, ext_id);
250e5c1ec05ffb6d1b933f913c3c65934b206957Eugen Kuksa resizes = array_get_modifiable(&t->ext_resizes, &count);
815d84cbac89ad1cb14135028f3fea1d1d44a75fEugen Kuksa buf = buffer_create_dynamic(pool_datastack_create(), 128);
815d84cbac89ad1cb14135028f3fea1d1d44a75fEugen Kuksa if (ext_id < count && resizes[ext_id].name_size != 0) {
815d84cbac89ad1cb14135028f3fea1d1d44a75fEugen Kuksa /* we're resizing the extension. use the resize struct. */
b27c7f227c8516589a2bd127c0f74338cf56f0b2Julian Kornberger buffer_append(buf, intro, sizeof(*intro));
402d5f74ba78451acf2ccda16b41398535028a3bEugen Kuksa /* generate a new intro structure */
cf5a6d3745ac43a950c2315b07a1713bae300a97Tim Reddehase intro = buffer_append_space_unsafe(buf, sizeof(*intro));
2244a7dffeed06ee129d0c94648c6a47615a7a0aEugen Kuksa intro->flags = MAIL_TRANSACTION_EXT_INTRO_FLAG_NO_SHRINK;
b27c7f227c8516589a2bd127c0f74338cf56f0b2Julian Kornberger /* we're going to reset this extension in this transaction */
490da89281b7ee019c87406fb8ce7359aff0932cEugen Kuksa /* use the existing reset_id */
555b7fd96768daf9592e7ddbd4217d784b08e451henning mueller array_idx(&t->view->index->map->extensions, idx);
555b7fd96768daf9592e7ddbd4217d784b08e451henning mueller /* new extension, reset_id defaults to 0 */
7b8fe34340b2727bb31fe0be67fdf684e47c3609Tim Reddehase buffer_append(buf, rext->name, intro->name_size);
1cbb38d1d07f559b4a1c012a4833513053716007Daniel Couto Vale buffer_append_zero(buf, 4 - (buf->used % 4));
7cd362a86385a020b8c674cf9199771ae3267359henning mueller if (ctx->append_ctx->new_highest_modseq == 0 &&
7cd362a86385a020b8c674cf9199771ae3267359henning mueller strcmp(rext->name, MAIL_INDEX_MODSEQ_EXT_NAME) == 0) {
291d5c781e5ce4a7c15cfb16fa4a800177135b3ehenning mueller /* modseq tracking started */
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski log_append_buffer(ctx, buf, MAIL_TRANSACTION_EXT_INTRO);
2635b9bca67d93aec1bed63d10d5f92fefce06e7Till Mossakowskilog_append_ext_hdr_update(struct mail_index_export_context *ctx,
2635b9bca67d93aec1bed63d10d5f92fefce06e7Till Mossakowski const struct mail_index_transaction_ext_hdr_update *hdr)
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski struct mail_transaction_ext_hdr_update32 u32;
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski bool started = FALSE, use_32 = hdr->alloc_size >= 65536;
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski memset(&u, 0, sizeof(u));
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski buf = buffer_create_dynamic(pool_datastack_create(), 256);
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski for (offset = 0; offset <= hdr->alloc_size; offset++) {
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski if (offset < hdr->alloc_size && mask[offset] != 0) {
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski buffer_append(buf, data + u32.offset, u32.size);
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski buffer_append_zero(buf, 4 - buf->used % 4);
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski log_append_buffer(ctx, buf, use_32 ? MAIL_TRANSACTION_EXT_HDR_UPDATE32 :
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowskimail_transaction_log_append_ext_intros(struct mail_index_export_context *ctx)
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski struct mail_index_transaction *t = ctx->trans;
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski const struct mail_transaction_ext_intro *resize;
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski const struct mail_index_transaction_ext_hdr_update *hdrs;
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski struct mail_transaction_ext_reset ext_reset;
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski unsigned int hdrs_count, reset_id_count, reset_count;
1543bf02d52779c4bc29f75de1de4d14636d0e47Till Mossakowski const struct mail_transaction_ext_reset *reset;
reset_id_count = 0;
reset_count = 0;
hdrs_count = 0;
reset_id = 0;
T_BEGIN {
} T_END;
reset_id_count = 0;
static enum mail_index_sync_type
const char *const *keywords;
for (i = 0; i < count; i++) {
return change_mask;
if (t->index_undeleted) {
if (t->pre_hdr_changed) {
if (t->post_hdr_changed) {
if (t->index_deleted) {