summaryrefslogtreecommitdiff
path: root/src/db/TombstoneTable.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/db/TombstoneTable.vala')
-rw-r--r--src/db/TombstoneTable.vala146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/db/TombstoneTable.vala b/src/db/TombstoneTable.vala
new file mode 100644
index 0000000..9e108bd
--- /dev/null
+++ b/src/db/TombstoneTable.vala
@@ -0,0 +1,146 @@
+/* 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 TombstoneID {
+ public const int64 INVALID = -1;
+
+ public int64 id;
+
+ public TombstoneID(int64 id = INVALID) {
+ this.id = id;
+ }
+
+ public bool is_invalid() {
+ return (id == INVALID);
+ }
+
+ public bool is_valid() {
+ return (id != INVALID);
+ }
+}
+
+public class TombstoneRow {
+ public TombstoneID id;
+ public string filepath;
+ public int64 filesize;
+ public string? md5;
+ public time_t time_created;
+ public Tombstone.Reason reason;
+}
+
+public class TombstoneTable : DatabaseTable {
+ private static TombstoneTable instance = null;
+
+ private TombstoneTable() {
+ set_table_name("TombstoneTable");
+
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
+ + "TombstoneTable "
+ + "("
+ + "id INTEGER PRIMARY KEY, "
+ + "filepath TEXT NOT NULL, "
+ + "filesize INTEGER, "
+ + "md5 TEXT, "
+ + "time_created INTEGER, "
+ + "reason INTEGER DEFAULT 0 "
+ + ")", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ fatal("create TombstoneTable", res);
+ }
+
+ public static TombstoneTable get_instance() {
+ if (instance == null)
+ instance = new TombstoneTable();
+
+ return instance;
+ }
+
+ public TombstoneRow add(string filepath, int64 filesize, string? md5, Tombstone.Reason reason)
+ throws DatabaseError {
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("INSERT INTO TombstoneTable "
+ + "(filepath, filesize, md5, time_created, reason) "
+ + "VALUES (?, ?, ?, ?, ?)",
+ -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ time_t time_created = (time_t) now_sec();
+
+ res = stmt.bind_text(1, filepath);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(2, filesize);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_text(3, md5);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int64(4, (int64) time_created);
+ assert(res == Sqlite.OK);
+ res = stmt.bind_int(5, reason.serialize());
+ assert(res == Sqlite.OK);
+
+ res = stmt.step();
+ if (res != Sqlite.DONE)
+ throw_error("TombstoneTable.add", res);
+
+ TombstoneRow row = new TombstoneRow();
+ row.id = TombstoneID(db.last_insert_rowid());
+ row.filepath = filepath;
+ row.filesize = filesize;
+ row.md5 = md5;
+ row.time_created = time_created;
+ row.reason = reason;
+
+ return row;
+ }
+
+ public TombstoneRow[]? fetch_all() throws DatabaseError {
+ int row_count = get_row_count();
+ if (row_count == 0)
+ return null;
+
+ Sqlite.Statement stmt;
+ int res = db.prepare_v2("SELECT id, filepath, filesize, md5, time_created, reason "
+ + "FROM TombstoneTable", -1, out stmt);
+ assert(res == Sqlite.OK);
+
+ TombstoneRow[] rows = new TombstoneRow[row_count];
+
+ int index = 0;
+ for (;;) {
+ res = stmt.step();
+ if (res == Sqlite.DONE)
+ break;
+ else if (res != Sqlite.ROW)
+ throw_error("TombstoneTable.fetch_all", res);
+
+ TombstoneRow row = new TombstoneRow();
+ row.id = TombstoneID(stmt.column_int64(0));
+ row.filepath = stmt.column_text(1);
+ row.filesize = stmt.column_int64(2);
+ row.md5 = stmt.column_text(3);
+ row.time_created = (time_t) stmt.column_int64(4);
+ row.reason = Tombstone.Reason.unserialize(stmt.column_int(5));
+
+ rows[index++] = row;
+ }
+
+ assert(index == row_count);
+
+ return rows;
+ }
+
+ public void update_file(TombstoneID tombstone_id, string filepath) throws DatabaseError {
+ update_text_by_id_2(tombstone_id.id, "filepath", filepath);
+ }
+
+ public void remove(TombstoneID tombstone_id) throws DatabaseError {
+ delete_by_id(tombstone_id.id);
+ }
+}
+