diff --git a/src/commands.c b/src/commands.c index b098144d1fead8acb66687f8430ef660918373fe..9437e85220b89e2607dea3dd4e7333f7c952f5ef 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 9df51114d8233b26dac02bf5fbfe44755c388d88..0d09857f507e3e7233ac2d07b35aff699cfa84b2 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 712a6b7599d1032d5a9840e1ac3300003d63b1ac..fbdf30dc7ac4d51a84792699819b39fc0c10f8a8 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 2618b4e0fa86d0bd3fa16e62d8809794cdd6250a..bb7613fb838a7811a9da12b866aadc94d24d4907 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);