diff options
Diffstat (limited to 'src/db/FaceTable.vala')
-rw-r--r-- | src/db/FaceTable.vala | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/src/db/FaceTable.vala b/src/db/FaceTable.vala new file mode 100644 index 0000000..a6e0bad --- /dev/null +++ b/src/db/FaceTable.vala @@ -0,0 +1,169 @@ +/* Copyright 2018 Software Freedom Conservancy Inc. + * + * This software is licensed under the GNU Lesser General Public License + * (version 2.1 or later). See the COPYING file in this distribution. + */ + +#if ENABLE_FACES +public struct FaceID { + public const int64 INVALID = -1; + + public int64 id; + + public FaceID(int64 id = INVALID) { + this.id = id; + } + + public bool is_invalid() { + return (id == INVALID); + } + + public bool is_valid() { + return (id != INVALID); + } +} + +public class FaceRow { + public FaceID face_id; + public string name; + public time_t time_created; +} + +public class FaceTable : DatabaseTable { + private static FaceTable instance = null; + + private FaceTable() { + set_table_name("FaceTable"); + + Sqlite.Statement stmt; + int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS " + + "FaceTable " + + "(" + + "id INTEGER NOT NULL PRIMARY KEY, " + + "name TEXT NOT NULL, " + + "time_created TIMESTAMP" + + ")", -1, out stmt); + assert(res == Sqlite.OK); + + res = stmt.step(); + if (res != Sqlite.DONE) + fatal("create FaceTable", res); + } + + public static FaceTable get_instance() { + if (instance == null) + instance = new FaceTable(); + + return instance; + } + + public FaceRow add(string name) throws DatabaseError { + Sqlite.Statement stmt; + int res = db.prepare_v2("INSERT INTO FaceTable (name, time_created) VALUES (?, ?)", -1, + out stmt); + assert(res == Sqlite.OK); + + time_t time_created = (time_t) now_sec(); + + res = stmt.bind_text(1, name); + assert(res == Sqlite.OK); + res = stmt.bind_int64(2, time_created); + assert(res == Sqlite.OK); + + res = stmt.step(); + if (res != Sqlite.DONE) + throw_error("FaceTable.add", res); + + FaceRow row = new FaceRow(); + row.face_id = FaceID(db.last_insert_rowid()); + row.name = name; + row.time_created = time_created; + + return row; + } + + public FaceID create_from_row(FaceRow row) throws DatabaseError { + Sqlite.Statement stmt; + int res = db.prepare_v2("INSERT INTO FaceTable (name, time_created) VALUES (?, ?)", + -1, out stmt); + assert(res == Sqlite.OK); + + res = stmt.bind_text(1, row.name); + assert(res == Sqlite.OK); + res = stmt.bind_int64(2, row.time_created); + assert(res == Sqlite.OK); + + res = stmt.step(); + if (res != Sqlite.DONE) + throw_error("FaceTable.create_from_row", res); + + return FaceID(db.last_insert_rowid()); + } + + public void remove(FaceID face_id) throws DatabaseError { + delete_by_id(face_id.id); + } + + public string? get_name(FaceID face_id) throws DatabaseError { + Sqlite.Statement stmt; + if (!select_by_id(face_id.id, "name", out stmt)) + return null; + + return stmt.column_text(0); + } + + public FaceRow? get_row(FaceID face_id) throws DatabaseError { + Sqlite.Statement stmt; + int res = db.prepare_v2("SELECT name, time_created FROM FaceTable WHERE id=?", + -1, out stmt); + assert(res == Sqlite.OK); + + res = stmt.bind_int64(1, face_id.id); + assert(res == Sqlite.OK); + + res = stmt.step(); + if (res == Sqlite.DONE) + return null; + else if (res != Sqlite.ROW) + throw_error("FaceTable.get_row", res); + + FaceRow row = new FaceRow(); + row.face_id = face_id; + row.name = stmt.column_text(0); + row.time_created = (time_t) stmt.column_int64(1); + + return row; + } + + public Gee.List<FaceRow?> get_all_rows() throws DatabaseError { + Sqlite.Statement stmt; + int res = db.prepare_v2("SELECT id, name, time_created FROM FaceTable", -1, + out stmt); + assert(res == Sqlite.OK); + + Gee.List<FaceRow?> rows = new Gee.ArrayList<FaceRow?>(); + + for (;;) { + res = stmt.step(); + if (res == Sqlite.DONE) + break; + else if (res != Sqlite.ROW) + throw_error("FaceTable.get_all_rows", res); + + // res == Sqlite.ROW + FaceRow row = new FaceRow(); + row.face_id = FaceID(stmt.column_int64(0)); + row.name = stmt.column_text(1); + row.time_created = (time_t) stmt.column_int64(2); + + rows.add(row); + } + + return rows; + } + + public void rename(FaceID face_id, string new_name) throws DatabaseError { + update_text_by_id_2(face_id.id, "name", new_name); + } +} +#endif |