/*- * Copyright 2016 Vsevolod Stakhov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef STAT_INTERNAL_H_ #define STAT_INTERNAL_H_ #include "config.h" #include "task.h" #include "ref.h" #include "classifiers/classifiers.h" #include "tokenizers/tokenizers.h" #include "backends/backends.h" #include "learn_cache/learn_cache.h" struct rspamd_statfile_runtime { struct rspamd_statfile_config *st; gpointer backend_runtime; guint64 hits; guint64 total_hits; }; /* Common classifier structure */ struct rspamd_classifier { struct rspamd_stat_ctx *ctx; GArray *statfiles_ids; /* int */ struct rspamd_stat_cache *cache; gpointer cachecf; gulong spam_learns; gulong ham_learns; struct rspamd_classifier_config *cfg; struct rspamd_stat_classifier *subrs; }; struct rspamd_statfile { gint id; struct rspamd_statfile_config *stcf; struct rspamd_classifier *classifier; struct rspamd_stat_backend *backend; gpointer bkcf; }; #define RSPAMD_MAX_TOKEN_LEN 8 typedef struct token_node_s { guchar data[RSPAMD_MAX_TOKEN_LEN]; guint window_idx; guint datalen; gdouble values[]; } rspamd_token_t; struct rspamd_stat_async_elt; typedef void (*rspamd_stat_async_handler)(struct rspamd_stat_async_elt *elt, gpointer ud); typedef void (*rspamd_stat_async_cleanup)(struct rspamd_stat_async_elt *elt, gpointer ud); struct rspamd_stat_async_elt { rspamd_stat_async_handler handler; rspamd_stat_async_cleanup cleanup; struct event timer_ev; struct timeval tv; gdouble timeout; gboolean enabled; gpointer ud; ref_entry_t ref; }; struct rspamd_stat_ctx { /* Subroutines for all objects */ struct rspamd_stat_classifier *classifiers_subrs; guint classifiers_count; struct rspamd_stat_tokenizer *tokenizers_subrs; guint tokenizers_count; struct rspamd_stat_backend *backends_subrs; guint backends_count; struct rspamd_stat_cache *caches_subrs; guint caches_count; /* Runtime configuration */ GPtrArray *statfiles; /* struct rspamd_statfile */ GPtrArray *classifiers; /* struct rspamd_classifier */ GQueue *async_elts; /* struct rspamd_stat_async_elt */ struct rspamd_config *cfg; /* Global tokenizer */ struct rspamd_stat_tokenizer *tokenizer; gpointer tkcf; struct event_base *ev_base; }; typedef enum rspamd_learn_cache_result { RSPAMD_LEARN_OK = 0, RSPAMD_LEARN_UNLEARN, RSPAMD_LEARN_INGORE } rspamd_learn_t; struct rspamd_stat_ctx * rspamd_stat_get_ctx (void); struct rspamd_stat_classifier * rspamd_stat_get_classifier (const gchar *name); struct rspamd_stat_backend * rspamd_stat_get_backend (const gchar *name); struct rspamd_stat_tokenizer * rspamd_stat_get_tokenizer (const gchar *name); struct rspamd_stat_cache * rspamd_stat_get_cache (const gchar *name); struct rspamd_stat_async_elt* rspamd_stat_ctx_register_async ( rspamd_stat_async_handler handler, rspamd_stat_async_cleanup cleanup, gpointer d, gdouble timeout); static GQuark rspamd_stat_quark (void) { return g_quark_from_static_string ("rspamd-statistics"); } #endif /* STAT_INTERNAL_H_ */