changeset 21655:cb11cca4eaee

lib-index: Allow multiple hooks for transaction creation
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Mon, 20 Feb 2017 14:34:25 +0200
parents 2c937505c112
children 538853d82926
files src/lib-index/mail-index-transaction-private.h src/lib-index/mail-index-transaction.c
diffstat 2 files changed, 39 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-transaction-private.h	Tue Feb 21 14:20:22 2017 +0200
+++ b/src/lib-index/mail-index-transaction-private.h	Mon Feb 20 14:34:25 2017 +0200
@@ -107,8 +107,10 @@
 	 (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);
--- a/src/lib-index/mail-index-transaction.c	Tue Feb 21 14:20:22 2017 +0200
+++ b/src/lib-index/mail-index-transaction.c	Mon Feb 20 14:34:25 2017 +0200
@@ -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 (*hook_mail_index_transaction_created)
-		(struct mail_index_transaction *t) = NULL;
+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);
+}
+
 
 struct mail_index_view *
 mail_index_transaction_get_view(struct mail_index_transaction *t)
@@ -321,7 +348,11 @@
 		     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;
 }