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:
Max Kellermann 2019-05-21 22:56:08 +02:00
parent 6ee7d88af0
commit 3fc4da382e
3 changed files with 21 additions and 13 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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