diff options
author | Jörg Frings-Fürst <debian@jff.email> | 2018-09-30 14:09:20 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff.email> | 2018-09-30 14:09:20 +0200 |
commit | 5e9f4eea451a77ba3b93db3747841ed2bd969e9f (patch) | |
tree | 75046a38ca68975261d853a2e56ff7bf6b3e1daa /src/db/FaceLocationTable.vala | |
parent | 18b52c2983a1b3409011f72d27f15de576c5eb1c (diff) |
New upstream version 0.30.1upstream/0.30.1
Diffstat (limited to 'src/db/FaceLocationTable.vala')
-rw-r--r-- | src/db/FaceLocationTable.vala | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/src/db/FaceLocationTable.vala b/src/db/FaceLocationTable.vala new file mode 100644 index 0000000..14fef4c --- /dev/null +++ b/src/db/FaceLocationTable.vala @@ -0,0 +1,202 @@ +/* Copyright 2016 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 FaceLocationID { + public const int64 INVALID = -1; + + public int64 id; + + public FaceLocationID(int64 id = INVALID) { + this.id = id; + } + + public bool is_invalid() { + return (id == INVALID); + } + + public bool is_valid() { + return (id != INVALID); + } +} + +public class FaceLocationRow { + public FaceLocationID face_location_id; + public FaceID face_id; + public PhotoID photo_id; + public string geometry; +} + +public class FaceLocationTable : DatabaseTable { + private static FaceLocationTable instance = null; + + private FaceLocationTable() { + set_table_name("FaceLocationTable"); + + Sqlite.Statement stmt; + int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS " + + "FaceLocationTable " + + "(" + + "id INTEGER NOT NULL PRIMARY KEY, " + + "face_id INTEGER NOT NULL, " + + "photo_id INTEGER NOT NULL, " + + "geometry TEXT" + + ")", -1, out stmt); + assert(res == Sqlite.OK); + + res = stmt.step(); + if (res != Sqlite.DONE) + fatal("create FaceLocationTable", res); + } + + public static FaceLocationTable get_instance() { + if (instance == null) + instance = new FaceLocationTable(); + + return instance; + } + + public FaceLocationRow add(FaceID face_id, PhotoID photo_id, string geometry) throws DatabaseError { + Sqlite.Statement stmt; + int res = db.prepare_v2( + "INSERT INTO FaceLocationTable (face_id, photo_id, geometry) VALUES (?, ?, ?)", + -1, out stmt); + assert(res == Sqlite.OK); + + res = stmt.bind_int64(1, face_id.id); + assert(res == Sqlite.OK); + res = stmt.bind_int64(2, photo_id.id); + assert(res == Sqlite.OK); + res = stmt.bind_text(3, geometry); + assert(res == Sqlite.OK); + + res = stmt.step(); + if (res != Sqlite.DONE) + throw_error("FaceLocationTable.add", res); + + FaceLocationRow row = new FaceLocationRow(); + row.face_location_id = FaceLocationID(db.last_insert_rowid()); + row.face_id = face_id; + row.photo_id = photo_id; + row.geometry = geometry; + + return row; + } + + public Gee.List<FaceLocationRow?> get_all_rows() throws DatabaseError { + Sqlite.Statement stmt; + int res = db.prepare_v2( + "SELECT id, face_id, photo_id, geometry FROM FaceLocationTable", + -1, out stmt); + assert(res == Sqlite.OK); + + Gee.List<FaceLocationRow?> rows = new Gee.ArrayList<FaceLocationRow?>(); + + for (;;) { + res = stmt.step(); + if (res == Sqlite.DONE) + break; + else if (res != Sqlite.ROW) + throw_error("FaceLocationTable.get_all_rows", res); + + // res == Sqlite.ROW + FaceLocationRow row = new FaceLocationRow(); + row.face_location_id = FaceLocationID(stmt.column_int64(0)); + row.face_id = FaceID(stmt.column_int64(1)); + row.photo_id = PhotoID(stmt.column_int64(2)); + row.geometry = stmt.column_text(3); + + rows.add(row); + } + + return rows; + } + + public Gee.ArrayList<string> get_face_source_ids(FaceID face_id) { + Sqlite.Statement stmt; + int res = db.prepare_v2( + "SELECT photo_id FROM FaceLocationTable WHERE face_id = ?", + -1, out stmt); + assert(res == Sqlite.OK); + + res = stmt.bind_int64(1, face_id.id); + assert(res == Sqlite.OK); + + Gee.ArrayList<string> result = new Gee.ArrayList<string>(); + for(;;) { + res = stmt.step(); + if (res == Sqlite.DONE) { + break; + } else if (res != Sqlite.ROW) { + fatal("get_face_source_ids", res); + + break; + } + + result.add(PhotoID.upgrade_photo_id_to_source_id(PhotoID(stmt.column_int64(0)))); + } + + return result; + } + + public string? get_face_source_serialized_geometry(Face face, MediaSource source) + throws DatabaseError { + Sqlite.Statement stmt; + int res = db.prepare_v2( + "SELECT geometry FROM FaceLocationTable WHERE face_id=? AND photo_id=?", + -1, out stmt); + assert(res == Sqlite.OK); + + res = stmt.bind_int64(1, face.get_instance_id()); + assert(res == Sqlite.OK); + res = stmt.bind_int64(2, ((Photo) source).get_instance_id()); + assert(res == Sqlite.OK); + + res = stmt.step(); + if (res == Sqlite.DONE) + return null; + else if (res != Sqlite.ROW) + throw_error("FaceLocationTable.get_face_source_serialized_geometry", res); + + return stmt.column_text(0); + } + + public void remove_face_from_source(FaceID face_id, PhotoID photo_id) throws DatabaseError { + Sqlite.Statement stmt; + int res = db.prepare_v2( + "DELETE FROM FaceLocationTable WHERE face_id=? AND photo_id=?", + -1, out stmt); + assert(res == Sqlite.OK); + + res = stmt.bind_int64(1, face_id.id); + assert(res == Sqlite.OK); + res = stmt.bind_int64(2, photo_id.id); + assert(res == Sqlite.OK); + + res = stmt.step(); + if (res != Sqlite.DONE) + throw_error("FaceLocationTable.remove_face_from_source", res); + } + + public void update_face_location_serialized_geometry(FaceLocation face_location) + throws DatabaseError { + Sqlite.Statement stmt; + int res = db.prepare_v2("UPDATE FaceLocationTable SET geometry=? WHERE id=?", -1, out stmt); + assert(res == Sqlite.OK); + + res = stmt.bind_text(1, face_location.get_serialized_geometry()); + assert(res == Sqlite.OK); + res = stmt.bind_int64(2, face_location.get_face_location_id().id); + assert(res == Sqlite.OK); + + res = stmt.step(); + if (res != Sqlite.DONE) + throw_error("FaceLocationTable.update_face_location_serialized_geometry", res); + } +} + +#endif |