From 2704e31119b43e6ed606830e9b3b7c7531f208f1 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Sun, 2 May 2021 11:33:53 +0200 Subject: [PATCH] CACHE: Retrieve all kara ids in the caching thread --- inc/lektor/database.h | 2 ++ src/base/launch.c | 24 +++++++++++++++++++++++- src/database/find.c | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/inc/lektor/database.h b/inc/lektor/database.h index 8a24ef26..2a3e87e1 100644 --- a/inc/lektor/database.h +++ b/inc/lektor/database.h @@ -65,6 +65,8 @@ bool database_get_kara_mtime_path (volatile sqlite3 *db, char filepath[PATH_MA bool database_get_kara_duration_path(volatile sqlite3 *db, char filepath[PATH_MAX], uint64_t *duration); void database_cache_kara (volatile sqlite3 *db, int id); +void database_get_all_kara(volatile sqlite3 *db, int **ret_ids, size_t *ret_ids_len); + /* Update the database. */ bool database_update (volatile sqlite3 *db, const char *kara_dir, int check_timestamp); bool database_update_add (volatile sqlite3 *db, const char *kara_path, struct kara_metadata *mdt, uint64_t id, bool avail); diff --git a/src/base/launch.c b/src/base/launch.c index ebf9c784..d8c49a72 100644 --- a/src/base/launch.c +++ b/src/base/launch.c @@ -171,6 +171,26 @@ end: return 0; } +static pthread_t ___thread_wlaker; + +PRIVATE_FUNCTION void * +___caching_walker(void *args) +{ + volatile sqlite3 *db = (volatile sqlite3 *)args; + size_t ids_count = 0; + int *ids = NULL; + + database_get_all_kara(db, &ids, &ids_count); + if (ids == NULL || ids_count == 0) { + LOG_ERROR("CACHING", "No kara present in the database, exit caching thread"); + return NULL; + } + + free(ids); + + return NULL; +} + int launch_caching(va_list *args) { @@ -181,7 +201,9 @@ launch_caching(va_list *args) if (database_get_version(db) == LKT_DATABASE_VERSION_MK_7_1) { ret_code = 0; - LOG_ERROR("CACHING", "Caching on correct db version mk-7.1, but is not implemented"); + LOG_INFO("CACHING", "Caching on correct db version mk-7.1"); + assert(!pthread_create(&___thread_wlaker, NULL, ___caching_walker, (void *)db)); + assert(!pthread_detach(___thread_wlaker)); } else { diff --git a/src/database/find.c b/src/database/find.c index b2fe1eab..495fdac3 100644 --- a/src/database/find.c +++ b/src/database/find.c @@ -397,3 +397,43 @@ error: sqlite3_finalize(stmt); return ret; } + +void +database_get_all_kara(volatile sqlite3 *db, int **ret_ids, size_t *ret_ids_len) +{ + static const char *SQL_DATA = "SELECT id FROM kara;"; + static const char *SQL_COUNT = "SELECT count(id) FROM kara;"; + sqlite3_stmt *stmt = NULL; + size_t index = 0; + + /* Get storage for all IDs */ + SQLITE_PREPARE(db, stmt, SQL_COUNT, error); + SQLITE_STEP_ROW(db, stmt, error); + *ret_ids_len = sqlite3_column_int64(stmt, 0); + sqlite3_finalize(stmt); + stmt = NULL; + *ret_ids = (int *)safe_malloc((*ret_ids_len) * sizeof(int)); + + /* Get all the IDs */ + SQLITE_PREPARE(db, stmt, SQL_DATA, error); + FOR_EVER { + SQLITE_STEP_ROW(db, stmt, done); + (*ret_ids)[index] = sqlite3_column_int(stmt, 0); + index++; + } + +done: + LOG_INFO("DB", "Done retrieving all the kara IDs, %ld kara retrieved", *ret_ids_len); + sqlite3_finalize(stmt); + return; + +error: + LOG_ERROR("DB", "An error occured during sql queries... oupsy"); + if (stmt != NULL) + sqlite3_finalize(stmt); + if ((*ret_ids) != NULL) + free(*ret_ids); + *ret_ids = NULL; + *ret_ids_len = 0; + return; +} -- GitLab