summaryrefslogtreecommitdiff
path: root/src/db/EventTable.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/db/EventTable.vala')
-rw-r--r--src/db/EventTable.vala235
1 files changed, 235 insertions, 0 deletions
diff --git a/src/db/EventTable.vala b/src/db/EventTable.vala
new file mode 100644
index 0000000..016fa00
--- /dev/null
+++ b/src/db/EventTable.vala
@@ -0,0 +1,235 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+public struct EventID {
+ public const int64 INVALID = -1;
+
+ public int64 id;
+
+ public EventID(int64 id = INVALID) {
+ this.id = id;
+ }
+
+ public bool is_invalid() {
+ return (id == INVALID);
+ }
+
+ public bool is_valid() {
+ return (id != INVALID);
+ }
+}
+
+public class EventRow {
+ public EventID event_id;
+ public string? name;
+ public time_t time_created;
+ public string? primary_source_id;
+ public string? comment;
+}
+
+public class EventTable : DatabaseTable {
+ private static EventTable instance = null;
+
+ private EventTable() {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS EventTable ("
+ + "id INTEGER PRIMARY KEY, "
+ + "name TEXT, "
+ + "primary_photo_id INTEGER, "
+ + "time_created INTEGER,"
+ + "primary_source_id TEXT,"
+ + "comment TEXT"
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create photo table", res);
+
+ set_table_name("EventTable");
+ }
+
+ public static EventTable get_instance() {
+ if (instance == null)
+ instance = new EventTable();
+
+ return instance;
+ }
+
+ // Returns a valid source ID, creating one from a legacy primary photo ID when needed.
+ private string? source_id_upgrade(int64 primary_photo_id, string? primary_source_id) {
+ if (MediaCollectionRegistry.get_instance().is_valid_source_id(primary_source_id)) {
+ return primary_source_id;
+ }
+ if (primary_photo_id != PhotoID.INVALID) {
+ // Upgrade to source_id from photo_id.
+ return PhotoID.upgrade_photo_id_to_source_id(PhotoID(primary_photo_id));
+ }
+ return null;
+ }
+
+ public EventRow create(string? primary_source_id, string? comment) throws DatabaseError {
+ assert(primary_source_id != null && primary_source_id != "");
+
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "INSERT INTO EventTable (primary_source_id, time_created, comment) VALUES (?, ?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ time_t time_created = (time_t) now_sec();
+
+ res = stmt.bind_text(1, primary_source_id);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, time_created);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(3, comment);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("EventTable.create", res);
+
+ EventRow row = new EventRow();
+ row.event_id = EventID(db.last_insert_rowid());
+ row.name = null;
+ row.primary_source_id = primary_source_id;
+ row.time_created = time_created;
+ row.comment = comment;
+
+ return row;
+ }
+
+ // NOTE: The event_id in EventRow is ignored here. No checking is done to prevent
+ // against creating duplicate events or for the validity of other fields in the row (i.e.
+ // the primary photo ID).
+ public EventID create_from_row(EventRow row) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO EventTable (name, primary_photo_id, primary_source_id, time_created, comment) VALUES (?, ?, ?, ?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_text(1, row.name);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, PhotoID.INVALID);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(3, row.primary_source_id);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(4, row.time_created);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(5, row.comment);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE) {
+ fatal("Event create_from_row", res);
+
+ return EventID();
+ }
+
+ return EventID(db.last_insert_rowid());
+ }
+
+ public EventRow? get_row(EventID event_id) {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2(
+ "SELECT name, primary_photo_id, primary_source_id, time_created, comment FROM EventTable WHERE id=?", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.bind_int64(1, event_id.id);
+ assert(res == Sqlite.OK);
+
+ if (stmt.step() != Sqlite.ROW)
+ return null;
+
+ EventRow row = new EventRow();
+ row.event_id = event_id;
+ row.name = stmt.column_text(0);
+ if (row.name != null && row.name.length == 0)
+ row.name = null;
+ row.primary_source_id = source_id_upgrade(stmt.column_int64(1), stmt.column_text(2));
+ row.time_created = (time_t) stmt.column_int64(3);
+ row.comment = stmt.column_text(4);
+
+ return row;
+ }
+
+ public void remove(EventID event_id) throws DatabaseError {
+ delete_by_id(event_id.id);
+ }
+
+ public Gee.ArrayList<EventRow?> get_events() {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id, name, primary_photo_id, primary_source_id, time_created, comment FROM EventTable",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ Gee.ArrayList<EventRow?> event_rows = new Gee.ArrayList<EventRow?>();
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE) {
+ break;
+ } else if (res != Sqlite.ROW) {
+ fatal("get_events", res);
+
+ break;
+ }
+
+ EventRow row = new EventRow();
+
+ row.event_id = EventID(stmt.column_int64(0));
+ row.name = stmt.column_text(1);
+ row.primary_source_id = source_id_upgrade(stmt.column_int64(2), stmt.column_text(3));
+ row.time_created = (time_t) stmt.column_int64(4);
+ row.comment = stmt.column_text(5);
+
+ event_rows.add(row);
+ }
+
+ return event_rows;
+ }
+
+ public bool rename(EventID event_id, string? name) {
+ return update_text_by_id(event_id.id, "name", name != null ? name : "");
+ }
+
+ public string? get_name(EventID event_id) {
+ Sqlite.Statement stmt;
+ if (!select_by_id(event_id.id, "name", out stmt))
+ return null;
+
+ string name = stmt.column_text(0);
+
+ return (name != null && name.length > 0) ? name : null;
+ }
+
+ public string? get_primary_source_id(EventID event_id) {
+ Sqlite.Statement stmt;
+ if (!select_by_id(event_id.id, "primary_source_id", out stmt))
+ return null;
+
+ return stmt.column_text(0);
+ }
+
+ public bool set_primary_source_id(EventID event_id, string primary_source_id) {
+ return update_text_by_id(event_id.id, "primary_source_id", primary_source_id);
+ }
+
+ public time_t get_time_created(EventID event_id) {
+ Sqlite.Statement stmt;
+ if (!select_by_id(event_id.id, "time_created", out stmt))
+ return 0;
+
+ return (time_t) stmt.column_int64(0);
+ }
+
+ public bool set_comment(EventID event_id, string new_comment) {
+ return update_text_by_id(event_id.id, "comment", new_comment != null ? new_comment : "");
+ }
+
+}
+
+