]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
stats: Allow clients to update existing events with UPDATE command
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 28 Apr 2020 15:48:07 +0000 (18:48 +0300)
committerjeff.sipek <jeff.sipek@open-xchange.com>
Tue, 4 Aug 2020 21:34:56 +0000 (21:34 +0000)
src/stats/client-writer.c

index 0fc80c2f3a01ccf773e68886e3d8a2d8af9c7bde..279d3e747c225507e667277f02828e0488030e14 100644 (file)
@@ -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)