From 86b0579cb7cdd349b697410297776ad73086eac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Fri, 25 Sep 2020 07:20:49 +0200 Subject: [PATCH] Write events to the SQLite database --- wdmtg.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/wdmtg.c b/wdmtg.c index c5a1f71..9d166eb 100644 --- a/wdmtg.c +++ b/wdmtg.c @@ -101,6 +101,7 @@ event_free(struct event *self) struct { GAsyncQueue *queue; // Async queue of `struct event` sqlite3 *db; // Event database + sqlite3_stmt *add_event; // Prepared statement: add event } g; struct { @@ -409,7 +410,7 @@ on_x_alarm_notify(const xcb_sync_alarm_notify_event_t *ev) } } -static gboolean +static void process_x11_event(xcb_generic_event_t *ev) { int event_code = ev->response_type & 0x7f; @@ -542,12 +543,38 @@ generator_cleanup(void) static gboolean on_queue_incoming(G_GNUC_UNUSED gpointer user_data) { + int rc = 0; + char *errmsg = NULL; + if ((rc = sqlite3_exec(g.db, "BEGIN", NULL, NULL, &errmsg))) { + g_printerr("DB BEGIN error: %s\n", errmsg); + free(errmsg); + return G_SOURCE_CONTINUE; + } + + // TODO: there should ideally be a limit to how many things can end up + // in a transaction at once (the amount of dequeues here) struct event *event = NULL; while ((event = g_async_queue_try_pop(g.queue))) { printf("Event: ts: %ld, title: %s, idle: %d\n", event->timestamp, event->title ?: "(none)", event->idle); + + if ((rc = sqlite3_bind_int64(g.add_event, 1, event->timestamp)) || + // FIXME: it will fail on NULL titles + (rc = sqlite3_bind_text(g.add_event, 2, event->title, -1, + SQLITE_STATIC)) || + (rc = sqlite3_bind_int(g.add_event, 3, event->idle))) + g_printerr("DB bind error: %s\n", sqlite3_errmsg(g.db)); + + if (((rc = sqlite3_step(g.add_event)) && rc != SQLITE_DONE) || + (rc = sqlite3_reset(g.add_event))) + g_printerr("DB write error: %s\n", sqlite3_errmsg(g.db)); + event_free(event); } + if ((rc = sqlite3_exec(g.db, "COMMIT", NULL, NULL, &errmsg))) { + g_printerr("DB commit error: %s\n", errmsg); + free(errmsg); + } return G_SOURCE_CONTINUE; } @@ -595,6 +622,11 @@ database_init(const gchar *db_path) } if ((rc = sqlite3_exec(db, "COMMIT", NULL, NULL, &errmsg))) exit_fatal("%s: %s", db_path, errmsg); + + if ((rc = sqlite3_prepare_v2(db, + "INSERT INTO events (timestamp, title, idle) VALUES (?, ?, ?)", -1, + &g.add_event, NULL))) + exit_fatal("%s: %s", db_path, sqlite3_errmsg(db)); return db; } @@ -690,6 +722,7 @@ main(int argc, char *argv[]) g_source_attach(queue_source, g_main_context_default()); // TODO: listen for connections on the control socket + // - just show/map the window when anything connects at all WdmtgWindow *window = wdmtg_window_new_with_db(g.db);