virtual-sync.c revision a21823d90cee6a18aeab0378637472c7e3fbbab2
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen/* Copyright (c) 2008-2009 Dovecot authors, see the included COPYING file */
8b5c520883aa37bb55646286d375fdbae294d710Timo Sirainen const char *const *kw_all;
8b5c520883aa37bb55646286d375fdbae294d710Timo Sirainen /* messages expunged within this sync */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ARRAY_DEFINE(all_adds, struct virtual_add_record);
89237470342ea6d4bbdf4cff9764037cfb3f6f45Timo Sirainenstatic void virtual_sync_set_uidvalidity(struct virtual_sync_context *ctx)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen offsetof(struct mail_index_header, uid_validity),
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void virtual_sync_external_flags(struct virtual_sync_context *ctx,
a3fe8c0c54d87822f4b4f8f0d10caac611861b2bTimo Sirainen const char *const *kw_names;
578ef2538ccf42e2a48234c24a8b709397101d88Timo Sirainen if (!mail_set_uid(bbox->sync_mail, real_uid)) {
d6b3cfd855c0eebed68be50d3111de1b5a6afeb0Timo Sirainen /* copy flags */
d6b3cfd855c0eebed68be50d3111de1b5a6afeb0Timo Sirainen mail_index_update_flags(ctx->trans, vseq, MODIFY_REPLACE, flags);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* copy keywords */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen kw_names = mail_get_keywords(bbox->sync_mail);
d5eb47a791ec56149fd711cd8e44efc8babeaae5Timo Sirainen keywords = mail_index_keywords_create(ctx->index, kw_names);
d5eb47a791ec56149fd711cd8e44efc8babeaae5Timo Sirainen mail_index_update_keywords(ctx->trans, vseq, MODIFY_REPLACE, keywords);
e0740628f6ca05f4bc79a9d8a90b650f4d38d4d0Timo Sirainenstatic int virtual_sync_mail_cmp(const void *p1, const void *p2)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const struct virtual_sync_mail *m1 = p1, *m2 = p2;
3f603ef00e35fca21605afa0ad8d76e94fee2b96Timo Sirainen if (m1->vrec.mailbox_id < m2->vrec.mailbox_id)
3f603ef00e35fca21605afa0ad8d76e94fee2b96Timo Sirainen if (m1->vrec.mailbox_id > m2->vrec.mailbox_id)
6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbeTimo Sirainenvirtual_backend_box_sync_mail_set(struct virtual_backend_box *bbox)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen trans = mailbox_transaction_begin(bbox->box, 0);
1ffb2afe6d7e8860a2231a4827078cf2ef9c22cdTimo Sirainenvirtual_backend_box_sync_mail_unset(struct virtual_backend_box *bbox)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic int bbox_mailbox_id_cmp(const void *p1, const void *p2)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const struct virtual_backend_box *const *b1 = p1, *const *b2 = p2;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic bool virtual_sync_ext_header_read(struct virtual_sync_context *ctx)
b2d562f9c7fd13f9a16e9b3bcee904630b80b1feTimo Sirainen const struct virtual_mail_index_header *ext_hdr;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const struct virtual_mail_index_mailbox_record *mailboxes;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen unsigned int i, count, ext_name_offset, ext_mailbox_count;
275385a2ecc58e41dc7df3ce3cd943caaa58c4d1Timo Sirainen mail_index_get_header_ext(ctx->sync_view, ctx->mbox->virtual_ext_id,
57397188558fcd1a9e24dbbbd2952eac9c45c20dTimo Sirainen ctx->mbox->prev_uid_validity == hdr->uid_validity &&
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen ctx->mbox->prev_change_counter == ext_hdr->change_counter) {
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainen /* fully refreshed */
21e6b4fd844fd074583b17f09e1f27b9835ee238Timo Sirainen ctx->mbox->prev_uid_validity = hdr->uid_validity;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ctx->mbox->search_args_crc32 != ext_hdr->search_args_crc32) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen ctx->mbox->prev_change_counter = ext_hdr->change_counter;
f158d9a303bb15a6848ca276c9391c7ca52e452bTimo Sirainen ext_hdr->mailbox_count > INT_MAX/sizeof(*mailboxes)) {
6303f32ad4af9cb08794561e6324df1c6c5fb637Timo Sirainen i_error("virtual %s: Broken mailbox_count header",
prev_mailbox_id = 0;
for (i = 0; i < ext_mailbox_count; i++) {
T_BEGIN {
const unsigned char *nameptr;
const char *name;
} T_END;
for (i = 0; i < count; i++) {
return ret;
const void *ext_data;
for (i = 0; i < count; i++) {
i_assert(i == 0 ||
sizeof(struct virtual_mail_index_record),
sizeof(uint32_t));
const void *data;
bool expunged;
if (flags != 0) {
if (flags != 0) {
kw_names);
kw_names);
keywords);
i_unreached();
int ret;
return ret;
if (uid_count == 0)
sizeof(*uidmap),
i_unreached();
&vseq))
i_unreached();
if (uid_count == 0)
if (rec_count == 0 ||
sizeof(*uidmap),
&dest))
i_unreached();
for (i = 0; i < uid_count; i++) {
const void *data;
unsigned int uid_count;
bool expunged;
&seq)) {
old_msg_count = 0;
&temp_uids);
&removed_uids);
&removed_uids);
unsigned int *idx1_r,
unsigned int *idx2_r)
return FALSE;
return TRUE;
case MAILBOX_SYNC_TYPE_FLAGS:
i_unreached();
case MAILBOX_SYNC_TYPE_MODSEQ:
const unsigned int uidval_pos =
unsigned int mailbox_offset;
int ret;
&status) < 0)
} T_END;
return ret;
const void *data;
bool expunged;
unsigned int j = 0, uidmap_count = 0;
for (i = 0; i < messages; i++) {
for (; j < uidmap_count; j++) {
&uidmap_count);
for (; j < uidmap_count; j++) {
for (; j < uidmap_count; j++) {
for (i = 0; i < count; i++) {
for (j = 0; j < uidmap_count; j++) {
unsigned int i, count;
i_unreached();
if (count == 0)
sizeof(*uidmap),
&idx))
i_unreached();
unsigned int i, count;
for (i = 0; i < count; i++) {
unsigned int i, count;
for (i = 0; i < count; i++)
if (success) {
return ret;
int ret;
if (ret <= 0) {
if (ret < 0)
return ret;
struct mailbox_sync_context *
int ret = 0;