Write events to the SQLite database
This commit is contained in:
parent
27a63e3414
commit
86b0579cb7
35
wdmtg.c
35
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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue