From fc4200a86ebf82a35d74de80887c28c0225f3834 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Wed, 15 Apr 2020 10:39:58 +0200
Subject: [PATCH] Update stickers functions, a bit cleaner now

---
 inc/lektor/database.h   | 16 +++++++----
 src/commands.c          | 62 ++++++++++++++++++++---------------------
 src/database/stickers.c | 10 +++----
 3 files changed, 46 insertions(+), 42 deletions(-)

diff --git a/inc/lektor/database.h b/inc/lektor/database.h
index cd8c6c93..77dde268 100644
--- a/inc/lektor/database.h
+++ b/inc/lektor/database.h
@@ -127,14 +127,20 @@ bool database_user_authentificate(sqlite3 *db, const char *password);
 bool database_user_add(sqlite3 *db, const char *username, const char *password);
 
 /* Stickers manipulations. */
-typedef bool (*database_sticker_callback_t)(void *args, const char *sticker, const char *type,
-        int uri, int value);
+struct sticker_callback {
+    struct lkt_state *srv;
+    size_t c;
+    int uri;
+    int value;
+    const char *name;
+    bool is_ok;
+    bool (*call)(void *args, const char *sticker, const char *type, int uri, int value);
+};
 
 bool database_sticker_create(sqlite3 *db, const char *name);
 bool database_sticker_delete(sqlite3 *db, const char *name);
 bool database_sticker_delete_specify(sqlite3 *sb, const char *type, int uri,
                                      const char *name /* Can be null */);
-bool database_sticker_list(sqlite3 *db, const char *type, void *args, database_sticker_callback_t call);
+bool database_sticker_list(sqlite3 *db, const char *type, struct sticker_callback *call);
 bool database_sticker_set(sqlite3 *db, const char *type, const char *name, int uri, int value);
-bool database_sticker_get(sqlite3 *db, const char *type, const char *name, int uri, void *args,
-                          database_sticker_callback_t call);
+bool database_sticker_get(sqlite3 *db, const char *type, const char *name, int uri, struct sticker_callback *call);
diff --git a/src/commands.c b/src/commands.c
index d7de4629..b04bd870 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -21,15 +21,6 @@
 #define SELF_EXECUTABLE_FREEBSD "/proc/curproc/file"
 #define SELF_EXECUTABLE_SOLARIS "/proc/self/path/a.out"
 
-struct _client_trace_t {
-    struct lkt_state *srv;
-    size_t c;
-    int uri;
-    const char *name;
-    int value;
-    bool is_ok;
-};
-
 inline bool
 command_restart(struct lkt_state *srv, size_t c)
 {
@@ -1025,10 +1016,12 @@ command_user_add(sqlite3 *db, char *argv[LKT_MESSAGE_ARGS_MAX])
     fprintf(stderr, " . command_user_add: Failed to add user %s\n", argv[0]);
 }
 
+/* Stickers */
+
 static bool
 sticker_send_one_value(void *_args, const char *sticker, const char *type, int uri, int value)
 {
-    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    struct sticker_callback *args = (struct sticker_callback *) _args;
     struct lkt_message *out;
     (void) sticker;
     (void) type;
@@ -1043,7 +1036,7 @@ sticker_send_one_value(void *_args, const char *sticker, const char *type, int u
 static bool
 sticker_send_all(void *_args, const char *sticker, const char *type, int uri, int value)
 {
-    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    struct sticker_callback *args = (struct sticker_callback *) _args;
     struct lkt_message *out;
 
     out = lkt_message_new();
@@ -1056,7 +1049,7 @@ sticker_send_all(void *_args, const char *sticker, const char *type, int uri, in
 static bool
 sticker_send_check_uri(void *_args, const char *sticker, const char *type, int uri, int value)
 {
-    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    struct sticker_callback *args = (struct sticker_callback *) _args;
     struct lkt_message *out;
     (void) type;
 
@@ -1072,7 +1065,7 @@ sticker_send_check_uri(void *_args, const char *sticker, const char *type, int u
 static bool
 sticker_send_value_check_uri_name(void *_args, const char *sticker, const char *type, int uri, int value)
 {
-    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    struct sticker_callback *args = (struct sticker_callback *) _args;
     struct lkt_message *out;
     (void) type;
 
@@ -1089,7 +1082,7 @@ static bool
 sticker_check_is_present_eq(void *_args, const char *sticker, const char *type, int uri, int value)
 {
     (void) type;
-    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    struct sticker_callback *args = (struct sticker_callback *) _args;
     args->is_ok |= (uri == args->uri) && !strcasecmp(sticker, args->name) && (value == args->value);
     return true;
 }
@@ -1098,7 +1091,7 @@ static bool
 sticker_check_is_present_lt(void *_args, const char *sticker, const char *type, int uri, int value)
 {
     (void) type;
-    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    struct sticker_callback *args = (struct sticker_callback *) _args;
     args->is_ok |= (uri == args->uri) && !strcasecmp(sticker, args->name) && (value < args->value);
     return true;
 }
@@ -1107,7 +1100,7 @@ static bool
 sticker_check_is_present_gt(void *_args, const char *sticker, const char *type, int uri, int value)
 {
     (void) type;
-    struct _client_trace_t *args = (struct _client_trace_t *) _args;
+    struct sticker_callback *args = (struct sticker_callback *) _args;
     args->is_ok |= (uri == args->uri) && !strcasecmp(sticker, args->name) && (value > args->value);
     return true;
 }
@@ -1121,12 +1114,13 @@ command_sticker_get(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS
     }
 
     int uri = atoi(argv[1]); /* FIXME: Use strtol. */
-    struct _client_trace_t args = {
+    struct sticker_callback callback = {
         .srv = srv,
         .c = c,
+        .call = sticker_send_one_value,
     };
 
-    if (!database_sticker_get(srv->db, argv[0], argv[2], uri, &args, sticker_send_one_value)) {
+    if (!database_sticker_get(srv->db, argv[0], argv[2], uri, &callback)) {
         fprintf(stderr, " . command_sticker_get: Failed to get sticker '%s' for object %s(%d)\n",
                 argv[2], argv[0], uri);
         return false;
@@ -1159,7 +1153,7 @@ command_sticker_set(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS
 bool
 command_sticker_list(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX])
 {
-    struct _client_trace_t args = {
+    struct sticker_callback callback = {
         .srv = srv,
         .c = c,
     };
@@ -1187,29 +1181,35 @@ command_sticker_list(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARG
         goto unknown;
 
 just_list_all:
-    return database_sticker_list(srv->db, argv[0], &args, sticker_send_all);
+    callback.call = sticker_send_all;
+    return database_sticker_list(srv->db, argv[0], &callback);
 
 simple_list_command:
-    args.uri = atoi(argv[1]);   /* FIXME: Use strtol. */
-    return database_sticker_list(srv->db, argv[0], &args, sticker_send_check_uri);
+    callback.uri  = atoi(argv[1]);   /* FIXME: Use strtol. */
+    callback.call = sticker_send_check_uri;
+    return database_sticker_list(srv->db, argv[0], &callback);
 
 list_stickers_in_uri:
-    args.uri  = atoi(argv[1]);  /* FIXME: Use strtol. */
-    args.name = argv[2];
-    return database_sticker_list(srv->db, argv[0], &args, sticker_send_value_check_uri_name);
+    callback.uri  = atoi(argv[1]);  /* FIXME: Use strtol. */
+    callback.name = argv[2];
+    callback.call = sticker_send_value_check_uri_name;
+    return database_sticker_list(srv->db, argv[0], &callback);
     return false;
 
 list_stickers_check_value:
-    args.uri   = atoi(argv[1]); /* FIXME: Use strtol. */
-    args.value = atoi(argv[4]); /* FIXME: Use strtol. */
-    args.name  = argv[2];
+    callback.uri   = atoi(argv[1]); /* FIXME: Use strtol. */
+    callback.value = atoi(argv[4]); /* FIXME: Use strtol. */
+    callback.name  = argv[2];
     switch (argv[3][0]) {
     case '=':
-        return database_sticker_list(srv->db, argv[0], &args, sticker_check_is_present_eq);
+        callback.call = sticker_check_is_present_eq;
+        return database_sticker_list(srv->db, argv[0], &callback);
     case '<':
-        return database_sticker_list(srv->db, argv[0], &args, sticker_check_is_present_lt);
+        callback.call = sticker_check_is_present_lt;
+        return database_sticker_list(srv->db, argv[0], &callback);
     case '>':
-        return database_sticker_list(srv->db, argv[0], &args, sticker_check_is_present_gt);
+        callback.call = sticker_check_is_present_gt;
+        return database_sticker_list(srv->db, argv[0], &callback);
     default:
         return 0;
     }
diff --git a/src/database/stickers.c b/src/database/stickers.c
index afeb6209..1fd2b237 100644
--- a/src/database/stickers.c
+++ b/src/database/stickers.c
@@ -71,8 +71,7 @@ error:
 }
 
 bool
-database_sticker_list(sqlite3 *db, const char *type, void *args,
-                      database_sticker_callback_t call)
+database_sticker_list(sqlite3 *db, const char *type, struct sticker_callback *call)
 {
     const char *SQL = NULL;
     int ret = false, uri, value;
@@ -112,7 +111,7 @@ database_sticker_list(sqlite3 *db, const char *type, void *args,
             sticker = (const char *) sqlite3_column_text(stmt, 0);
             uri     = sqlite3_column_int(stmt, 1);
             value   = sqlite3_column_int(stmt, 2);
-            if (!call(args, sticker, type, uri, value))
+            if (!call->call(call, sticker, type, uri, value))
                 goto end_loop;
             continue;
 
@@ -179,8 +178,7 @@ error:
 }
 
 bool
-database_sticker_get(sqlite3 *db, const char *type, const char *name, int uri, void *args,
-                     database_sticker_callback_t call)
+database_sticker_get(sqlite3 *db, const char *type, const char *name, int uri, struct sticker_callback *call)
 {
     const char *SQL = NULL;
     sqlite3_stmt *stmt;
@@ -212,7 +210,7 @@ database_sticker_get(sqlite3 *db, const char *type, const char *name, int uri, v
         switch (sqlite3_step(stmt)) {
         case SQLITE_ROW:
             value = sqlite3_column_int(stmt, 1);
-            if (!call(args, name, type, uri, value))
+            if (!call->call(call, name, type, uri, value))
                 goto end_loop;
             continue;
 
-- 
GitLab