#include #include #include #include #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); }