Skip to content

Commit

Permalink
lib-index: Allow multiple hooks for transaction creation
Browse files Browse the repository at this point in the history
  • Loading branch information
cmouse authored and GitLab committed Feb 20, 2017
1 parent b317602 commit 2b8ff10
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 6 deletions.
6 changes: 4 additions & 2 deletions src/lib-index/mail-index-transaction-private.h
Expand Up @@ -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);
Expand Down
39 changes: 35 additions & 4 deletions src/lib-index/mail-index-transaction.c
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}

0 comments on commit 2b8ff10

Please sign in to comment.