summaryrefslogtreecommitdiff
path: root/update.c
diff options
context:
space:
mode:
Diffstat (limited to 'update.c')
-rw-r--r--update.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/update.c b/update.c
new file mode 100644
index 0000000..2686943
--- /dev/null
+++ b/update.c
@@ -0,0 +1,91 @@
+#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);
+
+ 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);
+}