mdbox-mail.c revision d4002fe1f64d25a792f76fb102ef7dc519cd4e24
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Copyright (c) 2007-2017 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint mdbox_mail_lookup(struct mdbox_mailbox *mbox, struct mail_index_view *view,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const struct mdbox_mail_index_record *dbox_rec;
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen mail_index_lookup_ext(view, seq, mbox->ext_id, &data, NULL);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (dbox_rec == NULL || dbox_rec->map_uid == 0) {
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen if (mdbox_read_header(mbox, &hdr, &need_resize) < 0)
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen mbox->map_uid_validity = hdr.map_uid_validity;
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen if (mdbox_map_open_or_create(mbox->storage->map) < 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen cur_map_uid_validity = mdbox_map_get_uid_validity(mbox->storage->map);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen if (cur_map_uid_validity != mbox->map_uid_validity) {
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen "mdbox: map uidvalidity mismatch (%u vs %u)",
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen mbox->map_uid_validity, cur_map_uid_validity);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void dbox_mail_set_expunged(struct dbox_mail *mail, uint32_t map_uid)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen struct mdbox_mailbox *mbox = MDBOX_MAILBOX(_mail->box);
ee246b46953e4b94b2f22e093373674fa9155500Timo Sirainen if (mail_index_is_expunged(_mail->transaction->view, _mail->seq)) {
ee246b46953e4b94b2f22e093373674fa9155500Timo Sirainen "Unexpectedly lost %s uid=%u map_uid=%u",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int dbox_mail_open_init(struct dbox_mail *mail, uint32_t map_uid)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mdbox_mailbox *mbox = MDBOX_MAILBOX(mail->imail.mail.mail.box);
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen if ((ret = mdbox_map_lookup(mbox->storage->map, map_uid,
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen /* map_uid doesn't exist anymore. either it
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen got just expunged or the map index is
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen corrupted. */
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen mail->open_file = mdbox_file_init(mbox->storage, file_id);
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainenint mdbox_mail_open(struct dbox_mail *mail, uoff_t *offset_r,
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen struct mdbox_mailbox *mbox = MDBOX_MAILBOX(_mail->box);
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen /* already open */
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen if (mdbox_mail_lookup(mbox, _mail->transaction->view,
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen /* mail is being saved in this transaction */
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen _mail->transaction->stats.open_lookup_count++;
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen if (dbox_file_open(mail->open_file, &deleted) <= 0)
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen /* either it's expunged now or moved to another file. */
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen if (mdbox_map_refresh(mbox->storage->map) < 0)
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainenstatic int mdbox_mail_get_save_date(struct mail *mail, time_t *date_r)
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen struct mdbox_mailbox *mbox = MDBOX_MAILBOX(mail->transaction->box);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen const struct mdbox_mail_index_record *dbox_rec;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen mail_index_lookup_ext(mail->transaction->view, mail->seq,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (dbox_rec == NULL || dbox_rec->map_uid == 0) {
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen /* lost for some reason, use fallback */
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainenmdbox_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen const char **value_r)
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen struct mdbox_mailbox *mbox = MDBOX_MAILBOX(_mail->transaction->box);
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (mdbox_mail_lookup(mbox, _mail->transaction->view,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (mdbox_map_lookup_full(mbox->storage->map, map_uid,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen *value_r = p_strdup_printf(mail->imail.mail.data_pool, "%u",
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (!dbox_header_have_flag(&mbox->box, mbox->hdr_ext_id,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (!dbox_header_have_flag(&mbox->box, mbox->hdr_ext_id,
6825360d446542046757b06064282301c4c6b27cTimo Sirainen return dbox_mail_get_special(_mail, field, value_r);
c8d093d149253fe8faec267c5057f45fe626f84cTimo Sirainenmdbox_mail_update_flags(struct mail *mail, enum modify_type modify_type,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen mdbox_purge_alt_flag_change(mail, modify_type != MODIFY_REMOVE);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (flags == 0 && modify_type != MODIFY_REPLACE)