From 898d50002feb6780f5b09f700a22ecbe8d61dc2e Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Sat, 11 Apr 2020 10:43:32 +0200 Subject: [PATCH] Only supports the deleteid for the moment, really, delete by pos and ranges don't really need to exists... --- src/commands.c | 54 ------------------------------------------- src/database/queue.c | 55 ++++++++++---------------------------------- src/main/lkt.c | 37 ++++++----------------------- src/net/listen.c | 3 --- 4 files changed, 19 insertions(+), 130 deletions(-) diff --git a/src/commands.c b/src/commands.c index 09d10e81..cc65c13a 100644 --- a/src/commands.c +++ b/src/commands.c @@ -365,60 +365,6 @@ command_crop(sqlite3 *db, enum mpd_idle_flag *watch_mask_ptr) return database_queue_crop(db); } -bool -command_del(sqlite3 *db, struct lkt_win *win, char *pos_range, enum mpd_idle_flag *watch_mask_ptr) -{ - (void) win; - long pos_lowwer, pos_upper = -1, i; - char *endptr; - bool ret = true; - - if (pos_range == NULL) { - fprintf(stderr, " ! command_del: NULL argument\n"); - return false; - } - - errno = 0; - *watch_mask_ptr |= MPD_IDLE_PLAYLIST; - pos_lowwer = strtol(pos_range, &endptr, 10); - - if ((errno == ERANGE && (pos_lowwer == LONG_MAX || pos_lowwer == LONG_MIN)) - || (errno != 0 && pos_lowwer == 0)) { - fprintf(stderr, " ! command_del: strtol failed: %s\n", strerror(errno)); - return false; - } - - if (endptr == pos_range) { - fprintf(stderr, " ! command_del: No digit found, invalid argument\n"); - return false; - } - - // Second digit -> a range - if (*endptr != '\0') { - fprintf(stderr, " . command_del: two digit found in string '%s'\n", pos_range); - pos_range = endptr + strcspn(endptr, "0123456789"); - - pos_upper = strtol(pos_range, &endptr, 10); - - if ((errno == ERANGE && (pos_upper == LONG_MAX || pos_upper == LONG_MIN)) - || (errno != 0 && pos_upper == 0)) { - fprintf(stderr, " ! command_del: strtol failed: %s\n", strerror(errno)); - return false; - } - - fprintf(stderr, " . command_del: Going from %ld to %ld\n", pos_lowwer, pos_upper); - } - - if (pos_lowwer >= pos_upper) - return database_queue_del_pos(db, pos_lowwer); - else { - for (i = pos_lowwer; i <= pos_upper; ++i) - ret &= database_queue_del_pos(db, pos_lowwer); - - return ret; - } -} - bool command_delid(sqlite3 *db, struct lkt_win *win, char *id_str, enum mpd_idle_flag *watch_mask_ptr) { diff --git a/src/database/queue.c b/src/database/queue.c index e8cfe1be..b0b5e500 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -303,54 +303,23 @@ error: return status; } -static bool -queue_rm_with_sql(sqlite3 *db, const char *sql, int arg) -{ - bool res = false; - sqlite3_stmt *stmt = 0; - SQLITE_PREPARE(db, stmt, sql, err); - SQLITE_BIND_INT(db, stmt, 1, arg, err); - if (sqlite3_step(stmt) != SQLITE_DONE) { - fprintf(stderr, " ! del_kara_with_sql: Failed to delete kara: %s\n", - sqlite3_errmsg(db)); - goto err; - } - - res = true; -err: - sqlite3_finalize(stmt); - return res; -} - bool database_queue_del_id(sqlite3 *db, int id) { - static const char *SQL_DEL_KARA = "DELETE FROM queue WHERE kara_id = ?;"; - if (!queue_rm_with_sql(db, SQL_DEL_KARA, id)) - return false; - SQLITE_EXEC(db, "UPDATE queue_state SET current = current - 1;", err); - return true; -err: - return false; -} - -bool -database_queue_del_pos(sqlite3 *db, int pos) -{ - /* Update current if we delete a kara before it. If we delete the current, - also do the -1, so we can play the “old next†kara. */ - static const char *SQL_DEL_POS = - "BEGIN TRANSACTION;" - "UPDATE queue_state SET current = current - 1 WHERE %d > current;" - "DELETE FROM queue WHERE position = (SELECT old_position FROM queue_ WHERE position = %d);" - "COMMIT TRANSACTION;"; + static const char *SQL_TEMPLATE = + "WITH before (pos) AS (SELECT position FROM queue_ JOIN queue_state WHERE position < current)" + "UPDATE queue_state SET current = CASE" + " WHEN (SELECT pos FROM before) IS NULL THEN (SELECT pos FROM queue_ ORDER BY position DESC LIMIT 1)" + " WHEN current IS NULL THEN NULL" + " ELSE (SELECT pos FROM before)" + "END;" + "DELETE FROM queue WHERE kara_id = %d;"; char SQL[LKT_MAX_SQLITE_STATEMENT]; - snprintf(SQL, LKT_MAX_SQLITE_STATEMENT - 1, SQL_DEL_POS, pos, pos); - SQL[LKT_MAX_SQLITE_STATEMENT - 1] = 0; - SQLITE_EXEC(db, SQL, err); + snprintf(SQL, LKT_MAX_SQLITE_STATEMENT - 1, SQL_TEMPLATE, id); + SQL[LKT_MAX_SQLITE_STATEMENT - 1] = '\0'; + SQLITE_EXEC(db, SQL, error); return true; -err: - SQLITE_DO_ROLLBACK(db); +error: return false; } diff --git a/src/main/lkt.c b/src/main/lkt.c index 0734beed..d6b2e83e 100644 --- a/src/main/lkt.c +++ b/src/main/lkt.c @@ -48,7 +48,7 @@ help(void) " status: get the status of lektor.\n" " current: get the currently playing song.\n" " add <query>: add a kara to the playlist with a query.\n" - " delete <arg>: delete the id or a range of ids from the queue.\n" + " delete <id>: delete the id from the queue.\n" " clear: clear the queue of lektor.\n" " prev: play previous kara in the queue.\n" " next: play the next kara in the queue.\n" @@ -485,37 +485,14 @@ delete__(struct lkt_cmd_args *args) if (args->argc != 1) fail("Invalid argument, need onlt one argument"); - static const char *cmd_range__ = "delete %s\nclose\n"; - static const char *cmd_id__ = "deleteid %d\nclose\n"; - int dumy1 = 0, dumy2 = 0;; + static const char *cmd_id__ = "deleteid %d\nclose\n"; + int dumy = 0; FILE *sock = lkt_connect(); - char buff[3], dumy3; + char buff[3]; - /* Is this a range? matches only `int:int` */ - sscanf(args->argv[0], "%d:%d", &dumy1, &dumy2); - if (dumy1 != 0 && dumy2 != 0) { - write_socket_format(sock, cmd_range__, args->argv[0]); - goto check; - } - - /* Ranges, matches `:int`. */ - sscanf(args->argv[0], ":%d", &dumy1); - if (args->argv[0][0] == ':' && dumy1 != 0) { - write_socket_format(sock, cmd_range__, args->argv[0]); - goto check; - } - - /* Ranges, matches `int:`. */ - sscanf(args->argv[0], "%d%c", &dumy1, &dumy3); - if (dumy1 != 0 && dumy3 == ':') { - write_socket_format(sock, cmd_range__, args->argv[0]); - goto check; - } - - /* Or only an id? */ - sscanf(args->argv[0], "%d", &dumy1); - if (dumy1 != 0) { - write_socket_format(sock, cmd_id__, dumy1); + sscanf(args->argv[0], "%d", &dumy); + if (dumy != 0) { + write_socket_format(sock, cmd_id__, dumy); goto check; } diff --git a/src/net/listen.c b/src/net/listen.c index b2705dfa..58b27432 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -211,9 +211,6 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) else if (!strcmp(cmd.name, "deleteid")) err = ! (cmd.args[0] != NULL && command_delid(srv->db, &srv->win, cmd.args[0], &srv->mpd_idle_events)); - else if (!strcmp(cmd.name, "delete")) - err = ! (cmd.args[0] != NULL && - command_del(srv->db, &srv->win, cmd.args[0], &srv->mpd_idle_events)); else if (!strcmp(cmd.name, "playlistclear")) err = ! command_plt_clear(srv->db, cmd.args, &srv->mpd_idle_events); -- GitLab