virtual-sync.c revision 74bf1bef1ec8895741ab1880ff1643c4fc6bd36c
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2008-2016 Dovecot authors, see the included COPYING file */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen const char *const *kw_all;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen /* messages expunged within this sync */
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen /* all messages in this sync, sorted by mailbox_id
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen (but unsorted inside it for now, since it doesn't matter) */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen uint32_t all_mails_idx, all_mails_prev_mailbox_id;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic void virtual_sync_backend_box_deleted(struct virtual_sync_context *ctx,
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic void virtual_sync_set_uidvalidity(struct virtual_sync_context *ctx)
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen offsetof(struct mail_index_header, uid_validity),
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainenstatic void virtual_sync_external_flags(struct virtual_sync_context *ctx,
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen const char *const *kw_names;
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen if (!mail_set_uid(bbox->sync_mail, real_uid)) {
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen /* we may have reopened the mailbox, which could have
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen caused the mail to be expunged already. */
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen /* copy flags */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen mail_index_update_flags(ctx->trans, vseq, MODIFY_REPLACE, flags);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen /* copy keywords */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen kw_names = mail_get_keywords(bbox->sync_mail);
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen keywords = mail_index_keywords_create(ctx->index, kw_names);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen mail_index_update_keywords(ctx->trans, vseq, MODIFY_REPLACE, keywords);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic int virtual_sync_mail_uid_cmp(const void *p1, const void *p2)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen const struct virtual_sync_mail *m1 = p1, *m2 = p2;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen if (m1->vrec.mailbox_id < m2->vrec.mailbox_id)
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen if (m1->vrec.mailbox_id > m2->vrec.mailbox_id)
2a3fc652e13a574ca14ff2405b5c29a59232db49Timo Sirainenvirtual_backend_box_sync_mail_set(struct virtual_backend_box *bbox)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen trans = mailbox_transaction_begin(bbox->box, 0);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic int bbox_mailbox_id_cmp(struct virtual_backend_box *const *b1,
d65a556a5ec078cd7f1d0060adb16fc860d66b27Timo Sirainenvirtual_sync_get_backend_box(struct virtual_mailbox *mbox, const char *name,
e4ded29bff0662a590c2439ef2df8cda8a7cdd9bTimo Sirainen *bbox_r = virtual_backend_box_lookup_name(mbox, name);
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen if (*bbox_r != NULL || !mbox->sync_initialized)
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen /* another process just added a new mailbox.
bc2d4f1c18222a3bd2a6b2b8b5f6abb560a865b3Timo Sirainen we can't handle this currently. */
345253fb28498b2e0a60f4a2a8644c65feee7e75Timo Sirainen mail_storage_set_error(mbox->box.storage, MAIL_ERROR_TEMP, t_strdup_printf(
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen "Backend mailbox '%s' added by another session. "
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainenint virtual_mailbox_ext_header_read(struct virtual_mailbox *mbox,
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen const char *box_path = mailbox_get_path(&mbox->box);
bc2d4f1c18222a3bd2a6b2b8b5f6abb560a865b3Timo Sirainen const struct virtual_mail_index_header *ext_hdr;
bc2d4f1c18222a3bd2a6b2b8b5f6abb560a865b3Timo Sirainen const struct virtual_mail_index_mailbox_record *mailboxes;
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen unsigned int i, count, ext_name_offset, ext_mailbox_count;
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen mail_index_get_header_ext(view, mbox->virtual_ext_id,
a4ee24a4d5eefa80bbefc5acba16587ae36c3b5bTimo Sirainen mbox->prev_uid_validity == hdr->uid_validity &&
af6c7862e6160ffaecec458f4cec43b94272ad57Timo Sirainen mbox->prev_change_counter == ext_hdr->change_counter) {
af6c7862e6160ffaecec458f4cec43b94272ad57Timo Sirainen /* fully refreshed */
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen mbox->search_args_crc32 != ext_hdr->search_args_crc32) {
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen mbox->prev_change_counter = ext_hdr->change_counter;
a93de780c3b78cfaace287026e468f3c3e34683aTimo Sirainen ext_hdr->mailbox_count > INT_MAX/sizeof(*mailboxes)) {
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen i_error("virtual index %s: Broken mailbox_count header",
prev_mailbox_id = 0;
for (i = 0; i < ext_mailbox_count; i++) {
box_path);
box_path);
box_path);
T_BEGIN {
const unsigned char *nameptr;
const char *name;
} T_END;
if (ret < 0)
ret = 0;
if (i < ext_mailbox_count) {
ret = 0;
for (i = 0; i < count; i++) {
ret = 0;
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;
if (flags != 0) {
if (flags != 0) {
kw_names);
int ret;
0, NULL);
return ret;
if (uid_count == 0)
i_unreached();
for (i = 0; i < uid_count; i++) {
&vseq))
if (uid_count == 0)
if (rec_count == 0 ||
&dest))
i_unreached();
for (i = 0; i < uid_count; i++) {
unsigned int i, count;
for (i = 0; i < count; i++) {
const void *data;
old_msg_count = 0;
&removed_uids);
unsigned int i, n = 0, count;
if (i == count)
for (; i < count; ) {
unsigned int i, n = 0, count;
for (; i < count; ) {
if (!iter_done) {
&added_uids);
&temp_uids);
&removed_uids);
&removed_uids);
unsigned int *idx1_r,
unsigned int *idx2_r)
&idx);
return FALSE;
return TRUE;
&idx1);
case MAILBOX_SYNC_TYPE_FLAGS:
case MAILBOX_SYNC_TYPE_MODSEQ:
const unsigned int uidval_pos =
unsigned int mailbox_offset;
int ret = 0;
if (ret == 0)
if (ret < 0) {
int ret;
return ret;
&status) < 0) {
return ret;
} T_END;
return ret;
const void *data;
unsigned int j = 0, uidmap_count = 0;
if (messages == 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;
if (count == 0) {
&idx))
i_unreached();
const void *data;
const void *data;
const void *mail_data;
unsigned int i, count;
int ret;
for (i = 0; i < count; i++) {
#ifdef DEBUG
for (i = 0; i < count; i++) {
return ret;
unsigned int i, count;
for (i = 0; i < count; i++)
if (success) {
return ret;
bool broken;
int ret;
if (ret <= 0) {
if (ret < 0)
return ret;
if (ret < 0)
if (ret == 0)
if (broken)
struct mailbox_sync_context *
int ret = 0;
return sync_ctx;