1
/* Copyright 2011 Yorba Foundation
3
* This software is licensed under the GNU Lesser General Public License
4
* (version 2.1 or later). See the COPYING file in this distribution.
9
public struct FaceLocationID {
10
public const int64 INVALID = -1;
14
public FaceLocationID(int64 id = INVALID) {
18
public bool is_invalid() {
19
return (id == INVALID);
22
public bool is_valid() {
23
return (id != INVALID);
27
public struct FaceLocationRow {
28
public FaceLocationID face_location_id;
29
public FaceID face_id;
30
public PhotoID photo_id;
31
public string geometry;
34
public class FaceLocationTable : DatabaseTable {
35
private static FaceLocationTable instance = null;
37
private FaceLocationTable() {
38
set_table_name("FaceLocationTable");
40
Sqlite.Statement stmt;
41
int res = db.prepare_v2("CREATE TABLE IF NOT EXISTS "
42
+ "FaceLocationTable "
44
+ "id INTEGER NOT NULL PRIMARY KEY, "
45
+ "face_id INTEGER NOT NULL, "
46
+ "photo_id INTEGER NOT NULL, "
49
assert(res == Sqlite.OK);
52
if (res != Sqlite.DONE)
53
fatal("create FaceLocationTable", res);
56
public static FaceLocationTable get_instance() {
58
instance = new FaceLocationTable();
63
public FaceLocationRow add(FaceID face_id, PhotoID photo_id, string geometry) throws DatabaseError {
64
Sqlite.Statement stmt;
65
int res = db.prepare_v2(
66
"INSERT INTO FaceLocationTable (face_id, photo_id, geometry) VALUES (?, ?, ?)",
68
assert(res == Sqlite.OK);
70
res = stmt.bind_int64(1, face_id.id);
71
assert(res == Sqlite.OK);
72
res = stmt.bind_int64(2, photo_id.id);
73
assert(res == Sqlite.OK);
74
res = stmt.bind_text(3, geometry);
75
assert(res == Sqlite.OK);
78
if (res != Sqlite.DONE)
79
throw_error("FaceLocationTable.add", res);
81
FaceLocationRow row = FaceLocationRow();
82
row.face_location_id = FaceLocationID(db.last_insert_rowid());
83
row.face_id = face_id;
84
row.photo_id = photo_id;
85
row.geometry = geometry;
90
public Gee.List<FaceLocationRow?> get_all_rows() throws DatabaseError {
91
Sqlite.Statement stmt;
92
int res = db.prepare_v2(
93
"SELECT id, face_id, photo_id, geometry FROM FaceLocationTable",
95
assert(res == Sqlite.OK);
97
Gee.List<FaceLocationRow?> rows = new Gee.ArrayList<FaceLocationRow?>();
101
if (res == Sqlite.DONE)
103
else if (res != Sqlite.ROW)
104
throw_error("FaceLocationTable.get_all_rows", res);
107
FaceLocationRow row = FaceLocationRow();
108
row.face_location_id = FaceLocationID(stmt.column_int64(0));
109
row.face_id = FaceID(stmt.column_int64(1));
110
row.photo_id = PhotoID(stmt.column_int64(2));
111
row.geometry = stmt.column_text(3);
119
public Gee.ArrayList<string> get_face_source_ids(FaceID face_id) {
120
Sqlite.Statement stmt;
121
int res = db.prepare_v2(
122
"SELECT photo_id FROM FaceLocationTable WHERE face_id = ?",
124
assert(res == Sqlite.OK);
126
res = stmt.bind_int64(1, face_id.id);
127
assert(res == Sqlite.OK);
129
Gee.ArrayList<string> result = new Gee.ArrayList<string>();
132
if (res == Sqlite.DONE) {
134
} else if (res != Sqlite.ROW) {
135
fatal("get_face_source_ids", res);
140
result.add(PhotoID.upgrade_photo_id_to_source_id(PhotoID(stmt.column_int64(0))));
146
public string? get_face_source_serialized_geometry(Face face, MediaSource source)
147
throws DatabaseError {
148
Sqlite.Statement stmt;
149
int res = db.prepare_v2(
150
"SELECT geometry FROM FaceLocationTable WHERE face_id=? AND photo_id=?",
152
assert(res == Sqlite.OK);
154
res = stmt.bind_int64(1, face.get_instance_id());
155
assert(res == Sqlite.OK);
156
res = stmt.bind_int64(2, ((Photo) source).get_instance_id());
157
assert(res == Sqlite.OK);
160
if (res == Sqlite.DONE)
162
else if (res != Sqlite.ROW)
163
throw_error("FaceLocationTable.get_face_source_serialized_geometry", res);
165
return stmt.column_text(0);
168
public void remove_face_from_source(FaceID face_id, PhotoID photo_id) throws DatabaseError {
169
Sqlite.Statement stmt;
170
int res = db.prepare_v2(
171
"DELETE FROM FaceLocationTable WHERE face_id=? AND photo_id=?",
173
assert(res == Sqlite.OK);
175
res = stmt.bind_int64(1, face_id.id);
176
assert(res == Sqlite.OK);
177
res = stmt.bind_int64(2, photo_id.id);
178
assert(res == Sqlite.OK);
181
if (res != Sqlite.DONE)
182
throw_error("FaceLocationTable.remove_face_from_source", res);
185
public void update_face_location_serialized_geometry(FaceLocation face_location)
186
throws DatabaseError {
187
Sqlite.Statement stmt;
188
int res = db.prepare_v2("UPDATE FaceLocationTable SET geometry=? WHERE id=?", -1, out stmt);
189
assert(res == Sqlite.OK);
191
res = stmt.bind_text(1, face_location.get_serialized_geometry());
192
assert(res == Sqlite.OK);
193
res = stmt.bind_int64(2, face_location.get_face_location_id().id);
194
assert(res == Sqlite.OK);
197
if (res != Sqlite.DONE)
198
throw_error("FaceLocationTable.update_face_location_serialized_geometry", res);