]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: event-filters - Remove separate str and intmax fields from event_filter_node
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 23 May 2023 09:38:07 +0000 (12:38 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:22:31 +0000 (14:22 +0200)
Use event_field.value's equivalent fields. This reduces memory usage.

src/lib/event-filter-parser.y
src/lib/event-filter-private.h
src/lib/event-filter.c

index 9b43bb6d3cfaf5ece896573c7a3db318b7ae73a7..6e6c639542bad42e1dfb459f5656f35a03c3e312 100644 (file)
@@ -65,9 +65,9 @@ static struct event_filter_node *key_value(struct event_filter_parser_state *sta
        case EVENT_FILTER_NODE_TYPE_EVENT_NAME_WILDCARD: {
                if (wildcard_is_escaped_literal(b)) {
                        node->type = EVENT_FILTER_NODE_TYPE_EVENT_NAME_EXACT;
-                       node->str = str_unescape(p_strdup(state->pool, b));
+                       node->field.value.str = str_unescape(p_strdup(state->pool, b));
                } else {
-                       node->str = p_strdup(state->pool, b);
+                       node->field.value.str = p_strdup(state->pool, b);
                }
                break;
        }
@@ -89,8 +89,8 @@ static struct event_filter_node *key_value(struct event_filter_parser_state *sta
                        line = 0;
                }
 
-               node->str = str_unescape(file);
-               node->intmax = line;
+               node->field.value.str = str_unescape(file);
+               node->field.value.intmax = line;
                break;
        }
        case EVENT_FILTER_NODE_TYPE_EVENT_CATEGORY:
index 1175d029af1ef4f2452d733bfc44506bc6b21873..e0c1b937725c557107ec49147d3760ef22d3e9c6 100644 (file)
@@ -61,8 +61,6 @@ struct event_filter_node {
        struct event_filter_node *children[2];
 
        /* leaf node */
-       const char *str;
-       uintmax_t intmax;
        struct {
                /*
                 * We may be dealing with one of three situations:
index 93f77193e6ad75a352ff4817fbac38b667db4160..e2dac27f4268fd40dc7cbc1df6a066143740a7f3 100644 (file)
@@ -318,8 +318,6 @@ clone_expr(pool_t pool, struct event_filter_node *old)
        new->op = old->op;
        new->children[0] = clone_expr(pool, old->children[0]);
        new->children[1] = clone_expr(pool, old->children[1]);
-       new->str = p_strdup(pool, old->str);
-       new->intmax = old->intmax;
        new->category.log_type = old->category.log_type;
        new->category.name = p_strdup(pool, old->category.name);
        new->category.ptr = old->category.ptr;
@@ -457,7 +455,7 @@ event_filter_export_query_expr(const struct event_filter_query_internal *query,
                str_append(dest, "event");
                str_append(dest, event_filter_export_query_expr_op(node->op));
                str_append_c(dest, '"');
-               event_filter_append_escaped(dest, node->str,
+               event_filter_append_escaped(dest, node->field.value.str,
                        node->type == EVENT_FILTER_NODE_TYPE_EVENT_NAME_WILDCARD);
                str_append_c(dest, '"');
                break;
@@ -465,9 +463,9 @@ event_filter_export_query_expr(const struct event_filter_query_internal *query,
                str_append(dest, "source_location");
                str_append(dest, event_filter_export_query_expr_op(node->op));
                str_append_c(dest, '"');
-               event_filter_append_escaped(dest, node->str, FALSE);
-               if (node->intmax != 0)
-                       str_printfa(dest, ":%ju", node->intmax);
+               event_filter_append_escaped(dest, node->field.value.str, FALSE);
+               if (node->field.value.intmax != 0)
+                       str_printfa(dest, ":%ju", node->field.value.intmax);
                str_append_c(dest, '"');
                break;
        case EVENT_FILTER_NODE_TYPE_EVENT_CATEGORY:
@@ -884,15 +882,16 @@ event_filter_query_match_cmp(struct event_filter_node *node,
                        i_unreached();
                case EVENT_FILTER_NODE_TYPE_EVENT_NAME_EXACT:
                        return (event->sending_name != NULL) &&
-                              strcmp(event->sending_name, node->str) == 0;
+                              strcmp(event->sending_name, node->field.value.str) == 0;
                case EVENT_FILTER_NODE_TYPE_EVENT_NAME_WILDCARD:
                        return (event->sending_name != NULL) &&
-                              wildcard_match_escaped(event->sending_name, node->str);
+                               wildcard_match_escaped(event->sending_name,
+                                                      node->field.value.str);
                case EVENT_FILTER_NODE_TYPE_EVENT_SOURCE_LOCATION:
-                       return !((source_linenum != node->intmax &&
-                                 node->intmax != 0) ||
+                       return !((source_linenum != node->field.value.intmax &&
+                                 node->field.value.intmax != 0) ||
                                 source_filename == NULL ||
-                                strcmp(event->source_filename, node->str) != 0);
+                                strcmp(event->source_filename, node->field.value.str) != 0);
                case EVENT_FILTER_NODE_TYPE_EVENT_CATEGORY:
                        return event_has_category(event, node, log_type);
                case EVENT_FILTER_NODE_TYPE_EVENT_FIELD_EXACT: