diff options
Diffstat (limited to 'src/db/TombstoneTable.vala')
-rw-r--r-- | src/db/TombstoneTable.vala | 146 |
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); + } +} + |