mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-16 07:46:27 -04:00
metadata_v2: refactor directory_view
This commit is contained in:
parent
3d833dc9ef
commit
4b4ed714ac
@ -54,20 +54,26 @@ class entry_view
|
||||
};
|
||||
|
||||
class directory_view
|
||||
: public ::apache::thrift::frozen::View<thrift::metadata::directory> {
|
||||
: public ::apache::thrift::frozen::View<thrift::metadata::entry> {
|
||||
public:
|
||||
directory_view(
|
||||
::apache::thrift::frozen::View<thrift::metadata::directory> dv,
|
||||
::apache::thrift::frozen::View<thrift::metadata::entry> ev,
|
||||
::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata> const*
|
||||
meta)
|
||||
: ::apache::thrift::frozen::View<thrift::metadata::directory>(dv)
|
||||
: ::apache::thrift::frozen::View<thrift::metadata::entry>(ev)
|
||||
, meta_(meta) {}
|
||||
|
||||
uint32_t parent_inode() const;
|
||||
uint32_t first_entry() const;
|
||||
uint32_t entry_count() const;
|
||||
|
||||
boost::integer_range<uint32_t> entry_range() const;
|
||||
|
||||
uint32_t self_inode();
|
||||
|
||||
private:
|
||||
::apache::thrift::frozen::View<thrift::metadata::directory> getdir() const;
|
||||
::apache::thrift::frozen::View<thrift::metadata::directory>
|
||||
getdir(uint32_t ino) const;
|
||||
|
||||
::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata> const*
|
||||
meta_;
|
||||
};
|
||||
|
@ -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<uint32_t> directory_view::entry_range() const {
|
||||
auto first = first_entry();
|
||||
return boost::irange(first, first + entry_count());
|
||||
::apache::thrift::frozen::View<thrift::metadata::directory>
|
||||
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<thrift::metadata::directory>
|
||||
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<uint32_t> 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
|
||||
|
@ -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<void(entry_view)> const& func) const;
|
||||
|
||||
@ -230,7 +226,7 @@ void metadata_<LoggerPolicy>::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_<LoggerPolicy>::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_<LoggerPolicy>::walk(
|
||||
entry_view entry, std::function<void(entry_view)> 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_<LoggerPolicy>::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_<LoggerPolicy>::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_<LoggerPolicy>::opendir(entry_view entry) const {
|
||||
std::optional<directory_view> rv;
|
||||
|
||||
if (S_ISDIR(entry.mode())) {
|
||||
rv = getdir(entry);
|
||||
rv = make_directory_view(entry);
|
||||
}
|
||||
|
||||
return rv;
|
||||
@ -415,7 +411,7 @@ std::optional<std::pair<entry_view, std::string_view>>
|
||||
metadata_<LoggerPolicy>::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()), "..");
|
||||
|
Loading…
x
Reference in New Issue
Block a user