expire-plugin.c revision af847e72564a35f75171b69d291375fdb4846673
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2006-2008 Dovecot authors, see the included COPYING file */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen void (*next_hook_mail_storage_created)(struct mail_storage *storage);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen union mailbox_transaction_module_context module_ctx;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenconst char *expire_plugin_version = PACKAGE_VERSION;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(expire_storage_module,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(expire_mail_module, &mail_module_register);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenexpire_mailbox_transaction_begin(struct mailbox *box,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen struct expire_mailbox *xpr_box = EXPIRE_CONTEXT(box);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen t = xpr_box->module_ctx.super.transaction_begin(box, flags);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen xt = i_new(struct expire_transaction_context, 1);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen MODULE_CONTEXT_SET(t, expire_storage_module, xt);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainenstatic void first_nonexpunged_timestamp(struct mailbox_transaction_context *_t,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen /* find the first non-expunged mail. we're here because the first
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen mail was expunged, so don't bother checking it. */
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen for (seq = 2; seq <= hdr->messages_count; seq++) {
ce28adabf2c47d3af9ef197787cdb5139424c69cTimo Sirainen /* everything expunged */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenexpire_mailbox_transaction_commit(struct mailbox_transaction_context *t,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct expire_mailbox *xpr_box = EXPIRE_CONTEXT(t->box);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct expire_transaction_context *xt = EXPIRE_CONTEXT(t);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* only moving mails - don't update the move stamps */
009217abb57a24a4076092e8e4e165545747839eStephan Bosch /* first mail expunged. dict needs updating. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (xt->first_expunged || xt->saves) T_BEGIN {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen key = t_strconcat(DICT_EXPIRE_PREFIX, expire.username, "/",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* saved new mails. dict needs to be updated only if
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen this is the first mail in the database */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen ret = dict_lookup(expire.db, pool_datastack_create(),
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* may not be exactly the first message's save time
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen but a few second difference doesn't matter */
1055d8038122c4f4190d37d98fdff6791d1306f8Timo Sirainen /* everything expunged */
009217abb57a24a4076092e8e4e165545747839eStephan Boschexpire_mailbox_transaction_rollback(struct mailbox_transaction_context *t)
7c925149e49f7cce41c90d562ff3835b66ddca29Timo Sirainen struct expire_mailbox *xpr_box = EXPIRE_CONTEXT(t->box);
7c925149e49f7cce41c90d562ff3835b66ddca29Timo Sirainen struct expire_transaction_context *xt = EXPIRE_CONTEXT(t);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen xpr_box->module_ctx.super.transaction_rollback(t);
85601125c9cae82957a57f7b02409c567a59300eTimo Sirainenstatic void expire_mail_expunge(struct mail *_mail)
85601125c9cae82957a57f7b02409c567a59300eTimo Sirainen struct mail_private *mail = (struct mail_private *)_mail;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen union mail_module_context *xpr_mail = EXPIRE_MAIL_CONTEXT(mail);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* first mail expunged, database needs to be updated */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic struct mail *
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenexpire_mail_alloc(struct mailbox_transaction_context *t,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen struct expire_mailbox *xpr_box = EXPIRE_CONTEXT(t->box);
return _mail;
static struct mailbox *
unsigned int secs;
bool altmove;
&altmove);
if (secs != 0)
return box;
void expire_plugin_init(void)
void expire_plugin_deinit(void)