Source
/*
** Zabbix
** Copyright (C) 2001-2023 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.
**/
/* temporary cache of trigger related data */
typedef struct
{
zbx_uint32_t init;
zbx_uint32_t done;
zbx_eval_context_t eval_ctx;
zbx_eval_context_t eval_ctx_r;
zbx_vector_uint64_t hostids;
}
zbx_trigger_cache_t;
/* related trigger data caching states */
typedef enum
{
ZBX_TRIGGER_CACHE_EVAL_CTX,
ZBX_TRIGGER_CACHE_EVAL_CTX_R,
ZBX_TRIGGER_CACHE_EVAL_CTX_MACROS,
ZBX_TRIGGER_CACHE_EVAL_CTX_R_MACROS,
ZBX_TRIGGER_CACHE_HOSTIDS,
}
zbx_trigger_cache_state_t;
static int db_trigger_expand_macros(const zbx_db_trigger *trigger, zbx_eval_context_t *ctx);
/******************************************************************************
* *
* Purpose: get trigger cache with the requested data cached *
* *
* Parameters: trigger - [IN] the trigger *
* state - [IN] the required cache state *
* *
******************************************************************************/
static zbx_trigger_cache_t *db_trigger_get_cache(const zbx_db_trigger *trigger, zbx_trigger_cache_state_t state)
{
zbx_trigger_cache_t *cache;
char *error = NULL;
zbx_uint32_t flag = 1 << state;
zbx_vector_uint64_t functionids;
if (NULL == trigger->cache)
{
cache = (zbx_trigger_cache_t *)zbx_malloc(NULL, sizeof(zbx_trigger_cache_t));
cache->init = cache->done = 0;
((zbx_db_trigger *)trigger)->cache = cache;
}
else
cache = (zbx_trigger_cache_t *)trigger->cache;
if (0 != (cache->init & flag))
return 0 != (cache->done & flag) ? cache : NULL;
cache->init |= flag;
switch (state)
{
case ZBX_TRIGGER_CACHE_EVAL_CTX:
if ('\0' == *trigger->expression)
return NULL;
if (FAIL == zbx_eval_parse_expression(&cache->eval_ctx, trigger->expression,
ZBX_EVAL_TRIGGER_EXPRESSION, &error))
{
zbx_free(error);
return NULL;