From: Aki Tuomi Date: Mon, 20 Feb 2017 12:34:25 +0000 (+0200) Subject: lib-index: Allow multiple hooks for transaction creation X-Git-Tag: 2.3.0.rc1~2044 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2b8ff102f5117f917248f98ccbdc8e6a6af83c87;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Allow multiple hooks for transaction creation --- diff --git a/src/lib-index/mail-index-transaction-private.h b/src/lib-index/mail-index-transaction-private.h index 47c9d8eb07..eb3025668e 100644 --- a/src/lib-index/mail-index-transaction-private.h +++ b/src/lib-index/mail-index-transaction-private.h @@ -107,8 +107,10 @@ struct mail_index_transaction { (array_is_created(&(t)->updates) && array_count(&(t)->updates) > 0) || \ (t)->index_deleted || (t)->index_undeleted) -extern void (*hook_mail_index_transaction_created) - (struct mail_index_transaction *t); +typedef void hook_mail_index_transaction_created_t(struct mail_index_transaction *t); + +void mail_index_transaction_hook_register(const hook_mail_index_transaction_created_t *hook); +void mail_index_transaction_hook_unregister(const hook_mail_index_transaction_created_t *hook); struct mail_index_record * mail_index_transaction_lookup(struct mail_index_transaction *t, uint32_t seq); diff --git a/src/lib-index/mail-index-transaction.c b/src/lib-index/mail-index-transaction.c index 264a0be665..c7441dca52 100644 --- a/src/lib-index/mail-index-transaction.c +++ b/src/lib-index/mail-index-transaction.c @@ -9,9 +9,36 @@ #include "mail-transaction-log-private.h" #include "mail-index-transaction-private.h" +static ARRAY(const hook_mail_index_transaction_created_t *) + hook_mail_index_transaction_created; + +void mail_index_transaction_hook_register(const hook_mail_index_transaction_created_t *hook) +{ + if (!array_is_created(&hook_mail_index_transaction_created)) + i_array_init(&hook_mail_index_transaction_created, 8); + array_append(&hook_mail_index_transaction_created, &hook, 1); +} + +void mail_index_transaction_hook_unregister(const hook_mail_index_transaction_created_t *hook) +{ + unsigned int idx; + bool found = FALSE; + + i_assert(array_is_created(&hook_mail_index_transaction_created)); + for(idx = 0; idx < array_count(&hook_mail_index_transaction_created); idx++) { + const hook_mail_index_transaction_created_t *const *hook_ptr = + array_idx(&hook_mail_index_transaction_created, idx); + if (*hook_ptr == hook) { + array_delete(&hook_mail_index_transaction_created, idx, 1); + found = TRUE; + break; + } + } + i_assert(found == TRUE); + if (array_count(&hook_mail_index_transaction_created) == 0) + array_free(&hook_mail_index_transaction_created); +} -void (*hook_mail_index_transaction_created) - (struct mail_index_transaction *t) = NULL; struct mail_index_view * mail_index_transaction_get_view(struct mail_index_transaction *t) @@ -321,7 +348,11 @@ mail_index_transaction_begin(struct mail_index_view *view, I_MIN(5, mail_index_module_register.id)); DLLIST_PREPEND(&view->transactions_list, t); - if (hook_mail_index_transaction_created != NULL) - hook_mail_index_transaction_created(t); + if (array_is_created(&hook_mail_index_transaction_created)) { + const hook_mail_index_transaction_created_t *const *ptr; + array_foreach(&hook_mail_index_transaction_created, ptr) { + (*ptr)(t); + } + } return t; }