diff options
author | Andris Zeila <andris.zeila@zabbix.com> | 2021-01-23 19:08:46 +0300 |
---|---|---|
committer | Andris Zeila <andris.zeila@zabbix.com> | 2021-01-23 19:08:46 +0300 |
commit | 477f6cf0ec943b422d571b256d4fb45160bb7744 (patch) | |
tree | 6999e9dddc33485efd73ecda7a09f9465e7577f1 /include | |
parent | 5afa58b768619e2a636aa3b5ca6473a1621aeb2f (diff) |
.......PS. [ZBXNEXT-6451] moved expression parsing code to separate library to avoid cyclic dependencies
Diffstat (limited to 'include')
-rw-r--r-- | include/dbcache.h | 4 | ||||
-rw-r--r-- | include/zbxeval.h | 176 | ||||
-rw-r--r-- | include/zbxserver.h | 148 | ||||
-rw-r--r-- | include/zbxvariant.h | 85 |
4 files changed, 265 insertions, 148 deletions
diff --git a/include/dbcache.h b/include/dbcache.h index 7759d3d645f..e9c07adf576 100644 --- a/include/dbcache.h +++ b/include/dbcache.h @@ -26,6 +26,7 @@ #include "zbxalgo.h" #include "zbxjson.h" #include "memalloc.h" +#include "zbxeval.h" #define ZBX_SYNC_DONE 0 #define ZBX_SYNC_MORE 1 @@ -257,6 +258,9 @@ typedef struct _DC_TRIGGER unsigned char flags; zbx_vector_ptr_t tags; + + zbx_eval_context_t *eval_ctx; + zbx_eval_context_t *eval_ctx_r; } DC_TRIGGER; diff --git a/include/zbxeval.h b/include/zbxeval.h new file mode 100644 index 00000000000..c9482108acd --- /dev/null +++ b/include/zbxeval.h @@ -0,0 +1,176 @@ +/* +** Zabbix +** Copyright (C) 2001-2021 Zabbix SIA +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +**/ + +#ifndef ZABBIX_ZBXEVAL_H +#define ZABBIX_ZBXEVAL_H + +#include "common.h" +#include "zbxalgo.h" +#include "zbxvariant.h" + +/* + * Token type flags (32 bits): + * | 6 bits | 4 bits | 22 bits | + * | token class | operator precedence | token type | + */ +#define ZBX_EVAL_CLASS_OPERAND (__UINT64_C(0x01) << 26) +#define ZBX_EVAL_CLASS_OPERATOR1 (__UINT64_C(0x02) << 26) +#define ZBX_EVAL_CLASS_OPERATOR2 (__UINT64_C(0x04) << 26) +#define ZBX_EVAL_CLASS_FUNCTION (__UINT64_C(0x08) << 26) +#define ZBX_EVAL_CLASS_SEPARATOR (__UINT64_C(0x10) << 26) +#define ZBX_EVAL_CLASS_OPERATOR (ZBX_EVAL_CLASS_OPERATOR1 | ZBX_EVAL_CLASS_OPERATOR2) + +#define ZBX_EVAL_BEFORE_OPERAND (ZBX_EVAL_CLASS_OPERATOR | ZBX_EVAL_CLASS_SEPARATOR) +#define ZBX_EVAL_BEFORE_OPERATOR (ZBX_EVAL_CLASS_OPERAND) + +#define ZBX_EVAL_OP_SET_PRECEDENCE(x) ((x) << 22) +#define ZBX_EVAL_OP_PRIORITY ZBX_EVAL_OP_SET_PRECEDENCE(0xf) + +#define ZBX_EVAL_TOKEN_OP_ADD (1 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(4)) +#define ZBX_EVAL_TOKEN_OP_SUB (2 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(4)) +#define ZBX_EVAL_TOKEN_OP_MUL (3 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(3)) +#define ZBX_EVAL_TOKEN_OP_DIV (4 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(3)) +#define ZBX_EVAL_TOKEN_OP_MINUS (5 | ZBX_EVAL_CLASS_OPERATOR1 | ZBX_EVAL_OP_SET_PRECEDENCE(2)) +#define ZBX_EVAL_TOKEN_OP_EQ (6 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(7)) +#define ZBX_EVAL_TOKEN_OP_LT (7 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) +#define ZBX_EVAL_TOKEN_OP_GT (8 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) +#define ZBX_EVAL_TOKEN_OP_LE (9 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) +#define ZBX_EVAL_TOKEN_OP_GE (10 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) +#define ZBX_EVAL_TOKEN_OP_NE (11 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(7)) +#define ZBX_EVAL_TOKEN_OP_AND (12 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(11)) +#define ZBX_EVAL_TOKEN_OP_OR (13 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(12)) +#define ZBX_EVAL_TOKEN_OP_NOT (14 | ZBX_EVAL_CLASS_OPERATOR1 | ZBX_EVAL_OP_SET_PRECEDENCE(2)) +#define ZBX_EVAL_TOKEN_VAR_NUM (15 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_VAR_STR (16 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_VAR_TIME (17 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_VAR_MACRO (18 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_VAR_USERMACRO (19 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_VAR_LLDMACRO (20 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_FUNCTIONID (21 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_FUNCTION (22 | ZBX_EVAL_CLASS_FUNCTION) +#define ZBX_EVAL_TOKEN_HIST_FUNCTION (23 | ZBX_EVAL_CLASS_FUNCTION) +#define ZBX_EVAL_TOKEN_GROUP_OPEN (24 | ZBX_EVAL_CLASS_SEPARATOR) +#define ZBX_EVAL_TOKEN_GROUP_CLOSE (25 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_COMMA (26 | ZBX_EVAL_CLASS_SEPARATOR) +#define ZBX_EVAL_TOKEN_ARG_QUERY (27 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_ARG_TIME (28 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_ARG_NULL (29 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_ARG_RAW (30 | ZBX_EVAL_CLASS_OPERAND) +#define ZBX_EVAL_TOKEN_EXCEPTION (31 | ZBX_EVAL_CLASS_FUNCTION) + +/* expression parsing rules */ + +#define ZBX_EVAL_PARSE_MACRO __UINT64_C(0x0001) +#define ZBX_EVAL_PARSE_USERMACRO __UINT64_C(0x0002) +#define ZBX_EVAL_PARSE_LLDMACRO __UINT64_C(0x0004) +#define ZBX_EVAL_PARSE_FUNCTIONID __UINT64_C(0x0008) +#define ZBX_EVAL_PARSE_ITEM_QUERY __UINT64_C(0x0010) +#define ZBX_EVAL_PARSE_FUNCTION __UINT64_C(0x0020) +#define ZBX_EVAL_PARSE_CONST_INDEX __UINT64_C(0x0040) + +#define ZBX_EVAL_PARSE_TRIGGER_EXPRESSSION (ZBX_EVAL_PARSE_MACRO | ZBX_EVAL_PARSE_USERMACRO | \ + ZBX_EVAL_PARSE_FUNCTIONID | ZBX_EVAL_PARSE_FUNCTION) + +#define ZBX_EVAL_PARSE_CALC_EXPRESSSION (ZBX_EVAL_PARSE_MACRO | ZBX_EVAL_PARSE_USERMACRO | \ + ZBX_EVAL_PARSE_ITEM_QUERY | ZBX_EVAL_PARSE_FUNCTION) + +/* expression composition rules */ + +#define ZBX_EVAL_QUOTE_MACRO __UINT64_C(0x00010000) +#define ZBX_EVAL_QUOTE_USERMACRO __UINT64_C(0x00020000) +#define ZBX_EVAL_QUOTE_LLDMACRO __UINT64_C(0x00040000) + +#define ZBX_EVAL_COMPOSE_TRIGGER_EXPRESSION (ZBX_EVAL_QUOTE_MACRO | ZBX_EVAL_QUOTE_USERMACRO) +#define ZBX_EVAL_COMPOSE_LLD_EXPRESSION ZBX_EVAL_QUOTE_LLDMACRO + +/* expression evaluation rules */ + +#define ZBX_EVAL_PROCESS_ERROR __UINT64_C(0x000100000000) + +/* composite rules */ + +#define ZBX_EVAL_TRIGGER_EXPRESSION (ZBX_EVAL_PARSE_TRIGGER_EXPRESSSION | \ + ZBX_EVAL_COMPOSE_TRIGGER_EXPRESSION | \ + ZBX_EVAL_PROCESS_ERROR) + +typedef zbx_uint32_t zbx_token_type_t; + +/****************************************************************************** + * * + * Typedef: zbx_eval_function_cb_t * + * * + * Purpose: define callback function to calculate custom functions * + * * + * Parameters: name - [IN] the function name (not zero terminated) * + * len - [IN] the function name length * + * args_num - [IN] the number of function arguments * + * args - [IN] an array of the function arguments. * + * value - [OUT] the function return value * + * error - [OUT] the error message if function failed * + * * + * Return value: SUCCEED - the function was executed successfully * + * FAIL - otherwise * + * * + ******************************************************************************/ +typedef int (*zbx_eval_function_cb_t)(const char *name, size_t len, int args_num, const zbx_variant_t *args, + zbx_variant_t *value, char **error); + +typedef struct +{ + zbx_token_type_t type; + zbx_uint32_t opt; + zbx_strloc_t loc; + zbx_variant_t value; +} +zbx_eval_token_t; + +ZBX_VECTOR_DECL(eval_token, zbx_eval_token_t) + +typedef struct +{ + const char *expression; + zbx_token_type_t last_token_type; + int const_index; + int functionid_index; + zbx_uint64_t rules; + zbx_timespec_t ts; + zbx_vector_eval_token_t stack; + zbx_vector_eval_token_t ops; + zbx_eval_function_cb_t function_cb; +} +zbx_eval_context_t; + +typedef char *(*zbx_macro_resolve_func_t)(const char *str, size_t length, zbx_uint64_t *hostids, + int hostids_num); + +int zbx_eval_parse_expression(zbx_eval_context_t *ctx, const char *expression, zbx_uint64_t rules, char **error); +void zbx_eval_clear(zbx_eval_context_t *ctx); +size_t zbx_eval_serialize(const zbx_eval_context_t *ctx, zbx_mem_malloc_func_t malloc_func, unsigned char **data); +void zbx_eval_deserialize(zbx_eval_context_t *ctx, const char *expression, zbx_uint64_t rules, + const unsigned char *data); +void zbx_eval_compose_expression(const zbx_eval_context_t *ctx, char **expression); +int zbx_eval_execute(zbx_eval_context_t *ctx, const zbx_timespec_t *ts, zbx_variant_t *value, char **error); +int zbx_eval_execute_ext(zbx_eval_context_t *ctx, const zbx_timespec_t *ts, zbx_eval_function_cb_t function_cb, + zbx_variant_t *value, char **error); +void zbx_eval_get_functionids(const zbx_eval_context_t *ctx, zbx_vector_uint64_t *functionids); +void zbx_eval_expand_user_macros(const zbx_eval_context_t *ctx, zbx_uint64_t *hostids, int hostids_num, + zbx_macro_resolve_func_t resolver_cb); +void zbx_eval_set_exception(zbx_eval_context_t *ctx, char *message); + +#endif diff --git a/include/zbxserver.h b/include/zbxserver.h index 7864987b092..29999ee4490 100644 --- a/include/zbxserver.h +++ b/include/zbxserver.h @@ -110,152 +110,4 @@ int substitute_macros_in_json_pairs(char **data, const struct zbx_json_parse *jp const zbx_vector_ptr_t *lld_macro_paths, char *error, int maxerrlen); int xml_xpath_check(const char *xpath, char *error, size_t errlen); -/* - * Token type flags (32 bits): - * | 6 bits | 4 bits | 22 bits | - * | token class | operator precedence | token type | - */ -#define ZBX_EVAL_CLASS_OPERAND (__UINT64_C(0x01) << 26) -#define ZBX_EVAL_CLASS_OPERATOR1 (__UINT64_C(0x02) << 26) -#define ZBX_EVAL_CLASS_OPERATOR2 (__UINT64_C(0x04) << 26) -#define ZBX_EVAL_CLASS_FUNCTION (__UINT64_C(0x08) << 26) -#define ZBX_EVAL_CLASS_SEPARATOR (__UINT64_C(0x10) << 26) -#define ZBX_EVAL_CLASS_OPERATOR (ZBX_EVAL_CLASS_OPERATOR1 | ZBX_EVAL_CLASS_OPERATOR2) - -#define ZBX_EVAL_BEFORE_OPERAND (ZBX_EVAL_CLASS_OPERATOR | ZBX_EVAL_CLASS_SEPARATOR) -#define ZBX_EVAL_BEFORE_OPERATOR (ZBX_EVAL_CLASS_OPERAND) - -#define ZBX_EVAL_OP_SET_PRECEDENCE(x) ((x) << 22) -#define ZBX_EVAL_OP_PRIORITY ZBX_EVAL_OP_SET_PRECEDENCE(0xf) - -#define ZBX_EVAL_TOKEN_OP_ADD (1 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(4)) -#define ZBX_EVAL_TOKEN_OP_SUB (2 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(4)) -#define ZBX_EVAL_TOKEN_OP_MUL (3 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(3)) -#define ZBX_EVAL_TOKEN_OP_DIV (4 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(3)) -#define ZBX_EVAL_TOKEN_OP_MINUS (5 | ZBX_EVAL_CLASS_OPERATOR1 | ZBX_EVAL_OP_SET_PRECEDENCE(2)) -#define ZBX_EVAL_TOKEN_OP_EQ (6 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(7)) -#define ZBX_EVAL_TOKEN_OP_LT (7 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) -#define ZBX_EVAL_TOKEN_OP_GT (8 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) -#define ZBX_EVAL_TOKEN_OP_LE (9 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) -#define ZBX_EVAL_TOKEN_OP_GE (10 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(6)) -#define ZBX_EVAL_TOKEN_OP_NE (11 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(7)) -#define ZBX_EVAL_TOKEN_OP_AND (12 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(11)) -#define ZBX_EVAL_TOKEN_OP_OR (13 | ZBX_EVAL_CLASS_OPERATOR2 | ZBX_EVAL_OP_SET_PRECEDENCE(12)) -#define ZBX_EVAL_TOKEN_OP_NOT (14 | ZBX_EVAL_CLASS_OPERATOR1 | ZBX_EVAL_OP_SET_PRECEDENCE(2)) -#define ZBX_EVAL_TOKEN_VAR_NUM (15 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_VAR_STR (16 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_VAR_TIME (17 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_VAR_MACRO (18 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_VAR_USERMACRO (19 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_VAR_LLDMACRO (20 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_FUNCTIONID (21 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_FUNCTION (22 | ZBX_EVAL_CLASS_FUNCTION) -#define ZBX_EVAL_TOKEN_HIST_FUNCTION (23 | ZBX_EVAL_CLASS_FUNCTION) -#define ZBX_EVAL_TOKEN_GROUP_OPEN (24 | ZBX_EVAL_CLASS_SEPARATOR) -#define ZBX_EVAL_TOKEN_GROUP_CLOSE (25 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_COMMA (26 | ZBX_EVAL_CLASS_SEPARATOR) -#define ZBX_EVAL_TOKEN_ARG_QUERY (27 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_ARG_TIME (28 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_ARG_NULL (29 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_ARG_RAW (30 | ZBX_EVAL_CLASS_OPERAND) -#define ZBX_EVAL_TOKEN_EXCEPTION (31 | ZBX_EVAL_CLASS_FUNCTION) - -/* expression parsing rules */ - -#define ZBX_EVAL_PARSE_MACRO __UINT64_C(0x0001) -#define ZBX_EVAL_PARSE_USERMACRO __UINT64_C(0x0002) -#define ZBX_EVAL_PARSE_LLDMACRO __UINT64_C(0x0004) -#define ZBX_EVAL_PARSE_FUNCTIONID __UINT64_C(0x0008) -#define ZBX_EVAL_PARSE_ITEM_QUERY __UINT64_C(0x0010) -#define ZBX_EVAL_PARSE_FUNCTION __UINT64_C(0x0020) -#define ZBX_EVAL_PARSE_CONST_INDEX __UINT64_C(0x0040) - -#define ZBX_EVAL_PARSE_TRIGGER_EXPRESSSION (ZBX_EVAL_PARSE_MACRO | ZBX_EVAL_PARSE_USERMACRO | \ - ZBX_EVAL_PARSE_FUNCTIONID | ZBX_EVAL_PARSE_FUNCTION) - -#define ZBX_EVAL_PARSE_CALC_EXPRESSSION (ZBX_EVAL_PARSE_MACRO | ZBX_EVAL_PARSE_USERMACRO | \ - ZBX_EVAL_PARSE_ITEM_QUERY | ZBX_EVAL_PARSE_FUNCTION) - -/* expression composition rules */ - -#define ZBX_EVAL_QUOTE_MACRO __UINT64_C(0x00010000) -#define ZBX_EVAL_QUOTE_USERMACRO __UINT64_C(0x00020000) -#define ZBX_EVAL_QUOTE_LLDMACRO __UINT64_C(0x00040000) - -#define ZBX_EVAL_COMPOSE_TRIGGER_EXPRESSION (ZBX_EVAL_QUOTE_MACRO | ZBX_EVAL_QUOTE_USERMACRO) -#define ZBX_EVAL_COMPOSE_LLD_EXPRESSION ZBX_EVAL_QUOTE_LLDMACRO - -/* expression evaluation rules */ - -#define ZBX_EVAL_PROCESS_ERROR __UINT64_C(0x000100000000) - -/* composite rules */ - -#define ZBX_EVAL_TRIGGER_EXPRESSION (ZBX_EVAL_PARSE_TRIGGER_EXPRESSSION | \ - ZBX_EVAL_COMPOSE_TRIGGER_EXPRESSION | \ - ZBX_EVAL_PROCESS_ERROR) - -typedef zbx_uint32_t zbx_token_type_t; - -/****************************************************************************** - * * - * Typedef: zbx_eval_function_cb_t * - * * - * Purpose: define callback function to calculate custom functions * - * * - * Parameters: name - [IN] the function name (not zero terminated) * - * len - [IN] the function name length * - * args_num - [IN] the number of function arguments * - * args - [IN] an array of the function arguments. * - * value - [OUT] the function return value * - * error - [OUT] the error message if function failed * - * * - * Return value: SUCCEED - the function was executed successfully * - * FAIL - otherwise * - * * - ******************************************************************************/ -typedef int (*zbx_eval_function_cb_t)(const char *name, size_t len, int args_num, const zbx_variant_t *args, - zbx_variant_t *value, char **error); - -typedef struct -{ - zbx_token_type_t type; - zbx_uint32_t opt; - zbx_strloc_t loc; - zbx_variant_t value; -} -zbx_eval_token_t; - -ZBX_VECTOR_DECL(eval_token, zbx_eval_token_t) - -typedef struct -{ - const char *expression; - zbx_token_type_t last_token_type; - int const_index; - int functionid_index; - zbx_uint64_t rules; - zbx_timespec_t ts; - zbx_vector_eval_token_t stack; - zbx_vector_eval_token_t ops; - zbx_eval_function_cb_t function_cb; -} -zbx_eval_context_t; - -typedef char *(*zbx_macro_resolve_func_t)(const char *str, size_t length, zbx_uint64_t *hostids, - int hostids_num); - -int zbx_eval_parse_expression(zbx_eval_context_t *ctx, const char *expression, zbx_uint64_t rules, char **error); -void zbx_eval_clear(zbx_eval_context_t *ctx); -size_t zbx_eval_serialize(const zbx_eval_context_t *ctx, zbx_mem_malloc_func_t malloc_func, unsigned char **data); -void zbx_eval_deserialize(zbx_eval_context_t *ctx, const char *expression, zbx_uint64_t rules, - const unsigned char *data); -void zbx_eval_compose_expression(const zbx_eval_context_t *ctx, char **expression); -int zbx_eval_execute(zbx_eval_context_t *ctx, const zbx_timespec_t *ts, zbx_variant_t *value, char **error); -int zbx_eval_execute_ext(zbx_eval_context_t *ctx, const zbx_timespec_t *ts, zbx_eval_function_cb_t function_cb, - zbx_variant_t *value, char **error); -void zbx_eval_get_functionids(const zbx_eval_context_t *ctx, zbx_vector_uint64_t *functionids); -void zbx_eval_expand_user_macros(const zbx_eval_context_t *ctx, zbx_uint64_t *hostids, int hostids_num, - zbx_macro_resolve_func_t resolver_cb); -void zbx_eval_set_exception(zbx_eval_context_t *ctx, char *message); #endif diff --git a/include/zbxvariant.h b/include/zbxvariant.h new file mode 100644 index 00000000000..bd1d15e2ad9 --- /dev/null +++ b/include/zbxvariant.h @@ -0,0 +1,85 @@ +/* +** Zabbix +** Copyright (C) 2001-2020 Zabbix SIA +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +**/ + +#ifndef ZABBIX_ZBXVARIANT_H +#define ZABBIX_ZBXVARIANT_H + +#include "common.h" +#include "zbxalgo.h" + +typedef union +{ + zbx_uint64_t ui64; + double dbl; + + /* null terminated string */ + char *str; + + /* length prefixed (4 bytes) binary data */ + void *bin; + + zbx_vector_dbl_t *dbl_vector; + + /* null terminated error message */ + char *err; +} +zbx_variant_data_t; + +struct zbx_variant +{ + unsigned char type; + zbx_variant_data_t data; +}; + +#define ZBX_VARIANT_NONE 0 +#define ZBX_VARIANT_STR 1 +#define ZBX_VARIANT_DBL 2 +#define ZBX_VARIANT_UI64 3 +#define ZBX_VARIANT_BIN 4 +#define ZBX_VARIANT_DBL_VECTOR 5 +#define ZBX_VARIANT_ERR 6 + +void zbx_variant_clear(zbx_variant_t *value); +void zbx_variant_set_none(zbx_variant_t *value); +void zbx_variant_set_str(zbx_variant_t *value, char *text); +void zbx_variant_set_dbl(zbx_variant_t *value, double value_dbl); +void zbx_variant_set_ui64(zbx_variant_t *value, zbx_uint64_t value_ui64); +void zbx_variant_set_bin(zbx_variant_t *value, void *value_bin); +void zbx_variant_set_error(zbx_variant_t *value, char *error); +void zbx_variant_set_dbl_vector(zbx_variant_t *value, zbx_vector_dbl_t *dbl_vector); + +void zbx_variant_copy(zbx_variant_t *value, const zbx_variant_t *source); +int zbx_variant_set_numeric(zbx_variant_t *value, const char *text); + +int zbx_variant_convert(zbx_variant_t *value, int type); +const char *zbx_get_variant_type_desc(unsigned char type); +const char *zbx_variant_value_desc(const zbx_variant_t *value); +const char *zbx_variant_type_desc(const zbx_variant_t *value); + +int zbx_variant_compare(const zbx_variant_t *value1, const zbx_variant_t *value2); + +void *zbx_variant_data_bin_copy(const void *bin); +void *zbx_variant_data_bin_create(const void *data, zbx_uint32_t size); +zbx_uint32_t zbx_variant_data_bin_get(const void *bin, void **data); + +int zbx_variant_to_value_type(zbx_variant_t *value, unsigned char value_type, int dbl_precision, char **errmsg); + +ZBX_VECTOR_DECL(var, zbx_variant_t) + +#endif |