From 651f57bcede34a8a54509af32174dce1532d1a0a Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
Date: Thu, 11 Nov 2021 09:44:47 +0100
Subject: [PATCH] command/playlist: save only if at least one song was added

---
 src/command/PlaylistCommands.cxx | 10 ++++++----
 src/db/DatabasePlaylist.cxx      | 11 ++++++++---
 src/db/DatabasePlaylist.hxx      |  5 ++++-
 3 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/src/command/PlaylistCommands.cxx b/src/command/PlaylistCommands.cxx
index 5c0bc47a8..af9a75caa 100644
--- a/src/command/PlaylistCommands.cxx
+++ b/src/command/PlaylistCommands.cxx
@@ -233,10 +233,12 @@ handle_playlistadd_position(Client &client, const char *playlist_name,
 #ifdef ENABLE_DATABASE
 		const DatabaseSelection selection(uri, true, nullptr);
 
-		SearchInsertIntoPlaylist(client.GetDatabaseOrThrow(),
-					 client.GetStorage(),
-					 selection,
-					 editor, position);
+		if (SearchInsertIntoPlaylist(client.GetDatabaseOrThrow(),
+					     client.GetStorage(),
+					     selection,
+					     editor, position) == 0)
+			/* no song was found, don't need to save */
+			return CommandResult::OK;
 #else
 		(void)client;
 		r.Error(ACK_ERROR_NO_EXIST, "No database");
diff --git a/src/db/DatabasePlaylist.cxx b/src/db/DatabasePlaylist.cxx
index 9d72d32a8..931507c61 100644
--- a/src/db/DatabasePlaylist.cxx
+++ b/src/db/DatabasePlaylist.cxx
@@ -42,7 +42,7 @@ search_add_to_playlist(const Database &db, const Storage *storage,
 	db.Visit(selection, f);
 }
 
-void
+unsigned
 SearchInsertIntoPlaylist(const Database &db, const Storage *storage,
 			 const DatabaseSelection &selection,
 			 PlaylistFileEditor &playlist,
@@ -50,9 +50,14 @@ SearchInsertIntoPlaylist(const Database &db, const Storage *storage,
 {
 	assert(position <= playlist.size());
 
-	db.Visit(selection, [&playlist, &position, storage](const auto &song){
-		playlist.Insert(position,
+	unsigned n = 0;
+
+	db.Visit(selection, [&playlist, &position, &n, storage](const auto &song){
+		playlist.Insert(position + n,
 				DatabaseDetachSong(storage, song));
 		++position;
+		++n;
 	});
+
+	return n;
 }
diff --git a/src/db/DatabasePlaylist.hxx b/src/db/DatabasePlaylist.hxx
index bbe3e2f29..ce6a88d19 100644
--- a/src/db/DatabasePlaylist.hxx
+++ b/src/db/DatabasePlaylist.hxx
@@ -33,7 +33,10 @@ search_add_to_playlist(const Database &db, const Storage *storage,
 		       const char *playlist_path_utf8,
 		       const DatabaseSelection &selection);
 
-void
+/**
+ * @return the number of songs added
+ */
+unsigned
 SearchInsertIntoPlaylist(const Database &db, const Storage *storage,
 			 const DatabaseSelection &selection,
 			 PlaylistFileEditor &playlist,