summaryrefslogtreecommitdiffstats
path: root/src/libstat/stat_internal.h
blob: 8d0ebd4fad456379a6067051f961a0475025bef1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*-
 * 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"

#ifdef __cplusplus
extern "C" {
#endif

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;
	gint autolearn_cbref;
	struct rspamd_classifier_config *cfg;
	struct rspamd_stat_classifier *subrs;
	gpointer specific;
};

struct rspamd_statfile {
	gint id;
	struct rspamd_statfile_config *stcf;
	struct rspamd_classifier *classifier;
	struct rspamd_stat_backend *backend;
	gpointer bkcf;
};

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 ev_loop *event_loop;
	ev_timer timer_ev;
	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;

	gint lua_stat_tokens_ref;

	/* Global tokenizer */
	struct rspamd_stat_tokenizer *tokenizer;
	gpointer tkcf;

	struct ev_loop *event_loop;
};

typedef enum rspamd_learn_cache_result {
	RSPAMD_LEARN_OK = 0,
	RSPAMD_LEARN_UNLEARN,
	RSPAMD_LEARN_IGNORE
} 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");
}

#ifdef __cplusplus
}
#endif

#endif /* STAT_INTERNAL_H_ */