db/update: catch exceptions from Storage plugins

This commit is contained in:
Max Kellermann 2016-09-16 17:05:28 +02:00
parent ab967462e6
commit 100308db02
3 changed files with 41 additions and 10 deletions

View File

@ -35,6 +35,8 @@
#include "TagArchive.hxx"
#endif
#include <stdexcept>
#include <assert.h>
#include <string.h>
@ -65,8 +67,13 @@ Song::UpdateFile(Storage &storage)
const auto &relative_uri = GetURI();
StorageFileInfo info;
if (!storage.GetInfo(relative_uri.c_str(), true, info, IgnoreError()))
try {
if (!storage.GetInfo(relative_uri.c_str(), true, info,
IgnoreError()))
return false;
} catch (const std::runtime_error &) {
return false;
}
if (!info.IsRegular())
return false;

View File

@ -28,34 +28,47 @@
#include "util/Error.hxx"
#include "Log.hxx"
#include <stdexcept>
#include <errno.h>
bool
GetInfo(Storage &storage, const char *uri_utf8, StorageFileInfo &info)
{
try {
Error error;
bool success = storage.GetInfo(uri_utf8, true, info, error);
if (!success)
LogError(error);
return success;
} catch (const std::runtime_error &e) {
LogError(e);
return false;
}
bool
GetInfo(StorageDirectoryReader &reader, StorageFileInfo &info)
{
try {
Error error;
bool success = reader.GetInfo(true, info, error);
if (!success)
LogError(error);
return success;
} catch (const std::runtime_error &e) {
LogError(e);
return false;
}
bool
DirectoryExists(Storage &storage, const Directory &directory)
{
StorageFileInfo info;
if (!storage.GetInfo(directory.GetPath(), true, info, IgnoreError()))
try {
if (!storage.GetInfo(directory.GetPath(), true, info, IgnoreError()))
return false;
} catch (const std::runtime_error &) {
return false;
}
return directory.device == DEVICE_INARCHIVE ||
directory.device == DEVICE_CONTAINER
@ -75,11 +88,13 @@ GetDirectoryChildInfo(Storage &storage, const Directory &directory,
bool
directory_child_is_regular(Storage &storage, const Directory &directory,
const char *name_utf8)
{
try {
StorageFileInfo info;
return GetDirectoryChildInfo(storage, directory, name_utf8, info,
IgnoreError()) &&
info.IsRegular();
} catch (const std::runtime_error &) {
return false;
}
bool

View File

@ -42,11 +42,13 @@
#include "util/Error.hxx"
#include "Log.hxx"
#include <stdexcept>
#include <memory>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <memory>
UpdateWalk::UpdateWalk(EventLoop &_loop, DatabaseListener &_listener,
Storage &_storage)
@ -333,10 +335,17 @@ UpdateWalk::UpdateDirectory(Directory &directory,
directory_set_stat(directory, info);
Error error;
const std::unique_ptr<StorageDirectoryReader> reader(storage.OpenDirectory(directory.GetPath(), error));
if (reader.get() == nullptr) {
LogError(error);
std::unique_ptr<StorageDirectoryReader> reader;
try {
Error error;
reader.reset(storage.OpenDirectory(directory.GetPath(), error));
if (!reader) {
LogError(error);
return false;
}
} catch (const std::runtime_error &e) {
LogError(e);
return false;
}