]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-dict: Add event support
authorAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 11 Mar 2020 12:59:05 +0000 (14:59 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 3 Apr 2020 08:34:45 +0000 (11:34 +0300)
src/lib-dict/dict-private.h
src/lib-dict/dict.c
src/lib-dict/dict.h

index 01bdb7946f77e4b2bfd8133d745a4e28b26efcab..9fedff4f96ce06e530a3a89cfb2a046f030931ea 100644 (file)
@@ -55,6 +55,7 @@ struct dict {
        unsigned int transaction_count;
        struct dict_transaction_context *transactions;
        int refcount;
+       struct event *event;
        struct ioloop *ioloop, *prev_ioloop;
 };
 
index df2c7f7653f6a718490aba5169d42d63b9a6f2cf..01764a6a800118745e6f80e2c8a893a2976712d3 100644 (file)
@@ -22,6 +22,10 @@ struct dict_lookup_callback_ctx {
 
 static ARRAY(struct dict *) dict_drivers;
 
+static struct event_category event_category_dict = {
+       .name = "dict",
+};
+
 static struct dict *dict_driver_lookup(const char *name)
 {
        struct dict *const *dicts;
@@ -75,6 +79,7 @@ void dict_driver_unregister(struct dict *driver)
 int dict_init(const char *uri, const struct dict_settings *set,
              struct dict **dict_r, const char **error_r)
 {
+       struct dict_settings set_dup = *set;
        struct dict *dict;
        const char *p, *name, *error;
 
@@ -93,12 +98,20 @@ int dict_init(const char *uri, const struct dict_settings *set,
                *error_r = t_strdup_printf("Unknown dict module: %s", name);
                return -1;
        }
-       if (dict->v.init(dict, p+1, set, dict_r, &error) < 0) {
+       struct event *event = event_create(set->event_parent);
+       event_add_category(event, &event_category_dict);
+       event_add_str(event, "driver", dict->name);
+       event_set_append_log_prefix(event, t_strdup_printf("dict(%s)<%s>: ",
+                                   dict->name, set->username));
+       set_dup.event_parent = event;
+       if (dict->v.init(dict, p+1, &set_dup, dict_r, &error) < 0) {
                *error_r = t_strdup_printf("dict %s: %s", name, error);
+               event_unref(&event);
                return -1;
        }
        i_assert(*dict_r != NULL);
        (*dict_r)->refcount++;
+       (*dict_r)->event = event;
 
        return 0;
 }
@@ -116,9 +129,12 @@ static void dict_unref(struct dict **_dict)
        *_dict = NULL;
        if (dict == NULL)
                return;
+       struct event *event = dict->event;
        i_assert(dict->refcount > 0);
-       if (--dict->refcount == 0)
+       if (--dict->refcount == 0) {
                dict->v.deinit(dict);
+               event_unref(&event);
+       }
 }
 
 void dict_deinit(struct dict **_dict)
index 9c721945e0377aac8ff99863259683db55004f4d..7d4e4a65dc791a205591ad91eeab41f2d13fbdc5 100644 (file)
@@ -37,6 +37,8 @@ struct dict_settings {
        const char *base_dir;
        /* home directory for the user, if known */
        const char *home_dir;
+       /* set to parent event, if exists */
+       struct event *event_parent;
 };
 
 struct dict_lookup_result {