diff --git a/src/database/memory.sql b/src/database/memory.sql index c249fdc6b7d6b5fa53bc026910aa8cba878cd908..61843fdd61a2c4e67e33dcfa62d73767eefe99fa 100644 --- a/src/database/memory.sql +++ b/src/database/memory.sql @@ -37,6 +37,7 @@ CREATE TABLE IF NOT EXISTS kara_cache ( kara_id INTEGER -- Valid kara id, can't foreign key as the disk is not loaded , mtime INTEGER NOT NULL -- Last modification date , duration INTEGER NOT NULL -- Duration of the kara + , file_path TEXT NOT NULL -- Cached filepath ); -- Used to store the content of the ini configuration file. diff --git a/src/database/open.c b/src/database/open.c index 8f45ff0e9e0f5deabf4c6245ed4f5ef056fad91a..ba91f34dd629f422782c7692f7658cb46af18ba3 100644 --- a/src/database/open.c +++ b/src/database/open.c @@ -175,8 +175,8 @@ error: PRIVATE_FUNCTION void ___flush_cache_from_disk(volatile sqlite3 *db) { - static const char *SQL = "INSERT INTO kara_cache (kara_id, mtime, duration)" - " SELECT id, cached_mtime, cached_duration" + static const char *SQL = "INSERT INTO kara_cache (kara_id, mtime, duration, file_path)" + " SELECT id, cached_mtime, cached_duration, file_path" " FROM kara;"; SQLITE_EXEC(db, SQL, error); LOG_INFO("DB", "Kara cache was flushed from disk"); diff --git a/src/database/queue.c b/src/database/queue.c index 2dcdf87d03491c6e889147b1ca68957467866d49..25e05e3f2ca559f5aa7bd90fbc00aca2c36107bb 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -763,7 +763,7 @@ database_get_kara_path(volatile sqlite3 *db, int id, char filepath[PATH_MAX]) { bool ret_code = false; sqlite3_stmt *stmt = NULL; - static const char *SQL = "SELECT file_path FROM kara WHERE id = ? AND available = 1;"; + static const char *SQL = "SELECT file_path FROM kara_cache WHERE kara_id = ?;"; RETURN_UNLESS(id && db, "Invalid argument", false); SQLITE_PREPARE(db, stmt, SQL, error); SQLITE_BIND_INT(db, stmt, 1, id, error); diff --git a/src/database/update.c b/src/database/update.c index 39f7f5627c4bea345296d2e290708a437e58d885..88c75cd97e8d0999f649b1b9c3ea9e0ed836ab50 100644 --- a/src/database/update.c +++ b/src/database/update.c @@ -7,7 +7,7 @@ #include <dirent.h> PRIVATE_FUNCTION bool -__add_kara_to_update_job(volatile sqlite3 *db, size_t id) +___add_kara_to_update_job(volatile sqlite3 *db, size_t id) { const char *SQL = NULL; sqlite3_stmt *stmt; @@ -28,7 +28,7 @@ error: } PRIVATE_FUNCTION bool -__is_id_in_database(volatile sqlite3 *db, size_t id) +___is_id_in_database(volatile sqlite3 *db, size_t id) { static const char *SQL = "SELECT id FROM kara WHERE id = ?;"; sqlite3_stmt *stmt = NULL; @@ -42,8 +42,29 @@ error: return ret; } +PRIVATE_FUNCTION void +___flush_cache_from_disk(volatile sqlite3 *db, const char *filename) +{ + static const char *SQL = + "INSERT OR REPLACE INTO kara_cache (kara_id, file_path)" + " SELECT (id, file_path)" + " FROM kara" + " WHERE file_path = ?"; + sqlite3_stmt *stmt = NULL; + + SQLITE_PREPARE(db, stmt, SQL, error); + SQLITE_BIND_TEXT(db, stmt, 1, filename, error); + SQLITE_STEP_OK(db, stmt, error); + sqlite3_finalize(stmt); + return; + +error: + sqlite3_finalize(stmt); + return; +} + PRIVATE_FUNCTION bool -__database_add_kara(volatile sqlite3 *db, const char *filename) +___database_add_kara(volatile sqlite3 *db, const char *filename) { RETURN_UNLESS(db || filename, "Invalid argument", false); static const char *SQL_STMT = "INSERT INTO " @@ -81,7 +102,7 @@ __database_add_kara(volatile sqlite3 *db, const char *filename) if (!id_len && STR_MATCH(&token[1], "mkv")) { /* Check if found id is already in use. Only do that because we are * populating the database here. */ - if (__is_id_in_database(db, kara_id)) { + if (___is_id_in_database(db, kara_id)) { LOG_WARN("DB", "Detected id %lu for file %s is already taken, generating a new one. " "Your database may be inconsistent", @@ -117,7 +138,8 @@ __database_add_kara(volatile sqlite3 *db, const char *filename) sqlite3_finalize(stmt); stmt = NULL; - if (__add_kara_to_update_job(db, kara_id)) { + ___flush_cache_from_disk(db, filename); + if (___add_kara_to_update_job(db, kara_id)) { SQLITE_EXEC(db, "COMMIT;", error); return true; } @@ -191,7 +213,8 @@ database_update_add(volatile sqlite3 *db, const char *kara_path, struct kara_met // clang-format on SQLITE_STEP_DONE(db, stmt, error); - ret = __add_kara_to_update_job(db, id); + ___flush_cache_from_disk(db, kara_path); + ret = ___add_kara_to_update_job(db, id); error: sqlite3_finalize(stmt); return ret; @@ -226,7 +249,7 @@ database_update(volatile sqlite3 *db, const char *kara_dir, int check_timestamp) LOG_INFO("DB", "Skip update of kara '%s' be cause of timestamps", path); continue; } - if (!__database_add_kara(db, path)) + if (!___database_add_kara(db, path)) LOG_WARN("DB", "Failed to add kara with path '%s' to db", path); database_stamp(db); } @@ -293,7 +316,7 @@ error: void database_update_touch(volatile sqlite3 *db, int id) { - __add_kara_to_update_job(db, id); + ___add_kara_to_update_job(db, id); } void