storage/FileInfo: convert mtime to std::chrono::system_clock::time_point

This commit is contained in:
Max Kellermann 2017-02-11 22:47:05 +01:00
parent 0ccaf4a1ff
commit 6636c69a11
12 changed files with 29 additions and 27 deletions

View File

@ -88,7 +88,7 @@ Song::UpdateFile(Storage &storage)
return false; return false;
} }
mtime = info.mtime; mtime = std::chrono::system_clock::to_time_t(info.mtime);
tag_builder.Commit(tag); tag_builder.Commit(tag);
return true; return true;
} }

View File

@ -24,6 +24,7 @@
#include "Request.hxx" #include "Request.hxx"
#include "CommandError.hxx" #include "CommandError.hxx"
#include "util/UriUtil.hxx" #include "util/UriUtil.hxx"
#include "util/ChronoUtil.hxx"
#include "util/ConstBuffer.hxx" #include "util/ConstBuffer.hxx"
#include "fs/Traits.hxx" #include "fs/Traits.hxx"
#include "client/Client.hxx" #include "client/Client.hxx"
@ -88,7 +89,7 @@ handle_listfiles_storage(Response &r, StorageDirectoryReader &reader)
break; break;
} }
if (info.mtime != 0) if (!IsNegative(info.mtime))
time_print(r, "Last-Modified", info.mtime); time_print(r, "Last-Modified", info.mtime);
} }
} }

View File

@ -137,7 +137,7 @@ UpdateWalk::UpdateArchiveFile(Directory &parent, const char *name,
{ {
Directory *directory = LockFindChild(parent, name); Directory *directory = LockFindChild(parent, name);
if (directory != nullptr && directory->mtime == info.mtime && if (directory != nullptr && directory->mtime == std::chrono::system_clock::to_time_t(info.mtime) &&
!walk_discard) !walk_discard)
/* MPD has already scanned the archive, and it hasn't /* MPD has already scanned the archive, and it hasn't
changed since - don't consider updating it */ changed since - don't consider updating it */
@ -173,7 +173,7 @@ UpdateWalk::UpdateArchiveFile(Directory &parent, const char *name,
directory->device = DEVICE_INARCHIVE; directory->device = DEVICE_INARCHIVE;
} }
directory->mtime = info.mtime; directory->mtime = std::chrono::system_clock::to_time_t(info.mtime);
UpdateArchiveVisitor visitor(*this, *file, directory); UpdateArchiveVisitor visitor(*this, *file, directory);
file->Visit(visitor); file->Visit(visitor);

View File

@ -43,7 +43,7 @@ UpdateWalk::MakeDirectoryIfModified(Directory &parent, const char *name,
if (directory->IsMount()) if (directory->IsMount())
return nullptr; return nullptr;
if (directory->mtime == info.mtime && !walk_discard) { if (directory->mtime == std::chrono::system_clock::to_time_t(info.mtime) && !walk_discard) {
/* not modified */ /* not modified */
return nullptr; return nullptr;
} }
@ -53,7 +53,7 @@ UpdateWalk::MakeDirectoryIfModified(Directory &parent, const char *name,
} }
directory = parent.MakeChild(name); directory = parent.MakeChild(name);
directory->mtime = info.mtime; directory->mtime = std::chrono::system_clock::to_time_t(info.mtime);
return directory; return directory;
} }
@ -107,7 +107,7 @@ UpdateWalk::UpdateContainerFile(Directory &directory,
*contdir); *contdir);
// shouldn't be necessary but it's there.. // shouldn't be necessary but it's there..
song->mtime = info.mtime; song->mtime = std::chrono::system_clock::to_time_t(info.mtime);
FormatDefault(update_domain, "added %s/%s", FormatDefault(update_domain, "added %s/%s",
contdir->GetPath(), song->uri); contdir->GetPath(), song->uri);

View File

@ -51,7 +51,8 @@ UpdateWalk::UpdateSongFile2(Directory &directory,
return; return;
} }
if (!(song != nullptr && info.mtime == song->mtime && if (!(song != nullptr &&
std::chrono::system_clock::to_time_t(info.mtime) == song->mtime &&
!walk_discard) && !walk_discard) &&
UpdateContainerFile(directory, name, suffix, info)) { UpdateContainerFile(directory, name, suffix, info)) {
if (song != nullptr) if (song != nullptr)
@ -79,7 +80,7 @@ UpdateWalk::UpdateSongFile2(Directory &directory,
modified = true; modified = true;
FormatDefault(update_domain, "added %s/%s", FormatDefault(update_domain, "added %s/%s",
directory.GetPath(), name); directory.GetPath(), name);
} else if (info.mtime != song->mtime || walk_discard) { } else if (std::chrono::system_clock::to_time_t(info.mtime) != song->mtime || walk_discard) {
FormatDefault(update_domain, "updating %s/%s", FormatDefault(update_domain, "updating %s/%s",
directory.GetPath(), name); directory.GetPath(), name);
if (!song->UpdateFile(storage)) { if (!song->UpdateFile(storage)) {

View File

@ -192,7 +192,7 @@ UpdateWalk::UpdatePlaylistFile(Directory &directory,
if (!playlist_suffix_supported(suffix)) if (!playlist_suffix_supported(suffix))
return false; return false;
PlaylistInfo pi(name, info.mtime); PlaylistInfo pi(name, std::chrono::system_clock::to_time_t(info.mtime));
const ScopeDatabaseLock protect; const ScopeDatabaseLock protect;
if (directory.playlists.UpdateOrInsert(std::move(pi))) if (directory.playlists.UpdateOrInsert(std::move(pi)))
@ -382,7 +382,7 @@ UpdateWalk::UpdateDirectory(Directory &directory,
UpdateDirectoryChild(directory, child_exclude_list, name_utf8, info2); UpdateDirectoryChild(directory, child_exclude_list, name_utf8, info2);
} }
directory.mtime = info.mtime; directory.mtime = std::chrono::system_clock::to_time_t(info.mtime);
return true; return true;
} }

View File

@ -22,7 +22,8 @@
#include "check.h" #include "check.h"
#include <time.h> #include <chrono>
#include <stdint.h> #include <stdint.h>
struct StorageFileInfo { struct StorageFileInfo {
@ -40,9 +41,10 @@ struct StorageFileInfo {
uint64_t size; uint64_t size;
/** /**
* The modification time. 0 means unknown / not applicable. * The modification time. A negative value means unknown /
* not applicable.
*/ */
time_t mtime; std::chrono::system_clock::time_point mtime;
/** /**
* Device id and inode number. 0 means unknown / not * Device id and inode number. 0 means unknown / not
@ -55,7 +57,7 @@ struct StorageFileInfo {
explicit constexpr StorageFileInfo(Type _type) explicit constexpr StorageFileInfo(Type _type)
:type(_type), :type(_type),
size(0), size(0),
mtime(0), mtime(std::chrono::system_clock::time_point::min()),
device(0), inode(0) {} device(0), inode(0) {}
constexpr bool IsRegular() const { constexpr bool IsRegular() const {

View File

@ -418,9 +418,7 @@ protected:
? StorageFileInfo::Type::DIRECTORY ? StorageFileInfo::Type::DIRECTORY
: StorageFileInfo::Type::REGULAR; : StorageFileInfo::Type::REGULAR;
info.size = r.length; info.size = r.length;
info.mtime = !IsNegative(r.mtime) info.mtime = r.mtime;
? std::chrono::system_clock::to_time_t(r.mtime)
: 0;
} }
}; };
@ -514,9 +512,7 @@ protected:
? StorageFileInfo::Type::DIRECTORY ? StorageFileInfo::Type::DIRECTORY
: StorageFileInfo::Type::REGULAR); : StorageFileInfo::Type::REGULAR);
info.size = r.length; info.size = r.length;
info.mtime = !IsNegative(r.mtime) info.mtime = r.mtime;
? std::chrono::system_clock::to_time_t(r.mtime)
: 0;
} }
}; };

View File

@ -86,7 +86,7 @@ Stat(Path path, bool follow)
info.type = StorageFileInfo::Type::OTHER; info.type = StorageFileInfo::Type::OTHER;
info.size = src.GetSize(); info.size = src.GetSize();
info.mtime = std::chrono::system_clock::to_time_t(src.GetModificationTime()); info.mtime = src.GetModificationTime();
#ifdef WIN32 #ifdef WIN32
info.device = info.inode = 0; info.device = info.inode = 0;
#else #else

View File

@ -250,7 +250,7 @@ Copy(StorageFileInfo &info, const struct stat &st)
info.type = StorageFileInfo::Type::OTHER; info.type = StorageFileInfo::Type::OTHER;
info.size = st.st_size; info.size = st.st_size;
info.mtime = st.st_mtime; info.mtime = std::chrono::system_clock::from_time_t(st.st_mtime);
info.device = st.st_dev; info.device = st.st_dev;
info.inode = st.st_ino; info.inode = st.st_ino;
} }
@ -316,7 +316,7 @@ Copy(StorageFileInfo &info, const struct nfsdirent &ent)
} }
info.size = ent.size; info.size = ent.size;
info.mtime = ent.mtime.tv_sec; info.mtime = std::chrono::system_clock::from_time_t(ent.mtime.tv_sec);
info.device = 0; info.device = 0;
info.inode = ent.inode; info.inode = ent.inode;
} }

View File

@ -111,7 +111,7 @@ GetInfo(const char *path)
info.type = StorageFileInfo::Type::OTHER; info.type = StorageFileInfo::Type::OTHER;
info.size = st.st_size; info.size = st.st_size;
info.mtime = st.st_mtime; info.mtime = std::chrono::system_clock::from_time_t(st.st_mtime);
info.device = st.st_dev; info.device = st.st_dev;
info.inode = st.st_ino; info.inode = st.st_ino;
return info; return info;

View File

@ -23,6 +23,7 @@
#include "storage/Registry.hxx" #include "storage/Registry.hxx"
#include "storage/StorageInterface.hxx" #include "storage/StorageInterface.hxx"
#include "storage/FileInfo.hxx" #include "storage/FileInfo.hxx"
#include "util/ChronoUtil.hxx"
#include <memory> #include <memory>
#include <stdexcept> #include <stdexcept>
@ -69,9 +70,10 @@ Ls(Storage &storage, const char *path)
char mtime_buffer[32]; char mtime_buffer[32];
const char *mtime = " "; const char *mtime = " ";
if (info.mtime > 0) { if (!IsNegative(info.mtime)) {
time_t t = std::chrono::system_clock::to_time_t(info.mtime);
strftime(mtime_buffer, sizeof(mtime_buffer), "%F", strftime(mtime_buffer, sizeof(mtime_buffer), "%F",
gmtime(&info.mtime)); gmtime(&t));
mtime = mtime_buffer; mtime = mtime_buffer;
} }