mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-16 15:58:06 -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
|
class directory_view
|
||||||
: public ::apache::thrift::frozen::View<thrift::metadata::directory> {
|
: public ::apache::thrift::frozen::View<thrift::metadata::entry> {
|
||||||
public:
|
public:
|
||||||
directory_view(
|
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*
|
::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata> const*
|
||||||
meta)
|
meta)
|
||||||
: ::apache::thrift::frozen::View<thrift::metadata::directory>(dv)
|
: ::apache::thrift::frozen::View<thrift::metadata::entry>(ev)
|
||||||
, meta_(meta) {}
|
, 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;
|
boost::integer_range<uint32_t> entry_range() const;
|
||||||
|
|
||||||
uint32_t self_inode();
|
|
||||||
|
|
||||||
private:
|
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*
|
::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata> const*
|
||||||
meta_;
|
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()]; }
|
uint16_t entry_view::getgid() const { return meta_->gids()[group_index()]; }
|
||||||
|
|
||||||
boost::integer_range<uint32_t> directory_view::entry_range() const {
|
::apache::thrift::frozen::View<thrift::metadata::directory>
|
||||||
auto first = first_entry();
|
directory_view::getdir() const {
|
||||||
return boost::irange(first, first + entry_count());
|
return getdir(inode());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t directory_view::self_inode() {
|
::apache::thrift::frozen::View<thrift::metadata::directory>
|
||||||
auto pos = getPosition().bitOffset;
|
directory_view::getdir(uint32_t ino) const {
|
||||||
if (pos > 0) {
|
return meta_->directories()[ino];
|
||||||
// XXX: this is evil trickery...
|
}
|
||||||
auto one = meta_->directories()[1].getPosition().bitOffset;
|
|
||||||
assert(pos % one == 0);
|
uint32_t directory_view::entry_count() const { return getdir().entry_count(); }
|
||||||
pos /= one;
|
|
||||||
}
|
boost::integer_range<uint32_t> directory_view::entry_range() const {
|
||||||
return pos;
|
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
|
} // namespace dwarfs
|
||||||
|
@ -146,8 +146,8 @@ class metadata_ : public metadata_v2::impl {
|
|||||||
return make_entry_view(meta_.entry_index()[inode]);
|
return make_entry_view(meta_.entry_index()[inode]);
|
||||||
}
|
}
|
||||||
|
|
||||||
directory_view make_directory_view(size_t index) const {
|
directory_view make_directory_view(entry_view entry) const {
|
||||||
return directory_view(meta_.directories()[index], &meta_);
|
return directory_view(entry, &meta_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump(std::ostream& os, const std::string& indent, entry_view entry,
|
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
|
void
|
||||||
walk(entry_view entry, std::function<void(entry_view)> const& func) const;
|
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";
|
os << " " << file_size(entry, mode) << "\n";
|
||||||
icb(indent + " ", inode);
|
icb(indent + " ", inode);
|
||||||
} else if (S_ISDIR(mode)) {
|
} 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)) {
|
} else if (S_ISLNK(mode)) {
|
||||||
os << " -> " << link_value(entry) << "\n";
|
os << " -> " << link_value(entry) << "\n";
|
||||||
} else {
|
} else {
|
||||||
@ -245,7 +241,7 @@ void metadata_<LoggerPolicy>::dump(
|
|||||||
auto count = dir.entry_count();
|
auto count = dir.entry_count();
|
||||||
auto first = dir.first_entry();
|
auto first = dir.first_entry();
|
||||||
|
|
||||||
os << "(" << count << " entries) [" << dir.self_inode() << ", "
|
os << "(" << count << " entries) [" << dir.inode() << ", "
|
||||||
<< dir.parent_inode() << "]\n";
|
<< dir.parent_inode() << "]\n";
|
||||||
|
|
||||||
for (size_t i = 0; i < count; ++i) {
|
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 {
|
entry_view entry, std::function<void(entry_view)> const& func) const {
|
||||||
func(entry);
|
func(entry);
|
||||||
if (S_ISDIR(entry.mode())) {
|
if (S_ISDIR(entry.mode())) {
|
||||||
auto dir = getdir(entry);
|
auto dir = make_directory_view(entry);
|
||||||
for (auto cur : dir.entry_range()) {
|
for (auto cur : dir.entry_range()) {
|
||||||
walk(make_entry_view(cur), func);
|
walk(make_entry_view(cur), func);
|
||||||
}
|
}
|
||||||
@ -348,7 +344,7 @@ metadata_<LoggerPolicy>::find(const char* path) const {
|
|||||||
const char* next = ::strchr(path, '/');
|
const char* next = ::strchr(path, '/');
|
||||||
size_t clen = next ? next - path : ::strlen(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) {
|
if (!entry) {
|
||||||
break;
|
break;
|
||||||
@ -371,7 +367,7 @@ metadata_<LoggerPolicy>::find(int inode, const char* name) const {
|
|||||||
auto entry = get_entry(inode);
|
auto entry = get_entry(inode);
|
||||||
|
|
||||||
if (entry) {
|
if (entry) {
|
||||||
entry = find(getdir(*entry), std::string_view(name));
|
entry = find(make_directory_view(*entry), std::string_view(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
@ -404,7 +400,7 @@ metadata_<LoggerPolicy>::opendir(entry_view entry) const {
|
|||||||
std::optional<directory_view> rv;
|
std::optional<directory_view> rv;
|
||||||
|
|
||||||
if (S_ISDIR(entry.mode())) {
|
if (S_ISDIR(entry.mode())) {
|
||||||
rv = getdir(entry);
|
rv = make_directory_view(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
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 {
|
metadata_<LoggerPolicy>::readdir(directory_view dir, size_t offset) const {
|
||||||
switch (offset) {
|
switch (offset) {
|
||||||
case 0:
|
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:
|
case 1:
|
||||||
return std::pair(make_entry_view_from_inode(dir.parent_inode()), "..");
|
return std::pair(make_entry_view_from_inode(dir.parent_inode()), "..");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user