db/update/Archive: use MakeDirectoryIfModified()
This commit is contained in:
parent
12beb22c1d
commit
177d3b0178
@ -37,13 +37,6 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static Directory *
|
|
||||||
LockFindChild(Directory &directory, const char *name) noexcept
|
|
||||||
{
|
|
||||||
const ScopeDatabaseLock protect;
|
|
||||||
return directory.FindChild(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Directory *
|
static Directory *
|
||||||
LockMakeChild(Directory &directory, const char *name) noexcept
|
LockMakeChild(Directory &directory, const char *name) noexcept
|
||||||
{
|
{
|
||||||
@ -134,46 +127,31 @@ UpdateWalk::UpdateArchiveFile(Directory &parent, const char *name,
|
|||||||
const StorageFileInfo &info,
|
const StorageFileInfo &info,
|
||||||
const ArchivePlugin &plugin) noexcept
|
const ArchivePlugin &plugin) noexcept
|
||||||
{
|
{
|
||||||
Directory *directory = LockFindChild(parent, name);
|
|
||||||
|
|
||||||
if (directory != nullptr && directory->mtime == info.mtime &&
|
|
||||||
!walk_discard)
|
|
||||||
/* MPD has already scanned the archive, and it hasn't
|
|
||||||
changed since - don't consider updating it */
|
|
||||||
return;
|
|
||||||
|
|
||||||
const auto path_fs = storage.MapChildFS(parent.GetPath(), name);
|
const auto path_fs = storage.MapChildFS(parent.GetPath(), name);
|
||||||
if (path_fs.IsNull())
|
if (path_fs.IsNull())
|
||||||
/* not a local file: skip, because the archive API
|
/* not a local file: skip, because the archive API
|
||||||
supports only local files */
|
supports only local files */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Directory *directory =
|
||||||
|
LockMakeVirtualDirectoryIfModified(parent, name, info,
|
||||||
|
DEVICE_INARCHIVE);
|
||||||
|
if (directory == nullptr)
|
||||||
|
/* not modified */
|
||||||
|
return;
|
||||||
|
|
||||||
/* open archive */
|
/* open archive */
|
||||||
std::unique_ptr<ArchiveFile> file;
|
std::unique_ptr<ArchiveFile> file;
|
||||||
try {
|
try {
|
||||||
file = archive_file_open(&plugin, path_fs);
|
file = archive_file_open(&plugin, path_fs);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
LogError(std::current_exception());
|
LogError(std::current_exception());
|
||||||
if (directory != nullptr)
|
editor.LockDeleteDirectory(directory);
|
||||||
editor.LockDeleteDirectory(directory);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
FormatDebug(update_domain, "archive %s opened", path_fs.c_str());
|
FormatDebug(update_domain, "archive %s opened", path_fs.c_str());
|
||||||
|
|
||||||
if (directory == nullptr) {
|
|
||||||
FormatDebug(update_domain,
|
|
||||||
"creating archive directory: %s", name);
|
|
||||||
|
|
||||||
const ScopeDatabaseLock protect;
|
|
||||||
directory = parent.CreateChild(name);
|
|
||||||
/* mark this directory as archive (we use device for
|
|
||||||
this) */
|
|
||||||
directory->device = DEVICE_INARCHIVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
directory->mtime = info.mtime;
|
|
||||||
|
|
||||||
UpdateArchiveVisitor visitor(*this, *file, directory);
|
UpdateArchiveVisitor visitor(*this, *file, directory);
|
||||||
file->Visit(visitor);
|
file->Visit(visitor);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user