diff --git a/src/SongUpdate.cxx b/src/SongUpdate.cxx index 9887da507..d873c81e9 100644 --- a/src/SongUpdate.cxx +++ b/src/SongUpdate.cxx @@ -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; diff --git a/src/db/plugins/simple/Song.hxx b/src/db/plugins/simple/Song.hxx index 23056cbbf..b37feef01 100644 --- a/src/db/plugins/simple/Song.hxx +++ b/src/db/plugins/simple/Song.hxx @@ -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, diff --git a/src/db/update/UpdateSong.cxx b/src/db/update/UpdateSong.cxx index c5c032618..b8da4deb2 100644 --- a/src/db/update/UpdateSong.cxx +++ b/src/db/update/UpdateSong.cxx @@ -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