From af489e7b0d4cd4ada7bf249a7752ab020aeff289 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Mon, 4 May 2020 11:51:20 +0200
Subject: [PATCH] Modify searchs to add an init function

---
 inc/lektor/database.h | 10 ++++++----
 src/commands.c        | 34 ++++------------------------------
 src/database/find.c   | 39 +++++++++++++++++++++++++++------------
 3 files changed, 37 insertions(+), 46 deletions(-)

diff --git a/inc/lektor/database.h b/inc/lektor/database.h
index 5e442b27..e28f3aa0 100644
--- a/inc/lektor/database.h
+++ b/inc/lektor/database.h
@@ -90,13 +90,15 @@ struct lkt_search {
         lkt_search_database,
         lkt_search_playlist,
         lkt_search_queue,
+        lkt_add_queue,
     } type;
-    bool (*init)(volatile sqlite3 *);   /* Called at the end of the init phase  */
-    void (*call)(void);                 /* Called during the iter phase, casted */
+    bool (*init)(volatile sqlite3 *);   /* Called at the end of the init phase          */
+    void (*call)(void);                 /* Called during the iter phase, casted         */
     struct lkt_state *srv;
     size_t c;
-    long continuation;                  /* The continuation state of the client */
-    int msg_count;                      /* How much messages we can send        */
+    long continuation;                  /* The continuation state of the client         */
+    int msg_count;                      /* How much messages we can send                */
+    int priority;                       /* Can be used... where the priority is needed! */
 };
 
 typedef bool (*lkt_search_database_func)(struct lkt_state *srv, size_t c, int id, int id_len,
diff --git a/src/commands.c b/src/commands.c
index bd3dea5d..957bd4e4 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -420,14 +420,6 @@ command_noidle(struct lkt_state *srv, size_t c)
 }
 
 /* Functions for the searchadd and the search mpd commands */
-static bool
-lkt_callback_print_row_v1(struct lkt_state *srv, size_t c, int id, int id_len, const char *sql_row)
-{
-    UNUSED(srv);
-    printf(" . from client %ld:\t%*d:%s\n", c, id_len, id, sql_row);
-    return true;
-}
-
 static bool
 lkt_callback_send_row_v1(void *_args, int id, int id_len, const char *sql_row)
 {
@@ -448,22 +440,6 @@ lkt_callback_send_row_v2(struct lkt_state *srv, size_t c, int id, int id_len, co
     return true;
 }
 
-static bool
-lkt_callback_insert_v1(struct lkt_state *srv, size_t c, int id, int id_len, const char *sql_row)
-{
-    UNUSED(sql_row, id_len, c);
-    return database_queue_add_id(srv->db, id, 5) &&
-           lkt_callback_send_row_v2(srv, c, id, id_len, sql_row);
-}
-
-static bool
-lkt_callback_add_v2(struct lkt_state *srv, size_t c, int id, int id_len, const char *sql_row)
-{
-    UNUSED(sql_row, id_len, c);
-    return database_queue_add_id(srv->db, id, 1) &&
-           lkt_callback_send_row_v2(srv, c, id, id_len, sql_row);
-}
-
 static bool
 __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], long continuation,
        enum lkt_find_action action, bool(*init)(volatile sqlite3 *, char *, char *, struct lkt_search *))
@@ -488,14 +464,14 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo
         search.call = (void(*)(void)) lkt_callback_send_row_v2;
         break;
     case LKT_FND_ACT_PRINT:
-        search.call = (void(*)(void)) lkt_callback_print_row_v1;
+        search.call = NULL;
         break;
     case LKT_FND_ACT_ENQUEUE:
-        search.call = (void(*)(void)) lkt_callback_insert_v1;
+        search.call = (void(*)(void)) lkt_callback_send_row_v2;
         srv->mpd_idle_events |= MPD_IDLE_PLAYLIST;
         break;
     case LKT_FND_ACT_ADD:
-        search.call = (void(*)(void)) lkt_callback_add_v2;
+        search.call = (void(*)(void)) lkt_callback_send_row_v2;
         srv->mpd_idle_events |= MPD_IDLE_PLAYLIST;
         break;
     default:
@@ -506,9 +482,7 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo
 
     mpd_tag = cmd_args[0];
 
-    if (!strcasecmp("any", mpd_tag) ||
-        !strcasecmp("all", mpd_tag) ||
-        !strcasecmp("a", mpd_tag))
+    if (!strcasecmp("any", mpd_tag) || !strcasecmp("all", mpd_tag) || !strcasecmp("a", mpd_tag))
         col_name = LKT_DATABASE_KARA_COLUMNT_ANY;
     else if (!strcasecmp("author", mpd_tag))
         col_name = LKT_DATABASE_NAME_KAUTHOR;
diff --git a/src/database/find.c b/src/database/find.c
index e4d405d4..91a290cd 100644
--- a/src/database/find.c
+++ b/src/database/find.c
@@ -7,6 +7,21 @@
 #include <stdio.h>
 #include <string.h>
 
+static inline bool
+__init_search(volatile sqlite3 *db, struct lkt_search *ret)
+{
+    UNUSED(db);
+    switch (ret->type) {
+        case lkt_add_queue:
+            /* Use the add uri */
+            return false;
+        default:
+            LOG_WARN_SCT("DB", "Init for type %d is not implemented", ret->type);
+            return false;
+    }
+    return false;
+}
+
 bool
 database_search_database_init(volatile sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret)
 {
@@ -20,7 +35,7 @@ database_search_database_init(volatile sqlite3 *db, char *col_name, char *rgx, s
     char SQL_STMT[LKT_MAX_SQLITE_STATEMENT];
 
     /* Init */
-    if (ret->init && ! ret->init(db)) {
+    if (! ret->continuation && ret->init && ! __init_search(db, ret)) {
         LOG_ERROR_SCT("DB", "%s", "Failed to init search query, called to init func failed");
         return false;
     }
@@ -54,7 +69,7 @@ database_search_queue_init(volatile sqlite3 *db, char *col_name, char *rgx, stru
     char SQL_STMT[LKT_MAX_SQLITE_STATEMENT];
 
     /* Init */
-    if (ret->init && ! ret->init(db)) {
+    if (! ret->continuation && ret->init && ! __init_search(db, ret)) {
         LOG_ERROR_SCT("DB", "%s", "Failed to init search query, called to init func failed");
         return false;
     }
@@ -77,16 +92,17 @@ database_search_iter(struct lkt_search *item)
 {
     const char *sql_row;
     int id, code, id_len;
-
-    code = sqlite3_step(item->stmt);
-
     RETURN_UNLESS(item, "Exit because item is NULL, end iterations", false);
+    GOTO_UNLESS(item->call, "Call function is NULL, terminate the search", end);
+    code = sqlite3_step(item->stmt);
 
     if (code == SQLITE_DONE)
-        goto error_or_done;
+        goto end;
 
-    if (code != SQLITE_ROW)
-        goto error;
+    if (code != SQLITE_ROW) {
+        LOG_ERROR_SCT("DB", "Step failed, expected a ROW or a DONE: %s", sqlite3_errmsg((sqlite3 *) item->db));
+        goto end;
+    }
 
     switch (item->type) {
     case lkt_search_database:
@@ -97,12 +113,11 @@ database_search_iter(struct lkt_search *item)
     case lkt_search_queue:
     case lkt_search_playlist:
     default:
-        goto error;
+        LOG_WARN_SCT("DB", "Search operation %d is not implemented", item->type);
+        goto end;
     }
 
-error:
-    LOG_ERROR_SCT("DB", "sqlite3_step failed: %s", sqlite3_errmsg((sqlite3 *) item->db));
-error_or_done:
+end:
     sqlite3_finalize(item->stmt);
     return false;
 }
-- 
GitLab