diff options
| author | Martin Stensgård <mastensg@mastensg.net> | 2025-07-06 20:24:51 +0200 |
|---|---|---|
| committer | Martin Stensgård <mastensg@mastensg.net> | 2025-07-06 20:24:51 +0200 |
| commit | b7e80be754df87c9190993338b973157cfa558b9 (patch) | |
| tree | 21059df59b224ea7be7ae3aa2205d21325bbd6c9 | |
| parent | f6094cbc3ede9c7e61d019ffe352a4d7627309e9 (diff) | |
opplysning: load booking events from database
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | opplysning.c | 82 |
2 files changed, 78 insertions, 8 deletions
@@ -27,8 +27,8 @@ check_ical: check_ical.c import_booking: import_booking.c sqlite.o $(CC) $(CFLAGS) -o $@ import_booking.c sqlite.o -lical -licalss -licalvcal -opplysning: opplysning.c - $(CC) $(CFLAGS) -o $@ opplysning.c $(LIBS) +opplysning: opplysning.c sqlite.o + $(CC) $(CFLAGS) -o $@ opplysning.c sqlite.o $(LIBS) select_booking: select_booking.c sqlite.o $(CC) $(CFLAGS) -o $@ select_booking.c sqlite.o diff --git a/opplysning.c b/opplysning.c index 011a6c0..8a466f2 100644 --- a/opplysning.c +++ b/opplysning.c @@ -11,6 +11,10 @@ #include <libical/ical.h> #include <raylib.h> +#include "sqlite/sqlite3.h" + +static const char *DATABASE = "booking.db"; + // Unfortunately, 0 = Sunday. int weekday(int year, int month, int day) @@ -34,7 +38,7 @@ const char *ukedag[] = { enum { MAX_EVENTS = 64, - SIZEOF_TITLE = 256, + SIZEOF_TITLE = 60, }; struct event { int year; @@ -43,6 +47,8 @@ struct event { int wday; int hour; int minute; + int end_hour; + int end_minute; char title[SIZEOF_TITLE]; }; struct event the_events[MAX_EVENTS]; @@ -53,7 +59,7 @@ read_stream(char *s, size_t size, void *d) return fgets(s, (int)size, (FILE *)d); } void -load_the_events(void) +load_the_events_old(void) { icalparser *p = icalparser_new(); assert(p); @@ -102,6 +108,69 @@ load_the_events(void) icalparser_free(p); } +void +load_the_events(void) +{ + sqlite3 *db; + if (sqlite3_open(DATABASE, &db)) + errx(1, "sqlite3_open: %s", sqlite3_errmsg(db)); + + const char *sql = "SELECT " + "CAST(strftime('%Y', start, 'localtime') as INT), " + "CAST(strftime('%m', start, 'localtime') as INT), " + "CAST(strftime('%d', start, 'localtime') as INT), " + "CAST(strftime('%w', start, 'localtime') as INT), " + "CAST(strftime('%H', start, 'localtime') as INT), " + "CAST(strftime('%M', start, 'localtime') as INT), " + "CAST(strftime('%H', end , 'localtime') as INT), " + "CAST(strftime('%M', end , 'localtime') as INT), " + "summary " + "FROM event " + "WHERE datetime('now', 'start of day') < start " + "AND summary IS NOT NULL " + "ORDER BY start"; + sqlite3_stmt *stmt = NULL; + if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL)) + errx(1, "sqlite3_prepare_v2: %s", sqlite3_errmsg(db)); + + for (;;) { + int step = sqlite3_step(stmt); + if (SQLITE_DONE == step) + break; + if (SQLITE_ROW != step) + errx(1, "sqlite3_step: %s", sqlite3_errmsg(db)); + + if (MAX_EVENTS <= num_events) { + warnx("MAX_EVENTS exceeded at %u", num_events); + break; + } + + int year = sqlite3_column_int(stmt, 0); + int month = sqlite3_column_int(stmt, 1); + int day = sqlite3_column_int(stmt, 2); + int wday = sqlite3_column_int(stmt, 3); + int hour = sqlite3_column_int(stmt, 4); + int minute = sqlite3_column_int(stmt, 5); + int end_hour = sqlite3_column_int(stmt, 6); + int end_minute = sqlite3_column_int(stmt, 7); + const char *summary = + (const void *)sqlite3_column_text(stmt, 8); + assert(summary); + + the_events[num_events].year = year; + the_events[num_events].month = month; + the_events[num_events].day = day; + the_events[num_events].hour = hour; + the_events[num_events].minute = minute; + the_events[num_events].end_hour = end_hour; + the_events[num_events].end_minute = end_minute; + strncpy(the_events[num_events].title, summary, SIZEOF_TITLE); + the_events[num_events].wday = wday; + ++num_events; + } + + sqlite3_close(db); +} const char *the_non_ascii = "ÄÅÉËÞÜÚÍÓÖÁÐFGHÏŒØÆŒ©®BÑΜ" "äåéëþüúíóöáðfghïœøæœ©®bñµß"; @@ -208,14 +277,15 @@ main(void) { y += 40; char s[64] = {0}; - snprintf(s, sizeof(s), "%02u:%02u", e->hour, - e->minute); + snprintf(s, sizeof(s), "%02u:%02u - %02u:%02u", + e->hour, e->minute, e->end_hour, + e->end_minute); Vector2 m = MeasureTextEx(font_p, s, font_p.baseSize, 0); - line(2.8 * font_p.baseSize - m.x, y, font_p, fg, + line(5.8 * font_p.baseSize - m.x, y, font_p, fg, s); - line(3.5 * font_p.baseSize, y, font_p, fg, + line(6.5 * font_p.baseSize, y, font_p, fg, e->title); } } |
