sdbox-mail.c revision 2d01cc1880cf2afd4fb1c8ad7fa6ce78e562e71e
2e37d45867d081db150ab78dad303b9077aea24fTimo Sirainen/* Copyright (c) 2007-2011 Dovecot authors, see the included COPYING file */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "lib.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "ioloop.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "istream.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "str.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "index-mail.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "dbox-mail.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "sdbox-storage.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "sdbox-file.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include <stdlib.h>
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include <sys/stat.h>
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void sdbox_mail_set_expunged(struct dbox_mail *mail)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen{
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct mail *_mail = &mail->imail.mail.mail;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
0a7b04ec6441fdcf083392888b2e30844fc3e86dTimo Sirainen (void)mail_index_refresh(_mail->box->index);
0a7b04ec6441fdcf083392888b2e30844fc3e86dTimo Sirainen if (mail_index_is_expunged(_mail->transaction->view, _mail->seq)) {
0a7b04ec6441fdcf083392888b2e30844fc3e86dTimo Sirainen mail_set_expunged(_mail);
0a7b04ec6441fdcf083392888b2e30844fc3e86dTimo Sirainen return;
0a7b04ec6441fdcf083392888b2e30844fc3e86dTimo Sirainen }
0a7b04ec6441fdcf083392888b2e30844fc3e86dTimo Sirainen
0a7b04ec6441fdcf083392888b2e30844fc3e86dTimo Sirainen mail_storage_set_critical(_mail->box->storage,
0a7b04ec6441fdcf083392888b2e30844fc3e86dTimo Sirainen "dbox %s: Unexpectedly lost uid=%u",
3df398a463e931b63586726adb3309c9692208c1Timo Sirainen mailbox_get_path(_mail->box), _mail->uid);
0a7b04ec6441fdcf083392888b2e30844fc3e86dTimo Sirainen sdbox_set_mailbox_corrupted(_mail->box);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen}
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic bool sdbox_mail_file_set(struct dbox_mail *mail)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen{
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct mail *_mail = &mail->imail.mail.mail;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)_mail->box;
d665e2948cb6fe8016706752a9e4940d64f4a61dTimo Sirainen bool deleted;
d665e2948cb6fe8016706752a9e4940d64f4a61dTimo Sirainen int ret;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (mail->open_file != NULL) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* already set */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return FALSE;
fc40a9a002458e372ff4b9f6f4e15239520c0bcdTimo Sirainen } else if (!_mail->saving) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen mail->open_file = sdbox_file_init(mbox, _mail->uid);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return FALSE;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen } else {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* mail is being saved in this transaction */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen mail->open_file =
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen sdbox_save_file_get_file(_mail->transaction,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen _mail->seq);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen mail->open_file->refcount++;
d665e2948cb6fe8016706752a9e4940d64f4a61dTimo Sirainen
d665e2948cb6fe8016706752a9e4940d64f4a61dTimo Sirainen /* it doesn't have input stream yet */
4ca83616715c3bd417e34ced2c1d61852513e427Timo Sirainen ret = dbox_file_open(mail->open_file, &deleted);
d665e2948cb6fe8016706752a9e4940d64f4a61dTimo Sirainen i_assert(ret > 0);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return TRUE;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen }
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen}
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenint sdbox_mail_open(struct dbox_mail *mail, uoff_t *offset_r,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct dbox_file **file_r)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen{
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct mail *_mail = &mail->imail.mail.mail;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen bool deleted;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (_mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen mail_set_aborted(_mail);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return -1;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen }
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (!sdbox_mail_file_set(mail)) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (!dbox_file_is_open(mail->open_file))
2d01cc1880cf2afd4fb1c8ad7fa6ce78e562e71eTimo Sirainen _mail->transaction->stats.open_lookup_count++;
4ca83616715c3bd417e34ced2c1d61852513e427Timo Sirainen if (dbox_file_open(mail->open_file, &deleted) <= 0)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return -1;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (deleted) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen sdbox_mail_set_expunged(mail);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return -1;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen }
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen }
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen *file_r = mail->open_file;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen *offset_r = 0;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return 0;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen}
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstruct mail_vfuncs sdbox_mail_vfuncs = {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen dbox_mail_close,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_free,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_set_seq,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_set_uid,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_set_uid_cache_updates,
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen index_mail_prefetch,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_get_flags,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_get_keywords,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_get_keyword_indexes,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_get_modseq,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_get_parts,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_get_date,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen dbox_mail_get_received_date,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen dbox_mail_get_save_date,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen dbox_mail_get_virtual_size,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen dbox_mail_get_physical_size,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_get_first_header,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_get_headers,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_get_header_stream,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen dbox_mail_get_stream,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen dbox_mail_get_special,
9af6cc9ebc9986c1275ebdfa29c39e152af1557eTimo Sirainen index_mail_get_real_mail,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_update_flags,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_update_keywords,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_update_modseq,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen NULL,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen index_mail_expunge,
c7e14824e4e1ca9dc5d48d1eddc4a38d3041218fTimo Sirainen index_mail_parse,
6564208826b0f46a00f010d1b5711d85944c3c88Timo Sirainen index_mail_set_cache_corrupted,
6564208826b0f46a00f010d1b5711d85944c3c88Timo Sirainen index_mail_opened
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen};