From 4b4ed714aca1b8a956c88bcd07bc0431015d20c2 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Sat, 28 Nov 2020 18:17:34 +0100 Subject: [PATCH] metadata_v2: refactor directory_view --- include/dwarfs/metadata_types.h | 16 +++++++++++----- src/dwarfs/metadata_types.cpp | 32 ++++++++++++++++++++------------ src/dwarfs/metadata_v2.cpp | 22 +++++++++------------- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/include/dwarfs/metadata_types.h b/include/dwarfs/metadata_types.h index 83bf26b8..685b884e 100644 --- a/include/dwarfs/metadata_types.h +++ b/include/dwarfs/metadata_types.h @@ -54,20 +54,26 @@ class entry_view }; class directory_view - : public ::apache::thrift::frozen::View { + : public ::apache::thrift::frozen::View { public: directory_view( - ::apache::thrift::frozen::View dv, + ::apache::thrift::frozen::View ev, ::apache::thrift::frozen::MappedFrozen const* meta) - : ::apache::thrift::frozen::View(dv) + : ::apache::thrift::frozen::View(ev) , meta_(meta) {} + uint32_t parent_inode() const; + uint32_t first_entry() const; + uint32_t entry_count() const; + boost::integer_range entry_range() const; - uint32_t self_inode(); - private: + ::apache::thrift::frozen::View getdir() const; + ::apache::thrift::frozen::View + getdir(uint32_t ino) const; + ::apache::thrift::frozen::MappedFrozen const* meta_; }; diff --git a/src/dwarfs/metadata_types.cpp b/src/dwarfs/metadata_types.cpp index 2b9c11be..61c01c5f 100644 --- a/src/dwarfs/metadata_types.cpp +++ b/src/dwarfs/metadata_types.cpp @@ -38,20 +38,28 @@ uint16_t entry_view::getuid() const { return meta_->uids()[owner_index()]; } uint16_t entry_view::getgid() const { return meta_->gids()[group_index()]; } -boost::integer_range directory_view::entry_range() const { - auto first = first_entry(); - return boost::irange(first, first + entry_count()); +::apache::thrift::frozen::View +directory_view::getdir() const { + return getdir(inode()); } -uint32_t directory_view::self_inode() { - auto pos = getPosition().bitOffset; - if (pos > 0) { - // XXX: this is evil trickery... - auto one = meta_->directories()[1].getPosition().bitOffset; - assert(pos % one == 0); - pos /= one; - } - return pos; +::apache::thrift::frozen::View +directory_view::getdir(uint32_t ino) const { + return meta_->directories()[ino]; +} + +uint32_t directory_view::entry_count() const { return getdir().entry_count(); } + +boost::integer_range directory_view::entry_range() const { + auto d = getdir(); + auto first = d.first_entry(); + return boost::irange(first, first + d.entry_count()); +} + +uint32_t directory_view::first_entry() const { return getdir().first_entry(); } + +uint32_t directory_view::parent_inode() const { + return getdir().parent_inode(); } } // namespace dwarfs diff --git a/src/dwarfs/metadata_v2.cpp b/src/dwarfs/metadata_v2.cpp index 60e702fa..c042b7cb 100644 --- a/src/dwarfs/metadata_v2.cpp +++ b/src/dwarfs/metadata_v2.cpp @@ -146,8 +146,8 @@ class metadata_ : public metadata_v2::impl { return make_entry_view(meta_.entry_index()[inode]); } - directory_view make_directory_view(size_t index) const { - return directory_view(meta_.directories()[index], &meta_); + directory_view make_directory_view(entry_view entry) const { + return directory_view(entry, &meta_); } void dump(std::ostream& os, const std::string& indent, entry_view entry, @@ -181,10 +181,6 @@ class metadata_ : public metadata_v2::impl { } } - directory_view getdir(entry_view entry) const { - return make_directory_view(entry.inode()); - } - void walk(entry_view entry, std::function const& func) const; @@ -230,7 +226,7 @@ void metadata_::dump( os << " " << file_size(entry, mode) << "\n"; icb(indent + " ", inode); } else if (S_ISDIR(mode)) { - dump(os, indent + " ", make_directory_view(inode), std::move(icb)); + dump(os, indent + " ", make_directory_view(entry), std::move(icb)); } else if (S_ISLNK(mode)) { os << " -> " << link_value(entry) << "\n"; } else { @@ -245,7 +241,7 @@ void metadata_::dump( auto count = dir.entry_count(); auto first = dir.first_entry(); - os << "(" << count << " entries) [" << dir.self_inode() << ", " + os << "(" << count << " entries) [" << dir.inode() << ", " << dir.parent_inode() << "]\n"; for (size_t i = 0; i < count; ++i) { @@ -299,7 +295,7 @@ void metadata_::walk( entry_view entry, std::function const& func) const { func(entry); if (S_ISDIR(entry.mode())) { - auto dir = getdir(entry); + auto dir = make_directory_view(entry); for (auto cur : dir.entry_range()) { walk(make_entry_view(cur), func); } @@ -348,7 +344,7 @@ metadata_::find(const char* path) const { const char* next = ::strchr(path, '/'); size_t clen = next ? next - path : ::strlen(path); - entry = find(getdir(*entry), std::string_view(path, clen)); + entry = find(make_directory_view(*entry), std::string_view(path, clen)); if (!entry) { break; @@ -371,7 +367,7 @@ metadata_::find(int inode, const char* name) const { auto entry = get_entry(inode); if (entry) { - entry = find(getdir(*entry), std::string_view(name)); + entry = find(make_directory_view(*entry), std::string_view(name)); } return entry; @@ -404,7 +400,7 @@ metadata_::opendir(entry_view entry) const { std::optional rv; if (S_ISDIR(entry.mode())) { - rv = getdir(entry); + rv = make_directory_view(entry); } return rv; @@ -415,7 +411,7 @@ std::optional> metadata_::readdir(directory_view dir, size_t offset) const { switch (offset) { case 0: - return std::pair(make_entry_view_from_inode(dir.self_inode()), "."); + return std::pair(make_entry_view_from_inode(dir.inode()), "."); case 1: return std::pair(make_entry_view_from_inode(dir.parent_inode()), "..");