diff --git a/src/Makefile.in b/src/Makefile.in index bc304b14ed3c39d296197bd53a93fb23a4fb7eb2..18ece2c3259d64550ea12728db9b17dbc4817360 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1717,6 +1717,7 @@ database/disk.c: database/disk.sql @echo '__attribute__((unused)) unsigned char ___src_database_disk_sql[] = { ' > $@ @$(XXD) -i < $< >> $@ @echo ', 0x00 };' >> $@ + database/memory.c: database/memory.sql $(XXD_GEN) @echo '__attribute__((unused)) unsigned char ___src_database_memory_sql[] = { ' > $@ diff --git a/src/database/cache.c b/src/database/cache.c index 73f5e743fc61352cb8c34634199e8fa144655cea..0aa526b816cec1173efcdfaf3542fd54eeb667dd 100644 --- a/src/database/cache.c +++ b/src/database/cache.c @@ -72,10 +72,16 @@ database_cache_kara(volatile sqlite3 *db, int id) { \ bool ret_code = false; \ sqlite3_stmt *stmt = NULL; \ + /* Update the disk cache */ \ SQLITE_PREPARE(db, stmt, "UPDATE kara SET cached_" #what " = ? WHERE id = ?;", error); \ SQLITE_BIND_INT(db, stmt, 1, what, error); \ SQLITE_BIND_INT(db, stmt, 2, id, error); \ SQLITE_STEP_OK(db, stmt, error); \ + /* Update the memory cache */ \ + SQLITE_PREPARE(db, stmt, "UPDATE kara_cache SET " #what " = ? WHERE kara_id = ?;", error); \ + SQLITE_BIND_INT(db, stmt, 1, what, error); \ + SQLITE_BIND_INT(db, stmt, 2, id, error); \ + SQLITE_STEP_OK(db, stmt, error); \ ret_code = true; \ error: \ sqlite3_finalize(stmt); \ @@ -90,7 +96,7 @@ database_cache_kara(volatile sqlite3 *db, int id) sqlite3_stmt *stmt = NULL; \ retry: \ *what = 0; \ - SQLITE_PREPARE(db, stmt, "SELECT cached_" #what " FROM kara WHERE id = ?;", error); \ + SQLITE_PREPARE(db, stmt, "SELECT " #what " FROM kara_cache WHERE kara_id = ?;", error); \ SQLITE_BIND_INT(db, stmt, 1, id, error); \ SQLITE_STEP_ROW(db, stmt, error); \ *what = sqlite3_column_int64(stmt, 0); \ diff --git a/src/database/memory.sql b/src/database/memory.sql index fe2e6a414e4adf227f85d7a62d1a04db6ec4f774..c249fdc6b7d6b5fa53bc026910aa8cba878cd908 100644 --- a/src/database/memory.sql +++ b/src/database/memory.sql @@ -11,33 +11,38 @@ -- - `duration` the total duration of the playing kara CREATE TABLE IF NOT EXISTS queue_state - ( id INTEGER PRIMARY KEY DEFAULT 42 CHECK(id = 42) - , volume INTEGER NOT NULL DEFAULT 100 CHECK(0 <= volume AND volume <= 100) - , paused INTEGER NOT NULL DEFAULT 1 - , random INTEGER NOT NULL DEFAULT 0 - , repeat INTEGER NOT NULL DEFAULT 0 - , single INTEGER NOT NULL DEFAULT 0 - , consume INTEGER NOT NULL DEFAULT 0 - , current INTEGER CHECK(current > 0) - , duration INTEGER CHECK(duration >= 0) - , elapsed INTEGER CHECK(elapsed >= 0) + ( id INTEGER PRIMARY KEY DEFAULT 42 CHECK(id = 42) + , volume INTEGER NOT NULL DEFAULT 100 CHECK(0 <= volume AND volume <= 100) + , paused INTEGER NOT NULL DEFAULT 1 + , random INTEGER NOT NULL DEFAULT 0 + , repeat INTEGER NOT NULL DEFAULT 0 + , single INTEGER NOT NULL DEFAULT 0 + , consume INTEGER NOT NULL DEFAULT 0 + , current INTEGER CHECK(current > 0) + , duration INTEGER CHECK(duration >= 0) + , elapsed INTEGER CHECK(elapsed >= 0) ); INSERT INTO queue_state (id) VALUES (42); - -- Temporary queue table used when reordering the queue (for inserts) CREATE TABLE IF NOT EXISTS queue_tmp - ( position INTEGER PRIMARY KEY AUTOINCREMENT CHECK(position > 0) - , kara_id INTEGER - , priority INTEGER NOT NULL DEFAULT 1 CHECK(priority > 0 AND priority < 6) + ( position INTEGER PRIMARY KEY AUTOINCREMENT CHECK(position > 0) + , kara_id INTEGER + , priority INTEGER NOT NULL DEFAULT 1 CHECK(priority > 0 AND priority < 6) ); +-- Memory replica of the kara cache +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 + ); -- Used to store the content of the ini configuration file. CREATE TABLE IF NOT EXISTS config - ( section TEXT NOT NULL - , key TEXT NOT NULL - , value TEXT + ( section TEXT NOT NULL + , key TEXT NOT NULL + , value TEXT , PRIMARY KEY (section, key) ) WITHOUT ROWID; diff --git a/src/database/open.c b/src/database/open.c index 3722eaeeea0c48ac3a4bb01a880c8a8da3d6fbd6..8f45ff0e9e0f5deabf4c6245ed4f5ef056fad91a 100644 --- a/src/database/open.c +++ b/src/database/open.c @@ -172,6 +172,20 @@ error: return ret; } +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" + " FROM kara;"; + SQLITE_EXEC(db, SQL, error); + LOG_INFO("DB", "Kara cache was flushed from disk"); + return; +error: + LOG_ERROR("DB", "Failed to flush kara cache from disk"); + return; +} + bool database_open(volatile sqlite3 *db, const char *dbpath, bool check) { @@ -197,6 +211,7 @@ retry: case LKT_DATABASE_VERSION_MK_7_1: LOG_INFO("DB", "Opening database, version is 'mk-7.1'"); + ___flush_cache_from_disk(db); break; } return true;