diff options
| author | Martin Stensgård <mastensg@mastensg.net> | 2025-07-22 11:41:10 +0200 |
|---|---|---|
| committer | Martin Stensgård <mastensg@mastensg.net> | 2025-07-22 11:41:48 +0200 |
| commit | 5fead1096ee4ffdfed9957b575e2b09e6d9637cf (patch) | |
| tree | 2d07fe2ff64235bd505157d8ad947ad7532d47e1 /opplysning-endre.c | |
| parent | e6d85d4516b7d79304c8bb331a05f9ea15070967 (diff) | |
install, bin/opplysning-*
Diffstat (limited to 'opplysning-endre.c')
| -rw-r--r-- | opplysning-endre.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/opplysning-endre.c b/opplysning-endre.c new file mode 100644 index 0000000..b55c679 --- /dev/null +++ b/opplysning-endre.c @@ -0,0 +1,95 @@ +#include <assert.h> +#include <err.h> +#include <stdio.h> + +#include <libical/ical.h> + +#include "sqlite/sqlite3.h" + +static char *SCHEMA = "CREATE TABLE event (" + " start TIMESTAMP," + " end TIMESTAMP," + " summary TEXT" + ")"; + +static char * +read_stream(char *s, size_t size, void *d) +{ + return fgets(s, (int)size, (FILE *)d); +} + +static void +component(sqlite3 *db, icalcomponent *c) +{ + struct icaltimetype dts = icalcomponent_get_dtstart(c); + struct icaltimetype dte = icalcomponent_get_dtend(c); + + icaltimezone *utc = icaltimezone_get_utc_timezone(); + dts = icaltime_convert_to_zone(dts, utc); + dte = icaltime_convert_to_zone(dte, utc); + + time_t start = icaltime_as_timet(dts); + time_t end = icaltime_as_timet(dte); + const char *summary = icalcomponent_get_summary(c); + + sqlite3_stmt *stmt = NULL; + const char *sql = "INSERT INTO event (start, end, summary) VALUES (" + "datetime(?, 'unixepoch')," + "datetime(?, 'unixepoch')" + ", ?)"; + if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL)) + errx(1, "sqlite3_prepare_v2"); + + if (sqlite3_bind_int64(stmt, 1, start)) + errx(1, "sqlite3_bind_int64"); + if (sqlite3_bind_int64(stmt, 2, end)) + errx(1, "sqlite3_bind_int64"); + if (sqlite3_bind_text(stmt, 3, summary, -1, SQLITE_STATIC)) + errx(1, "sqlite3_bind_text"); + if (SQLITE_DONE != sqlite3_step(stmt)) + errx(1, "sqlite3_step"); +} + +int +main(int argc, const char *argv[static argc]) +{ + if (2 != argc) + errx(1, "usage: %s dbfile < icalfile", argv[0]); + + icalparser *parser = icalparser_new(); + assert(parser); + FILE *stream = stdin; + assert(stream); + icalparser_set_gen_data(parser, stream); + + sqlite3 *db; + char *errmsg = NULL; + if (sqlite3_open(argv[1], &db)) + errx(1, "sqlite3_open: %s", errmsg); + if (sqlite3_exec(db, "BEGIN", NULL, NULL, &errmsg)) + errx(1, "sqlite3_exec: %s", errmsg); + if (sqlite3_exec(db, "DROP TABLE IF EXISTS event", NULL, NULL, &errmsg)) + errx(1, "sqlite3_exec: %s", errmsg); + if (sqlite3_exec(db, SCHEMA, NULL, NULL, &errmsg)) + errx(1, "sqlite3_exec: %s", errmsg); + for (;;) { + char *line = icalparser_get_line(parser, read_stream); + if (!line) + break; + icalcomponent *c = icalparser_add_line(parser, line); + if (!c) + continue; + for (icalcompiter i = icalcomponent_begin_component( + c, ICAL_VEVENT_COMPONENT); + icalcompiter_deref(&i); icalcompiter_next(&i)) { + icalcomponent *ic = icalcompiter_deref(&i); + component(db, ic); + } + icalcomponent_free(c); + } + if (sqlite3_exec(db, "COMMIT", NULL, NULL, &errmsg)) + errx(1, "sqlite3_exec: %s", errmsg); + sqlite3_close(db); + + icalparser_free(parser); +} |
