From 419f4a0af61493fd3ff657828a1f44e2e7c5ef99 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Wed, 15 Apr 2020 10:17:08 +0200
Subject: [PATCH] WIP: Change the callback type

---
 inc/lektor/database.h | 16 +++++++++-------
 src/commands.c        | 32 ++++++++++----------------------
 src/database/find.c   |  9 +++------
 src/database/queue.c  | 10 ++++------
 4 files changed, 26 insertions(+), 41 deletions(-)

diff --git a/inc/lektor/database.h b/inc/lektor/database.h
index 475206c5..41ef160a 100644
--- a/inc/lektor/database.h
+++ b/inc/lektor/database.h
@@ -74,18 +74,20 @@ bool database_queue_play(sqlite3 *db, int pos);
 bool database_queue_stop(sqlite3 *db);
 
 /* A search callback to be called after each matched row */
-typedef bool (*database_search_callback_t)(void *args, int id, int id_len, const char *sql_row);
+struct lkt_callback {
+    bool (*call)(void *args, int id, int id_len, const char *sql_row);
+    struct lkt_state *srv;
+    size_t c;
+};
 
 /* List the content of the queue */
-bool database_queue_list_from(sqlite3 *db, unsigned int count, void *args,
-                              database_search_callback_t callback);
-bool database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *args,
-                             database_search_callback_t callback);
+bool database_queue_list_from(sqlite3 *db, unsigned int count, struct lkt_callback *callback);
+bool database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, struct lkt_callback *callback);
 
 /* Search the database */
-bool database_search_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret);
+bool database_search_queue_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret);
 bool database_search_iter(sqlite3 *db, sqlite3_stmt *item, void *args,
-                          database_search_callback_t callback, bool *need_free);
+                          struct lkt_callback callback, bool *need_free);
 
 /* Next and prev operation on the queue. */
 bool database_queue_next(sqlite3 *db, char filepath[PATH_MAX]);
diff --git a/src/commands.c b/src/commands.c
index 1c525462..11b8f1f4 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -529,16 +529,6 @@ lkt_callback_print_row_v1(void *args, int id, int id_len, const char *sql_row)
     return true;
 }
 
-static bool
-lkt_callback_none(void *args, int id, int id_len, const char *sql_row)
-{
-    (void) args;
-    (void) id;
-    (void) id_len;
-    (void) sql_row;
-    return true;
-}
-
 static bool
 lkt_callback_send_row_v1(void *_args, int id, int id_len, const char *sql_row)
 {
@@ -571,7 +561,7 @@ command_find(struct lkt_state *srv,
     bool once, free_stmt;
     struct _client_trace_t args;
     struct lkt_message *not_found_msg;
-    database_search_callback_t callback;
+    struct lkt_callback callback;
 
     // Check args //
     if (cmd_args == NULL || cmd_args[0] == NULL) {
@@ -582,23 +572,22 @@ command_find(struct lkt_state *srv,
     // Select callback //
     switch (action) {
     case LKT_FND_ACT_RESPOND:
-        callback = lkt_callback_send_row_v1;
+        callback.call = lkt_callback_send_row_v1;
         args.srv = srv;
         args.c = c;
         break;
     case LKT_FND_ACT_PRINT:
-        callback = lkt_callback_print_row_v1;
+        callback.call = lkt_callback_print_row_v1;
         break;
     case LKT_FND_ACT_ENQUEUE:
-        callback = lkt_callback_insert_v1;
+        callback.call = lkt_callback_insert_v1;
         srv->mpd_idle_events |= MPD_IDLE_PLAYLIST;
         args.srv = srv;
         args.c = c;
         break;
     case LKT_FND_ACT_NONE:
     default:
-        callback = lkt_callback_none;
-        break;
+        return false;
     }
 
     // Select the right column //
@@ -637,7 +626,7 @@ command_find(struct lkt_state *srv,
     }
 
     // Make the search langand do the right action //
-    if (!database_search_init(srv->db, col_name, rgx, &stmt)) {
+    if (!database_search_queue_init(srv->db, col_name, rgx, &stmt)) {
         fprintf(stderr, " ! command_find: Failed to init the search\n");
         return false;
     }
@@ -931,7 +920,8 @@ command_queue_list(struct lkt_state *srv, size_t c,
     unsigned int from, to, tmp_switch;
     long val;
     char *endptr, *str;
-    struct _client_trace_t callback_args = {
+    struct lkt_callback callback = {
+        .call = lkt_callback_send_row_v1,
         .srv = srv,
         .c = c,
     };
@@ -998,13 +988,11 @@ command_queue_list(struct lkt_state *srv, size_t c,
     /* The command is used in its relative forme, display elements from the
        current one. */
 is_relative:
-    return database_queue_list_from(srv->db, count, &callback_args,
-                                    lkt_callback_send_row_v1);
+    return database_queue_list_from(srv->db, count, &callback);
 
     /* The command is used with a range specifier. */
 is_absolute:
-    return database_queue_list_abs(srv->db, from, to, &callback_args,
-                                   lkt_callback_send_row_v1);
+    return database_queue_list_abs(srv->db, from, to, &callback);
 }
 
 bool
diff --git a/src/database/find.c b/src/database/find.c
index f9c8a62d..cdccbb42 100644
--- a/src/database/find.c
+++ b/src/database/find.c
@@ -8,7 +8,7 @@
 #include <string.h>
 
 bool
-database_search_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret)
+database_search_queue_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret)
 {
     if (ret == NULL) {
         fprintf(stderr, " ! database_search_init: Exit because return pointer is NULL\n");
@@ -35,10 +35,7 @@ error:
 }
 
 bool
-database_search_iter(sqlite3 *db,
-                     sqlite3_stmt *item,
-                     void *args,
-                     database_search_callback_t callback,
+database_search_iter(sqlite3 *db, sqlite3_stmt *item, void *args, struct lkt_callback callback,
                      bool *need_free)
 {
     const char *sql_row;
@@ -59,7 +56,7 @@ database_search_iter(sqlite3 *db,
         id = sqlite3_column_int(item, 0);
         sql_row = (const char *) sqlite3_column_text(item, 1);
         id_len = sqlite3_column_int(item, 2);
-        return callback(args, id, id_len, sql_row);
+        return callback.call(args, id, id_len, sql_row);
     }
 
     fprintf(stderr, " ! database_search_iter: sqlite3_step failed: %s\n", sqlite3_errmsg(db));
diff --git a/src/database/queue.c b/src/database/queue.c
index 1ec0e429..5e042014 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -673,8 +673,7 @@ error:
 }
 
 bool
-database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *args,
-                        database_search_callback_t callback)
+database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, struct lkt_callback *callback)
 {
     const char *SQL_STMT =
         "WITH content AS ("
@@ -702,7 +701,7 @@ database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *a
             id = sqlite3_column_int(stmt, 0);
             row = (const char *) sqlite3_column_text(stmt, 1);
             id_len = sqlite3_column_int(stmt, 2);
-            if (callback(args, id, id_len, row))
+            if (callback->call(callback, id, id_len, row))
                 continue;
             else
                 break;
@@ -723,8 +722,7 @@ error:
 }
 
 bool
-database_queue_list_from(sqlite3 *db, unsigned int count, void *args,
-                         database_search_callback_t callback)
+database_queue_list_from(sqlite3 *db, unsigned int count, struct lkt_callback *callback)
 {
     const char *SQL_TEMPLATE =
         "WITH content AS ("
@@ -755,7 +753,7 @@ database_queue_list_from(sqlite3 *db, unsigned int count, void *args,
             id = sqlite3_column_int(stmt, 0);
             row = (const char *) sqlite3_column_text(stmt, 1);
             id_len = sqlite3_column_int(stmt, 2);
-            if (callback(args, id, id_len, row))
+            if (callback->call(callback, id, id_len, row))
                 continue;
             else
                 break;
-- 
GitLab