From: Vsevolod Stakhov Date: Wed, 25 Apr 2018 13:07:31 +0000 (+0100) Subject: [Minor] Add basic traversal helpers X-Git-Tag: 1.7.4~36 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=eb44a88a9405e9500e94c32395d69ab6460c4a9d;p=rspamd.git [Minor] Add basic traversal helpers --- diff --git a/src/libutil/map.c b/src/libutil/map.c index 0a27365eb..698ccf3fd 100644 --- a/src/libutil/map.c +++ b/src/libutil/map.c @@ -2231,4 +2231,13 @@ rspamd_map_get_traverse_function (struct rspamd_map *map) } return NULL; -} \ No newline at end of file +} + +void +rspamd_map_traverse (struct rspamd_map *map, rspamd_map_traverse_cb cb, + gpointer cbdata, gboolean reset_hits) +{ + if (*map->user_data && map->traverse_function) { + map->traverse_function (*map->user_data, cb, cbdata, reset_hits); + } +} diff --git a/src/libutil/map.h b/src/libutil/map.h index 75c8788ca..d10ee331a 100644 --- a/src/libutil/map.h +++ b/src/libutil/map.h @@ -25,7 +25,8 @@ typedef void (*map_fin_cb_t)(struct map_cb_data *data); typedef gboolean (*rspamd_map_traverse_cb)(gconstpointer key, gconstpointer value, gsize hits, gpointer ud); -typedef void (*rspamd_map_traverse_function)(rspamd_map_traverse_cb cb, +typedef void (*rspamd_map_traverse_function)(void *data, + rspamd_map_traverse_cb cb, gpointer cbdata, gboolean reset_hits); /** @@ -89,4 +90,15 @@ void rspamd_map_remove_all (struct rspamd_config *cfg); */ rspamd_map_traverse_function rspamd_map_get_traverse_function (struct rspamd_map *map); +/** + * Perform map traverse + * @param map + * @param cb + * @param cbdata + * @param reset_hits + * @return + */ +void rspamd_map_traverse (struct rspamd_map *map, rspamd_map_traverse_cb cb, + gpointer cbdata, gboolean reset_hits); + #endif diff --git a/src/libutil/map_helpers.c b/src/libutil/map_helpers.c index 7bb442a97..b7d6acb49 100644 --- a/src/libutil/map_helpers.c +++ b/src/libutil/map_helpers.c @@ -568,6 +568,26 @@ rspamd_map_helper_insert_re (gpointer st, gconstpointer key, gconstpointer value g_ptr_array_add (re_map->values, val); } +static void +rspamd_map_helper_traverse_regexp (void *data, + rspamd_map_traverse_cb cb, + gpointer cbdata, + gboolean reset_hits) +{ + gconstpointer k; + struct rspamd_map_helper_value *val; + struct rspamd_regexp_map_helper *re_map = data; + + kh_foreach (re_map->htb, k, val, { + if (!cb (k, val->value, val->hits, cbdata)) { + break; + } + + if (reset_hits) { + val->hits = 0; + } + }); +} struct rspamd_hash_map_helper * rspamd_map_helper_new_hash (struct rspamd_map *map) @@ -602,6 +622,27 @@ rspamd_map_helper_destroy_hash (struct rspamd_hash_map_helper *r) rspamd_mempool_delete (r->pool); } +static void +rspamd_map_helper_traverse_hash (void *data, + rspamd_map_traverse_cb cb, + gpointer cbdata, + gboolean reset_hits) +{ + gconstpointer k; + struct rspamd_map_helper_value *val; + struct rspamd_hash_map_helper *ht = data; + + kh_foreach (ht->htb, k, val, { + if (!cb (k, val->value, val->hits, cbdata)) { + break; + } + + if (reset_hits) { + val->hits = 0; + } + }); +} + struct rspamd_radix_map_helper * rspamd_map_helper_new_radix (struct rspamd_map *map) { @@ -636,6 +677,27 @@ rspamd_map_helper_destroy_radix (struct rspamd_radix_map_helper *r) rspamd_mempool_delete (r->pool); } +static void +rspamd_map_helper_traverse_radix (void *data, + rspamd_map_traverse_cb cb, + gpointer cbdata, + gboolean reset_hits) +{ + gconstpointer k; + struct rspamd_map_helper_value *val; + struct rspamd_radix_map_helper *r = data; + + kh_foreach (r->htb, k, val, { + if (!cb (k, val->value, val->hits, cbdata)) { + break; + } + + if (reset_hits) { + val->hits = 0; + } + }); +} + struct rspamd_regexp_map_helper * rspamd_map_helper_new_regexp (struct rspamd_map *map, enum rspamd_regexp_map_flags flags) @@ -732,6 +794,7 @@ rspamd_kv_list_fin (struct map_cb_data *data) if (data->cur_data) { htb = (struct rspamd_hash_map_helper *)data->cur_data; msg_info_map ("read hash of %d elements", kh_size (htb->htb)); + data->map->traverse_function = rspamd_map_helper_traverse_hash; } } @@ -774,6 +837,7 @@ rspamd_radix_fin (struct map_cb_data *data) r = (struct rspamd_radix_map_helper *)data->cur_data; msg_info_map ("read radix trie of %z elements: %s", radix_get_size (r->trie), radix_get_info (r->trie)); + data->map->traverse_function = rspamd_map_helper_traverse_radix; } } @@ -951,6 +1015,7 @@ rspamd_regexp_list_fin (struct map_cb_data *data) rspamd_re_map_finalize (re_map); msg_info_map ("read regexp list of %ud elements", re_map->regexps->len); + data->map->traverse_function = rspamd_map_helper_traverse_regexp; } }