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