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