From: Andre Noll <maan@tuebingen.mpg.de>
Date: Fri, 11 Mar 2022 22:38:13 +0000 (+0100)
Subject: Merge load_playlist() into playlist_open() and simplify.
X-Git-Tag: v0.7.2~14^2~9
X-Git-Url: https://git.tuebingen.mpg.de/?a=commitdiff_plain;h=11f6b66a8eb345185c4a4bc8dc8d6059835d37f0;p=paraslash.git

Merge load_playlist() into playlist_open() and simplify.

They are reasonably small. Remove the weird calling convention with
the PLAYLIST_LOADED error code and the pointless check for the dummy
row because they only obfuscate the code. Moreover, the comment of
load_playlist() is actively misleading because this function is not
a loop callback. Extend the documentation of the combined public
playlist_open() while at it.

The code can be simplified by calling pl_get_def_by_name() rather
than osl_get_row() followed by pl_get_name_and_def_by_row().
---

diff --git a/error.h b/error.h
index 5268feae..4cd8dafc 100644
--- a/error.h
+++ b/error.h
@@ -168,7 +168,6 @@
 	PARA_ERROR(OPUS_SET_GAIN, "opus: could not set gain"), \
 	PARA_ERROR(PATH_FOUND, ""), /* not really an error */ \
 	PARA_ERROR(PLAYLIST_EMPTY, "attempted to load empty playlist"), \
-	PARA_ERROR(PLAYLIST_LOADED, ""), /* not really an error */ \
 	PARA_ERROR(PREBUFFER_SUCCESS, "prebuffering complete"), \
 	PARA_ERROR(PRIVATE_KEY, "can not read private key"), \
 	PARA_ERROR(QUEUE, "packet queue overrun"), \
diff --git a/playlist.c b/playlist.c
index 65c2148a..171a6d26 100644
--- a/playlist.c
+++ b/playlist.c
@@ -55,37 +55,6 @@ static int add_playlist_entry(char *path, void *data)
 	return 1;
 }
 
-/* returns -E_PLAYLIST_LOADED on _success_ to terminate the loop */
-static int load_playlist(struct osl_row *row, void *data)
-{
-	struct playlist_info *playlist = data;
-	struct osl_object playlist_def;
-	char *playlist_name;
-	int ret;
-
-	ret = pl_get_name_and_def_by_row(row, &playlist_name, &playlist_def);
-	if (ret < 0)
-		goto err;
-	playlist->length = 0;
-	ret = for_each_line(FELF_READ_ONLY, playlist_def.data,
-		playlist_def.size, add_playlist_entry, playlist);
-	osl_close_disk_object(&playlist_def);
-	if (ret < 0)
-		goto err;
-	ret = -E_PLAYLIST_EMPTY;
-	if (!playlist->length)
-		goto err;
-	playlist->name = para_strdup(playlist_name);
-	PARA_NOTICE_LOG("loaded playlist %s (%u files)\n", playlist->name,
-		playlist->length);
-	return -E_PLAYLIST_LOADED;
-err:
-	if (ret != -E_DUMMY_ROW)
-		PARA_NOTICE_LOG("unable to load playlist (%s)\n",
-			para_strerror(-ret));
-	return 1;
-}
-
 static int check_playlist_path(char *path, void *data)
 {
 	struct para_buffer *pb = data;
@@ -144,38 +113,57 @@ void playlist_close(void)
 		return;
 	free(current_playlist.name);
 	current_playlist.name = NULL;
+	current_playlist.length = 0;
 }
 
 /**
- * Open and load the given playlist.
+ * Populate the score table from the paths of a playlist database object.
+ *
+ * This loads the blob object which corresponds to the given name from the
+ * playlist table. Each line of the blob is regarded as a path which is looked
+ * up in the audio file table. If the path lookup succeeds, a reference to the
+ * corresponding row of the audio file table is added to the score table.
  *
  * \param name The name of the playlist to open.
  * \param errmsg To be sent to the client (if called via select command).
  *
- * Files which are listed in the playlist, but not contained in the database
- * are ignored.  This is not considered an error.
- *
  * \return The length of the loaded playlist on success, negative error code
- * else.
+ * else. Files which are listed in the playlist, but are not contained in the
+ * database are ignored. This is not considered an error.
  */
 int playlist_open(const char *name, char **errmsg)
 {
-	struct osl_object obj;
 	int ret;
-	struct osl_row *row;
+	struct playlist_info *playlist = &current_playlist;
+	struct osl_object playlist_def;
 
-	obj.data = (char *)name;
-	obj.size = strlen(obj.data);
-	ret = osl(osl_get_row(playlists_table, BLOBCOL_NAME, &obj, &row));
+	ret = pl_get_def_by_name(name, &playlist_def);
 	if (ret < 0) {
 		if (errmsg)
-			*errmsg = make_message("could not open playlist %s",
+			*errmsg = make_message("could not read playlist %s",
 				name);
 		return ret;
 	}
 	playlist_close();
-	ret = load_playlist(row, &current_playlist);
-	return (ret == -E_PLAYLIST_LOADED)? current_playlist.length : ret;
+	ret = for_each_line(FELF_READ_ONLY, playlist_def.data,
+		playlist_def.size, add_playlist_entry, playlist);
+	osl_close_disk_object(&playlist_def);
+	if (ret < 0)
+		goto err;
+	ret = -E_PLAYLIST_EMPTY;
+	if (!playlist->length)
+		goto err;
+	playlist->name = para_strdup(name);
+	PARA_NOTICE_LOG("loaded playlist %s (%u files)\n", playlist->name,
+		playlist->length);
+	/* success */
+	return current_playlist.length;
+err:
+	PARA_NOTICE_LOG("unable to load playlist %s\n", name);
+	if (errmsg)
+		*errmsg = make_message("unable to load playlist %s: %s\n",
+			name, para_strerror(-ret));
+	return ret;
 }
 
 static int search_path(char *path, void *data)