diff --git a/resources/metadb/002.sql b/resources/metadb/002.sql new file mode 100644 index 0000000000..3ad936b8c7 --- /dev/null +++ b/resources/metadb/002.sql @@ -0,0 +1,7 @@ + +CREATE TABLE imageitem ( + item_id INTEGER UNIQUE REFERENCES item(id) ON DELETE CASCADE, + original_time INTEGER +); +CREATE INDEX imageitem_item_id_idx ON imageitem(item_id); + diff --git a/src/metadata.c b/src/metadata.c index a369f8ff52..f29c6a6692 100644 --- a/src/metadata.c +++ b/src/metadata.c @@ -654,6 +654,54 @@ metadb_insert_videoitem(sqlite3 *db, int64_t item_id, const metadata_t *md) +/** + * + */ +static int +metadb_insert_imageitem(sqlite3 *db, int64_t item_id, const metadata_t *md) +{ + int i; + int rc = 0; + for(i = 0; i < 2; i++) { + sqlite3_stmt *stmt; + + rc = sqlite3_prepare_v2(db, + i == 0 ? + "INSERT OR FAIL INTO imageitem " + "(item_id, original_time) " + "VALUES " + "(?1, ?2)" + : + "UPDATE imageitem SET " + "original_time = ?2 " + "WHERE item_id = ?1" + , + -1, &stmt, NULL); + + if(rc != SQLITE_OK) { + TRACE(TRACE_ERROR, "SQLITE", "SQL Error at %s:%d", + __FUNCTION__, __LINE__); + return -1; + } + sqlite3_bind_int64(stmt, 1, item_id); + + if(md->md_time) + sqlite3_bind_int(stmt, 2, md->md_time); + + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + if(rc == SQLITE_CONSTRAINT && i == 0) + continue; + break; + } + + if(rc != SQLITE_DONE) + return 1; + return 0; +} + + + @@ -736,6 +784,10 @@ metadb_metadata_write(void *db, const char *url, time_t mtime, r = metadb_insert_videoitem(db, item_id, md); break; + case CONTENT_IMAGE: + r = metadb_insert_imageitem(db, item_id, md); + break; + case CONTENT_DIR: case CONTENT_DVD: r = 0; @@ -992,6 +1044,42 @@ metadb_metadata_get_streams(sqlite3 *db, metadata_t *md, int64_t item_id) } +/** + * + */ +static int +metadb_metadata_get_image(sqlite3 *db, metadata_t *md, int64_t item_id) +{ + int rc; + sqlite3_stmt *sel; + + rc = sqlite3_prepare_v2(db, + "SELECT original_time " + "FROM imageitem " + "WHERE item_id = ?1", + -1, &sel, NULL); + if(rc != SQLITE_OK) { + TRACE(TRACE_ERROR, "SQLITE", "SQL Error at %s:%d", + __FUNCTION__, __LINE__); + return -1; + } + + sqlite3_bind_int64(sel, 1, item_id); + + rc = sqlite3_step(sel); + + if(rc != SQLITE_ROW) { + sqlite3_finalize(sel); + return -1; + } + + md->md_time = sqlite3_column_int(sel, 0); + + sqlite3_finalize(sel); + return 0; +} + + /** * */ @@ -1014,6 +1102,10 @@ metadata_get(void *db, int item_id, int contenttype, get_cache_t *gc) r = metadb_metadata_get_streams(db, md, item_id); break; + case CONTENT_IMAGE: + r = metadb_metadata_get_image(db, md, item_id); + break; + case CONTENT_DIR: case CONTENT_DVD: r = 0;