1 #include <lightmediascanner_db.h>
2 #include "lightmediascanner_db_private.h"
12 lms_db_image_t *_singleton = NULL;
15 _db_create_table_if_required(sqlite3 *db)
22 "CREATE TABLE IF NOT EXISTS images ("
23 "id INTEGER PRIMARY KEY, "
26 "date INTEGER NOT NULL, "
27 "width INTEGER NOT NULL, "
28 "height INTEGER NOT NULL, "
29 "orientation INTEGER NOT NULL, "
30 "thumb_width INTEGER NOT NULL, "
31 "thumb_height INTEGER NOT NULL, "
32 "gps_lat REAL DEFAULT 0.0, "
33 "gps_long REAL DEFAULT 0.0, "
34 "gps_alt REAL DEFAULT 0.0"
38 fprintf(stderr, "ERROR: could not create 'images' table: %s\n", errmsg);
44 "CREATE INDEX IF NOT EXISTS images_date_idx ON images ("
49 fprintf(stderr, "ERROR: could not create 'images_date_idx' index: %s\n",
55 ret = lms_db_create_trigger_if_not_exists(db,
56 " delete_images_on_files_deleted "
57 "DELETE ON files FOR EACH ROW BEGIN "
58 " DELETE FROM images WHERE id = OLD.id; END;");
62 ret = lms_db_create_trigger_if_not_exists(db,
63 " delete_files_on_images_deleted "
64 "DELETE ON images FOR EACH ROW BEGIN "
65 " DELETE FROM files WHERE id = OLD.id; END;");
72 _db_compile_all_stmts(lms_db_image_t *ldi)
74 ldi->insert = lms_db_compile_stmt(ldi->db,
75 "INSERT OR REPLACE INTO images ("
76 "id, title, artist, date, width, height, orientation, "
77 "thumb_width, thumb_height, gps_lat, gps_long, gps_alt) VALUES ("
78 "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
86 lms_db_image_new(sqlite3 *db)
91 _singleton->_references++;
98 if (_db_create_table_if_required(db) != 0) {
99 fprintf(stderr, "ERROR: could not create table.\n");
103 ldi = calloc(1, sizeof(lms_db_image_t));
104 ldi->_references = 1;
107 if (_db_compile_all_stmts(ldi) != 0) {
108 fprintf(stderr, "ERROR: could not compile image statements.\n");
109 lms_db_image_free(ldi);
117 lms_db_image_free(lms_db_image_t *ldi)
123 if (ldi->_references > 0)
127 lms_db_finalize_stmt(ldi->insert, "insert");
136 _db_insert(lms_db_image_t *ldi, const struct lms_image_info *info)
140 unsigned long tw, th;
142 if (info->height < info->width) {
144 th = (info->height * 128) / info->width;
147 } else if (info->height == info->width)
151 tw = (info->width * 128) / info->height;
158 ret = lms_db_bind_int64(stmt, 1, info->id);
162 ret = lms_db_bind_text(stmt, 2, info->title.str, info->title.len);
166 ret = lms_db_bind_text(stmt, 3, info->artist.str, info->artist.len);
170 ret = lms_db_bind_int(stmt, 4, info->date);
174 ret = lms_db_bind_int(stmt, 5, info->width);
178 ret = lms_db_bind_int(stmt, 6, info->height);
182 ret = lms_db_bind_int(stmt, 7, info->orientation);
186 ret = lms_db_bind_int(stmt, 8, tw);
190 ret = lms_db_bind_int(stmt, 9, th);
194 ret = lms_db_bind_double(stmt, 10, info->gps.latitude);
198 ret = lms_db_bind_double(stmt, 11, info->gps.longitude);
202 ret = lms_db_bind_double(stmt, 12, info->gps.altitude);
206 r = sqlite3_step(stmt);
207 if (r != SQLITE_DONE) {
208 fprintf(stderr, "ERROR: could not insert image info: %s\n",
209 sqlite3_errmsg(ldi->db));
217 lms_db_reset_stmt(stmt);
223 lms_db_image_add(lms_db_image_t *ldi, struct lms_image_info *info)
232 return _db_insert(ldi, info);