From f85c29145196e97baac3fab73478bb268e17fa3f Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Thu, 3 Sep 2020 17:20:32 +0200
Subject: [PATCH] MISC: fix queue bugs on clear / play / stop / etc

- Fix the clear to whipe the autoinc ids
- Stop player on clear playlist to avoid desync
  problems and inconsistencies in the queue
---
 src/base/commands.c  |  5 +++--
 src/database/queue.c | 17 ++++++++++++-----
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/src/base/commands.c b/src/base/commands.c
index 5fc5b0ac..4d742a50 100644
--- a/src/base/commands.c
+++ b/src/base/commands.c
@@ -245,7 +245,7 @@ command_playid(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX])
 bool
 command_stop(struct lkt_state *srv, char __attribute__((unused))  *args[LKT_MESSAGE_ARGS_MAX])
 {
-    RETURN_UNLESS(database_queue_stop(srv->db), "DB error", false);
+    RETURN_UNLESS(database_queue_stop(srv->db), "DB error on stop", false);
     MOD_PROC(srv->window_mod, "close");
     srv->mpd_idle_events |= MPD_IDLE_PLAYER;
     return true;
@@ -283,7 +283,8 @@ inline bool
 command_clear(struct lkt_state *srv, char __attribute__((unused)) *args[LKT_MESSAGE_ARGS_MAX])
 {
     srv->mpd_idle_events |= MPD_IDLE_PLAYER;
-    return database_queue_clear(srv->db);
+    return command_stop(srv, args) &&
+           database_queue_clear(srv->db);
 }
 
 inline bool
diff --git a/src/database/queue.c b/src/database/queue.c
index 1573e565..ac5d1181 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -19,11 +19,18 @@
         SQLITE_DO_ROLLBACK(db);                                         \
         return false;                                                   \
     }
-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_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 queue_tmp;"
+                                                "DELETE FROM sqlite_sequence WHERE name = 'queue_tmp';"
+                                                "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
 // *INDENT-ON*
 
-- 
GitLab