db/simple/Song: allow LoadFile(), UpdateFile() to throw
Preparing to move logger calls out of lower-level libaries, and propagating error details to the caller instead.
This commit is contained in:
		@@ -42,8 +42,7 @@
 | 
			
		||||
#ifdef ENABLE_DATABASE
 | 
			
		||||
 | 
			
		||||
SongPtr
 | 
			
		||||
Song::LoadFile(Storage &storage, const char *path_utf8,
 | 
			
		||||
	       Directory &parent) noexcept
 | 
			
		||||
Song::LoadFile(Storage &storage, const char *path_utf8, Directory &parent)
 | 
			
		||||
{
 | 
			
		||||
	assert(!uri_has_scheme(path_utf8));
 | 
			
		||||
	assert(strchr(path_utf8, '\n') == nullptr);
 | 
			
		||||
@@ -60,17 +59,11 @@ Song::LoadFile(Storage &storage, const char *path_utf8,
 | 
			
		||||
#ifdef ENABLE_DATABASE
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
Song::UpdateFile(Storage &storage) noexcept
 | 
			
		||||
Song::UpdateFile(Storage &storage)
 | 
			
		||||
{
 | 
			
		||||
	const auto &relative_uri = GetURI();
 | 
			
		||||
 | 
			
		||||
	StorageFileInfo info;
 | 
			
		||||
	try {
 | 
			
		||||
		info = storage.GetInfo(relative_uri.c_str(), true);
 | 
			
		||||
	} catch (...) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const auto info = storage.GetInfo(relative_uri.c_str(), true);
 | 
			
		||||
	if (!info.IsRegular())
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -105,13 +105,23 @@ struct Song {
 | 
			
		||||
	 * allocate a new song structure with a local file name and attempt to
 | 
			
		||||
	 * load its metadata.  If all decoder plugin fail to read its meta
 | 
			
		||||
	 * data, nullptr is returned.
 | 
			
		||||
	 *
 | 
			
		||||
	 * Throws on error.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return the song on success, nullptr if the file was not
 | 
			
		||||
	 * recognized
 | 
			
		||||
	 */
 | 
			
		||||
	static SongPtr LoadFile(Storage &storage, const char *name_utf8,
 | 
			
		||||
				Directory &parent) noexcept;
 | 
			
		||||
				Directory &parent);
 | 
			
		||||
 | 
			
		||||
	void Free() noexcept;
 | 
			
		||||
 | 
			
		||||
	bool UpdateFile(Storage &storage) noexcept;
 | 
			
		||||
	/**
 | 
			
		||||
	 * Throws on error.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return true on success, false if the file was not recognized
 | 
			
		||||
	 */
 | 
			
		||||
	bool UpdateFile(Storage &storage);
 | 
			
		||||
 | 
			
		||||
#ifdef ENABLE_ARCHIVE
 | 
			
		||||
	static SongPtr LoadFromArchive(ArchiveFile &archive,
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ inline void
 | 
			
		||||
UpdateWalk::UpdateSongFile2(Directory &directory,
 | 
			
		||||
			    const char *name, const char *suffix,
 | 
			
		||||
			    const StorageFileInfo &info) noexcept
 | 
			
		||||
{
 | 
			
		||||
try {
 | 
			
		||||
	Song *song;
 | 
			
		||||
	{
 | 
			
		||||
		const ScopeDatabaseLock protect;
 | 
			
		||||
@@ -61,6 +61,7 @@ UpdateWalk::UpdateSongFile2(Directory &directory,
 | 
			
		||||
	if (song == nullptr) {
 | 
			
		||||
		FormatDebug(update_domain, "reading %s/%s",
 | 
			
		||||
			    directory.GetPath(), name);
 | 
			
		||||
 | 
			
		||||
		auto new_song = Song::LoadFile(storage, name, directory);
 | 
			
		||||
		if (!new_song) {
 | 
			
		||||
			FormatDebug(update_domain,
 | 
			
		||||
@@ -89,6 +90,10 @@ UpdateWalk::UpdateSongFile2(Directory &directory,
 | 
			
		||||
 | 
			
		||||
		modified = true;
 | 
			
		||||
	}
 | 
			
		||||
} catch (...) {
 | 
			
		||||
	FormatError(std::current_exception(),
 | 
			
		||||
		    "error reading file %s/%s",
 | 
			
		||||
		    directory.GetPath(), name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user