From 1c168fda71df3e8347ac2bad472a2a16df43241f Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Sat, 9 May 2020 11:17:22 +0200 Subject: [PATCH] Fix the normal lkt sticker get kara {uri} --- src/commands.c | 5 +++-- src/database/find.c | 33 ++++++++++++++++++--------------- src/database/queue.c | 6 ++++-- src/main/lkt.c | 12 ++++++------ 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/commands.c b/src/commands.c index b098144d..9437e852 100644 --- a/src/commands.c +++ b/src/commands.c @@ -728,10 +728,11 @@ command_user_add(struct lkt_state *srv, size_t c, volatile sqlite3 *db, char *ar /* Stickers */ static bool -sticker_send(struct lkt_state *srv, size_t c, char *name, int id, int value) +sticker_send(struct lkt_state *srv, size_t c, char *name, char *type, int id, int value) { + UNUSED(type); struct lkt_message *msg = lkt_message_new(); - msg->data_len = safe_snprintf(msg->data, LKT_MESSAGE_ARGS_MAX, "%d: %s . %d", id, name, value); + msg->data_len = safe_snprintf(msg->data, LKT_MESSAGE_ARGS_MAX, "%d: %s . %d\n", id, name, value); lkt_state_send(srv, c, msg); return true; } diff --git a/src/database/find.c b/src/database/find.c index 9df51114..0d09857f 100644 --- a/src/database/find.c +++ b/src/database/find.c @@ -38,22 +38,23 @@ database_search_sticker_init(volatile sqlite3 *db, struct lkt_search *ret) /* No bound checks in strcats, should be fine. Possible SQL injection, depend on the `type`. */ static const char *SQL_all_types = "SELECT name, sts.id, value FROM 'stickers' JOIN " - "( SELECT id, sticker, value FROM 'stickers.kara'" + "( SELECT id, sticker, value, 'kara' FROM 'stickers.kara'" " UNION" - " SELECT id, sticker, value FROM 'stickers.plt'" + " SELECT id, sticker, value , 'plt' FROM 'stickers.plt'" ") AS sts" "ON sts.sticker = 'stickers'.id"; static const char *SQL_one_type = - "SELECT name, sts.id, value " + "SELECT name, sts.id, value, '%s' " "FROM 'stickers.%s' AS sts " "JOIN 'stickers' " "ON 'stickers'.id = sts.sticker"; char SQL[LKT_MAX_SQLITE_STATEMENT]; + ret->type = lkt_search_sticker; if (ret->st_type == NULL) memcpy(SQL, SQL_all_types, strlen(SQL_all_types) + 1); else - sprintf(SQL, SQL_one_type, ret->st_type); + sprintf(SQL, SQL_one_type, ret->st_type, ret->st_type); if (ret->st_uri != 0) sprintf(SQL + strlen(SQL), " AND sts.id = %d", ret->st_uri); if (ret->st_op != 0) @@ -61,11 +62,11 @@ database_search_sticker_init(volatile sqlite3 *db, struct lkt_search *ret) ret->st_op == '>' ? ">=" : ret->st_op == '<' ? "<=" : "=", ret->st_value); strcat(SQL, ret->name ? " AND name = ?;" : ";"); + if (ret->name) + SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->name, error); SQLITE_PREPARE(db, ret->stmt, SQL, error); - if (ret->name) - SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->name, error) - return true; + return true; error: sqlite3_finalize(ret->stmt); return false; @@ -100,7 +101,7 @@ error: bool database_search_iter(struct lkt_search *item) { - const char *sql_row; + const char *sql_row, *type; int id, code, id_len; RETURN_UNLESS(item, "Exit because item is NULL, end iterations", false); GOTO_UNLESS(item->call, "Call function is NULL, terminate the search", end); @@ -116,15 +117,17 @@ database_search_iter(struct lkt_search *item) switch (item->type) { case lkt_search_database: - id = sqlite3_column_int(item->stmt, 0); - sql_row = (const char *) sqlite3_column_text(item->stmt, 1); - id_len = sqlite3_column_int(item->stmt, 2); - return ((lkt_search_database_func) item->call)(item->srv, item->c, id, id_len, sql_row); case lkt_search_queue: - id = sqlite3_column_int(item->stmt, 0); + id = sqlite3_column_int(item->stmt, 0); sql_row = (const char *) sqlite3_column_text(item->stmt, 1); - id_len = sqlite3_column_int(item->stmt, 2); - return ((lkt_search_queue_func) item->call)(item->srv, item->c, id, id_len, sql_row); + id_len = sqlite3_column_int(item->stmt, 2); + return ((lkt_search_database_func) item->call)(item->srv, item->c, id, id_len, sql_row); + case lkt_search_sticker: + sql_row = (const char *) sqlite3_column_text(item->stmt, 0); /* Name */ + id = sqlite3_column_int(item->stmt, 1); /* Id */ + code = sqlite3_column_int(item->stmt, 2); /* Value */ + type = (const char *) sqlite3_column_text(item->stmt, 3); /* Type */ + return ((lkt_search_sticker_func) item->call)(item->srv, item->c, sql_row, type, id, code); case lkt_search_playlist: default: LOG_WARN_SCT("DB", "Search operation %d is not implemented", item->type); diff --git a/src/database/queue.c b/src/database/queue.c index 712a6b75..fbdf30dc 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -18,8 +18,10 @@ sqlite_just_exec(database_queue_toggle_pause, "UPDATE queue_state SET paused = 1 - paused;") sqlite_just_exec(database_queue_crop, "DELETE FROM queue WHERE queue.kara_id <> (SELECT current FROM queue_state LIMIT 1);") sqlite_just_exec(database_queue_stop, "UPDATE queue_state SET current = NULL;") -sqlite_just_exec(database_queue_clear, "DELETE FROM queue;DELETE FROM sqlite_sequence WHERE name = 'queue';UPDATE queue_state SET current = NULL;") -sqlite_just_exec(database_config_queue_default, "UPDATE queue_state SET volume = 100, paused = 1, random = 0, repeat = 0, single = 0, consume = 0, current = NULL, duration = 0;") +sqlite_just_exec(database_queue_clear, + "DELETE FROM queue;DELETE FROM sqlite_sequence WHERE name = 'queue';UPDATE queue_state SET current = NULL;") +sqlite_just_exec(database_config_queue_default, + "UPDATE queue_state SET volume = 100, paused = 1, random = 0, repeat = 0, single = 0, consume = 0, current = NULL, duration = 0;") #undef sqlite_just_exec bool diff --git a/src/main/lkt.c b/src/main/lkt.c index 2618b4e0..bb7613fb 100644 --- a/src/main/lkt.c +++ b/src/main/lkt.c @@ -132,10 +132,10 @@ write_socket(FILE *sock, const char *format, ...) if (size < 0) fail("Connexion error") - if (fwrite(buff, sizeof(char), size, sock) < (unsigned int) size) - fail("Connexion error") + if (fwrite(buff, sizeof(char), size, sock) < (unsigned int) size) + fail("Connexion error") - va_end(ap); + va_end(ap); } noreturn static inline void @@ -727,7 +727,7 @@ stickers_set__(struct lkt_cmd_args *args) FILE *sock = lkt_connect(); char buff[2]; write_socket(sock, "sticker set %s %s %s %s\n", args->argv[0], - args->argv[1], args->argv[2], args->argv[3]); + args->argv[1], args->argv[2], args->argv[3]); exit_with_status(sock, buff); } @@ -738,10 +738,10 @@ stickers_delete__(struct lkt_cmd_args *args) char buff[2]; if (args->argc == 2) write_socket(sock = lkt_connect(), "sticker delete %s %s", - args->argv[0], args->argv[1]); + args->argv[0], args->argv[1]); else if (args->argc == 3) write_socket(sock = lkt_connect(), "sticker delete %s %s %s", - args->argv[0], args->argv[1], args->argv[2]); + args->argv[0], args->argv[1], args->argv[2]); else fail("Invalid argument"); exit_with_status(sock, buff); -- GitLab