1 #include <lightmediascanner_db.h>
2 #include "lightmediascanner_db_private.h"
12 static 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 lms_db_image_new(sqlite3 *db)
77 _singleton->_references++;
84 if (_db_create_table_if_required(db) != 0) {
85 fprintf(stderr, "ERROR: could not create table.\n");
89 ldi = calloc(1, sizeof(lms_db_image_t));
97 lms_db_image_start(lms_db_image_t *ldi)
102 ldi->insert = lms_db_compile_stmt(ldi->db,
103 "INSERT OR REPLACE INTO images ("
104 "id, title, artist, date, width, height, orientation, "
105 "thumb_width, thumb_height, gps_lat, gps_long, gps_alt) VALUES ("
106 "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
114 lms_db_image_free(lms_db_image_t *ldi)
120 if (ldi->_references > 0)
124 lms_db_finalize_stmt(ldi->insert, "insert");
133 _db_insert(lms_db_image_t *ldi, const struct lms_image_info *info)
137 unsigned long tw, th;
139 if (info->height < info->width) {
141 th = (info->height * 128) / info->width;
144 } else if (info->height == info->width)
148 tw = (info->width * 128) / info->height;
155 ret = lms_db_bind_int64(stmt, 1, info->id);
159 ret = lms_db_bind_text(stmt, 2, info->title.str, info->title.len);
163 ret = lms_db_bind_text(stmt, 3, info->artist.str, info->artist.len);
167 ret = lms_db_bind_int(stmt, 4, info->date);
171 ret = lms_db_bind_int(stmt, 5, info->width);
175 ret = lms_db_bind_int(stmt, 6, info->height);
179 ret = lms_db_bind_int(stmt, 7, info->orientation);
183 ret = lms_db_bind_int(stmt, 8, tw);
187 ret = lms_db_bind_int(stmt, 9, th);
191 ret = lms_db_bind_double(stmt, 10, info->gps.latitude);
195 ret = lms_db_bind_double(stmt, 11, info->gps.longitude);
199 ret = lms_db_bind_double(stmt, 12, info->gps.altitude);
203 r = sqlite3_step(stmt);
204 if (r != SQLITE_DONE) {
205 fprintf(stderr, "ERROR: could not insert image info: %s\n",
206 sqlite3_errmsg(ldi->db));
214 lms_db_reset_stmt(stmt);
220 lms_db_image_add(lms_db_image_t *ldi, struct lms_image_info *info)
229 return _db_insert(ldi, info);