}
static bool
-event_match_field(struct event *event, struct event_filter_node *node,
- bool use_strcmp, const char *source_filename,
- unsigned int source_linenum)
+event_match_field(struct event_filter *filter, struct event *event,
+ struct event_filter_node *node, bool use_strcmp,
+ const char *source_filename, unsigned int source_linenum)
{
const struct event_field *field;
struct event_field duration;
wanted_field->value.str[0] == '\0';
}
T_BEGIN {
- ret = cmp_value(field->value.str, wanted_field, cmp_flags);
+ if (filter->cmp_key != NULL &&
+ strcmp(wanted_field->key, filter->cmp_key) == 0) {
+ ret = filter->cmp_key_func(field->value.str,
+ wanted_field_value_str(wanted_field));
+ } else {
+ ret = cmp_value(field->value.str, wanted_field, cmp_flags);
+ }
} T_END;
return ret;
case EVENT_FIELD_VALUE_TYPE_INTMAX:
}
static bool
-event_filter_query_match_cmp(struct event_filter_node *node,
+event_filter_query_match_cmp(struct event_filter *filter,
+ struct event_filter_node *node,
struct event *event, const char *source_filename,
unsigned int source_linenum,
enum event_filter_log_type log_type)
case EVENT_FILTER_NODE_TYPE_EVENT_CATEGORY:
return event_has_category(event, node, log_type);
case EVENT_FILTER_NODE_TYPE_EVENT_FIELD_EXACT:
- return event_match_field(event, node, TRUE, source_filename, source_linenum);
+ return event_match_field(filter, event, node, TRUE,
+ source_filename, source_linenum);
case EVENT_FILTER_NODE_TYPE_EVENT_FIELD_WILDCARD:
case EVENT_FILTER_NODE_TYPE_EVENT_FIELD_NUMERIC_WILDCARD:
- return event_match_field(event, node, FALSE, source_filename, source_linenum);
+ return event_match_field(filter, event, node, FALSE,
+ source_filename, source_linenum);
}
i_unreached();
}
bool
-event_filter_query_match_eval(struct event_filter_node *node,
+event_filter_query_match_eval(struct event_filter *filter,
+ struct event_filter_node *node,
struct event *event, const char *source_filename,
unsigned int source_linenum,
enum event_filter_log_type log_type)
case EVENT_FILTER_OP_CMP_LT:
case EVENT_FILTER_OP_CMP_GE:
case EVENT_FILTER_OP_CMP_LE:
- return event_filter_query_match_cmp(node, event, source_filename,
- source_linenum, log_type);
+ return event_filter_query_match_cmp(filter, node, event,
+ source_filename, source_linenum, log_type);
case EVENT_FILTER_OP_AND:
- return event_filter_query_match_eval(node->children[0], event,
- source_filename, source_linenum,
- log_type) &&
- event_filter_query_match_eval(node->children[1], event,
- source_filename, source_linenum,
- log_type);
+ return event_filter_query_match_eval(filter, node->children[0],
+ event, source_filename, source_linenum, log_type) &&
+ event_filter_query_match_eval(filter, node->children[1],
+ event, source_filename, source_linenum, log_type);
case EVENT_FILTER_OP_OR:
- return event_filter_query_match_eval(node->children[0], event,
- source_filename, source_linenum,
- log_type) ||
- event_filter_query_match_eval(node->children[1], event,
- source_filename, source_linenum,
- log_type);
+ return event_filter_query_match_eval(filter, node->children[0],
+ event, source_filename, source_linenum, log_type) ||
+ event_filter_query_match_eval(filter, node->children[1],
+ event, source_filename, source_linenum, log_type);
case EVENT_FILTER_OP_NOT:
- return !event_filter_query_match_eval(node->children[0], event,
- source_filename, source_linenum,
- log_type);
+ return !event_filter_query_match_eval(filter, node->children[0],
+ event, source_filename, source_linenum, log_type);
}
i_unreached();
}
static bool
-event_filter_query_match(const struct event_filter_query_internal *query,
+event_filter_query_match(struct event_filter *filter,
+ const struct event_filter_query_internal *query,
struct event *event, const char *source_filename,
unsigned int source_linenum,
const struct failure_context *ctx)
i_assert(ctx->type < N_ELEMENTS(event_filter_log_type_map));
log_type = event_filter_log_type_map[ctx->type].log_type;
- return event_filter_query_match_eval(query->expr, event, source_filename,
- source_linenum, log_type);
+ return event_filter_query_match_eval(filter, query->expr, event,
+ source_filename, source_linenum,
+ log_type);
}
static bool
return FALSE;
array_foreach(&filter->queries, query) {
- if (event_filter_query_match(query, event, source_filename,
- source_linenum, ctx))
+ if (event_filter_query_match(filter, query, event,
+ source_filename, source_linenum,
+ ctx))
return TRUE;
}
return FALSE;
iter->idx++;
if (query->context != NULL &&
- event_filter_query_match(query, iter->event,
+ event_filter_query_match(iter->filter, query, iter->event,
iter->event->source_filename,
iter->event->source_linenum,
iter->failure_ctx))
i_free(iter);
}
+void event_filter_register_cmp(struct event_filter *filter, const char *key,
+ event_filter_cmp *cmp)
+{
+ /* for now we need to support just one */
+ i_assert(filter->cmp_key == NULL);
+
+ filter->cmp_key = p_strdup(filter->pool, key);
+ filter->cmp_key_func = cmp;
+}
+
static void
event_filter_query_update_category(struct event_filter_query_internal *query,
struct event_filter_node *node,