From 698469d40f3a1a69e54f8cdc6c11a1d22fdfe96e Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Fri, 10 Apr 2020 21:21:12 +0200 Subject: [PATCH] Fix the del by range --- inc/lektor/macro.h | 3 +++ src/commands.c | 13 ++++++++++--- src/database/queue.c | 24 +++++++++++++----------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/inc/lektor/macro.h b/inc/lektor/macro.h index 3ac78e56..5403ef8c 100644 --- a/inc/lektor/macro.h +++ b/inc/lektor/macro.h @@ -28,6 +28,9 @@ goto error; \ } +#define SQLITE_DO_ROLLBACK(db) \ + sqlite3_exec(db, "ROLLBACK TRANSACTION;\n", NULL, NULL, NULL); + #ifndef MAX #define MAX(a, b) ((a) < (b) ? (b) : (a)) #endif /* MAX */ diff --git a/src/commands.c b/src/commands.c index 2282c9bb..09d10e81 100644 --- a/src/commands.c +++ b/src/commands.c @@ -388,9 +388,14 @@ command_del(sqlite3 *db, struct lkt_win *win, char *pos_range, enum mpd_idle_fla return false; } - // Second digit -> a range if (endptr == pos_range) { - fprintf(stderr, " . command_del: to digit found in string '%s'\n", 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); @@ -400,13 +405,15 @@ command_del(sqlite3 *db, struct lkt_win *win, char *pos_range, enum mpd_idle_fla 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, i); + ret &= database_queue_del_pos(db, pos_lowwer); return ret; } diff --git a/src/database/queue.c b/src/database/queue.c index e51b1ab2..e8cfe1be 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -337,18 +337,20 @@ err: 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 = - "DELETE FROM queue" - " WHERE position = " - " ( SELECT old_position" - " FROM queue_" - " WHERE position = ?" - " );"; - if (!queue_rm_with_sql(db, SQL_DEL_POS, pos)) - return false; - SQLITE_EXEC(db, "UPDATE queue_state SET current = current - 1;", err); + "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;"; + 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); return true; err: + SQLITE_DO_ROLLBACK(db); return false; } @@ -591,8 +593,8 @@ database_queue_get_current_file(sqlite3 *db, char filepath[PATH_MAX]) static const char *SQL_STMT = "SELECT file_path" " FROM kara" - " JOIN queue ON kara.id = queue.kara_id" - " JOIN queue_state ON queue.position = queue_state.current"; + " JOIN queue_ ON kara.id = queue_.kara_id" + " JOIN queue_state ON queue_.position = queue_state.current"; bool status = false; int code = SQLITE_OK; sqlite3_stmt *stmt = NULL; -- GitLab