From: Timo Sirainen Date: Tue, 28 Apr 2020 15:48:07 +0000 (+0300) Subject: stats: Allow clients to update existing events with UPDATE command X-Git-Tag: 2.3.13~433 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=42c309013bcfb4dd9819139c4a4a5debb6415ff6;p=thirdparty%2Fdovecot%2Fcore.git stats: Allow clients to update existing events with UPDATE command --- diff --git a/src/stats/client-writer.c b/src/stats/client-writer.c index 0fc80c2f3a..279d3e747c 100644 --- a/src/stats/client-writer.c +++ b/src/stats/client-writer.c @@ -179,6 +179,36 @@ writer_client_input_event_begin(struct writer_client *client, return TRUE; } +static bool +writer_client_input_event_update(struct writer_client *client, + const char *const *args, const char **error_r) +{ + struct stats_event *stats_event, *parent_stats_event; + struct event *parent_event; + uint64_t event_id, parent_event_id; + + if (args[0] == NULL || args[1] == NULL || + str_to_uint64(args[0], &event_id) < 0 || + str_to_uint64(args[1], &parent_event_id) < 0) { + *error_r = "Invalid event IDs"; + return FALSE; + } + stats_event = writer_client_find_event(client, event_id); + if (stats_event == NULL) { + *error_r = "Unknown event ID"; + return FALSE; + } + parent_stats_event = parent_event_id == 0 ? NULL : + writer_client_find_event(client, parent_event_id); + parent_event = parent_stats_event == NULL ? NULL : + parent_stats_event->event; + if (stats_event->event->parent != parent_event) { + *error_r = "Event unexpectedly changed parent"; + return FALSE; + } + return event_import_unescaped(stats_event->event, args, error_r); +} + static bool writer_client_input_event_end(struct writer_client *client, const char *const *args, const char **error_r) @@ -252,6 +282,8 @@ writer_client_input_args(struct connection *conn, const char *const *args) ret = writer_client_input_event(client, args+1, &error); else if (strcmp(cmd, "BEGIN") == 0) ret = writer_client_input_event_begin(client, args+1, &error); + else if (strcmp(cmd, "UPDATE") == 0) + ret = writer_client_input_event_update(client, args+1, &error); else if (strcmp(cmd, "END") == 0) ret = writer_client_input_event_end(client, args+1, &error); else if (strcmp(cmd, "CATEGORY") == 0)