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
	 Max Kellermann
					Max Kellermann