static void json_export_categories(string_t *dest, struct event *event,
const struct metric_export_info *info)
{
- struct event_category *const *cats;
- unsigned int count;
-
if ((info->include & EVENT_EXPORTER_INCL_CATEGORIES) == 0)
return;
append_str(dest, "categories");
str_append(dest, ":[");
- cats = event_get_categories(event, &count);
- event_export_helper_fmt_categories(dest, cats, count,
- append_str, ",");
+ event_export_helper_fmt_categories(dest, event, append_str, ",");
str_append(dest, "],");
}
static void tabtext_export_categories(string_t *dest, struct event *event,
const struct metric_export_info *info)
{
- struct event_category *const *cats;
- unsigned int count;
-
if ((info->include & EVENT_EXPORTER_INCL_CATEGORIES) == 0)
return;
- cats = event_get_categories(event, &count);
- event_export_helper_fmt_categories(dest, cats, count,
- append_category, "\t");
+ event_export_helper_fmt_categories(dest, event, append_category, "\t");
str_append_c(dest, '\t'); /* extra \t to have something to remove later */
}
#include "lib.h"
#include "str.h"
-#include "hash.h"
#include "ioloop.h"
#include "event-exporter.h"
(unsigned int) time->tv_usec);
}
-HASH_TABLE_DEFINE_TYPE(category_set, void *, const struct event_category *);
-
-static void insert_category(HASH_TABLE_TYPE(category_set) hash,
- const struct event_category * const cat)
-{
- /* insert this category (key == the unique internal pointer) */
- hash_table_update(hash, cat->internal, cat);
-
- /* insert parent's categories */
- if (cat->parent != NULL)
- insert_category(hash, cat->parent);
-}
-
void event_export_helper_fmt_categories(string_t *dest,
- struct event_category * const *cats,
- unsigned int count,
+ const struct event *event,
void (*append)(string_t *, const char *),
const char *separator)
{
- HASH_TABLE_TYPE(category_set) hash;
- struct hash_iterate_context *iter;
+ struct event_category_iterator *iter;
const struct event_category *cat;
- void *key ATTR_UNUSED;
- unsigned int i;
bool first = TRUE;
- if (count == 0)
- return;
-
- hash_table_create_direct(&hash, pool_datastack_create(),
- 3 * count /* estimate */);
-
- /* insert all the categories into the hash table */
- for (i = 0; i < count; i++)
- insert_category(hash, cats[i]);
-
- /* output each category from hash table */
- iter = hash_table_iterate_init(hash);
- while (hash_table_iterate(iter, hash, &key, &cat)) {
+ iter = event_categories_iterate_init(event);
+ while (event_categories_iterate(iter, &cat)) {
if (!first)
str_append(dest, separator);
first = FALSE;
}
- hash_table_iterate_deinit(&iter);
-
- hash_table_destroy(&hash);
+ event_categories_iterate_deinit(&iter);
}
The result has no duplicates regardless of if the array has any or if any
of the categories' ancestors are implictly or explicitly duplicated. */
void event_export_helper_fmt_categories(string_t *dest,
- struct event_category *const *cats,
- unsigned int count,
+ const struct event *event,
void (*append)(string_t *, const char *),
const char *separator);