summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Stensgård <mastensg@mastensg.net>2025-07-06 20:24:51 +0200
committerMartin Stensgård <mastensg@mastensg.net>2025-07-06 20:24:51 +0200
commitb7e80be754df87c9190993338b973157cfa558b9 (patch)
tree21059df59b224ea7be7ae3aa2205d21325bbd6c9
parentf6094cbc3ede9c7e61d019ffe352a4d7627309e9 (diff)
opplysning: load booking events from database
-rw-r--r--Makefile4
-rw-r--r--opplysning.c82
2 files changed, 78 insertions, 8 deletions
diff --git a/Makefile b/Makefile
index a95c627..607e8c7 100644
--- a/Makefile
+++ b/Makefile
@@ -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);
}
}