diff --git a/include/dwarfs/reader/internal/metadata_v2.h b/include/dwarfs/reader/internal/metadata_v2.h index 1874f63a..ff2dd361 100644 --- a/include/dwarfs/reader/internal/metadata_v2.h +++ b/include/dwarfs/reader/internal/metadata_v2.h @@ -66,6 +66,8 @@ struct metadata_options; namespace internal { +class metadata_v2_data; + class metadata_v2 { public: metadata_v2() = default; @@ -80,24 +82,6 @@ class metadata_v2 { void check_consistency() const { impl_->check_consistency(); } - void - dump(std::ostream& os, fsinfo_options const& opts, - filesystem_info const* fsinfo, - std::function const& icb) const { - impl_->dump(os, opts, fsinfo, icb); - } - - nlohmann::json info_as_json(fsinfo_options const& opts, - filesystem_info const* fsinfo) const { - return impl_->info_as_json(opts, fsinfo); - } - - nlohmann::json as_json() const { return impl_->as_json(); } - - std::string serialize_as_json(bool simple) const { - return impl_->serialize_as_json(simple); - } - size_t size() const { return impl_->size(); } void walk(std::function const& func) const { @@ -189,24 +173,16 @@ class metadata_v2 { return impl_->get_block_numbers_by_category(category); } + metadata_v2_data const& internal_data() const { + return impl_->internal_data(); + } + class impl { public: virtual ~impl() = default; virtual void check_consistency() const = 0; - virtual void dump( - std::ostream& os, fsinfo_options const& opts, - filesystem_info const* fsinfo, - std::function const& icb) const = 0; - - virtual nlohmann::json - info_as_json(fsinfo_options const& opts, - filesystem_info const* fsinfo) const = 0; - - virtual nlohmann::json as_json() const = 0; - virtual std::string serialize_as_json(bool simple) const = 0; - virtual size_t size() const = 0; virtual void @@ -263,12 +239,33 @@ class metadata_v2 { virtual std::vector get_block_numbers_by_category(std::string_view category) const = 0; + + virtual metadata_v2_data const& internal_data() const = 0; }; private: std::unique_ptr impl_; }; +class metadata_v2_utils { + public: + metadata_v2_utils(metadata_v2 const& meta); + + void dump(std::ostream& os, fsinfo_options const& opts, + filesystem_info const* fsinfo, + std::function const& icb) const; + + nlohmann::json + info_as_json(fsinfo_options const& opts, filesystem_info const* fsinfo) const; + + nlohmann::json as_json() const; + + std::string serialize_as_json(bool simple) const; + + private: + metadata_v2_data const& data_; +}; + } // namespace internal } // namespace reader } // namespace dwarfs diff --git a/src/reader/filesystem_v2.cpp b/src/reader/filesystem_v2.cpp index 560237be..4a79ca30 100644 --- a/src/reader/filesystem_v2.cpp +++ b/src/reader/filesystem_v2.cpp @@ -648,7 +648,7 @@ void filesystem_::dump(std::ostream& os, history_.dump(os); } - meta_.dump( + metadata_v2_utils(meta_).dump( os, opts, get_info(opts), [&](std::string const& indent, uint32_t inode) { std::error_code ec; auto chunks = meta_.get_chunks(inode, ec); @@ -726,20 +726,20 @@ filesystem_::info_as_json(fsinfo_options const& opts) const { } } - info.update(meta_.info_as_json(opts, get_info(opts))); + info.update(metadata_v2_utils(meta_).info_as_json(opts, get_info(opts))); return info; } template nlohmann::json filesystem_::metadata_as_json() const { - return meta_.as_json(); + return metadata_v2_utils(meta_).as_json(); } template std::string filesystem_::serialize_metadata_as_json(bool simple) const { - return meta_.serialize_as_json(simple); + return metadata_v2_utils(meta_).serialize_as_json(simple); } template diff --git a/src/reader/internal/metadata_v2.cpp b/src/reader/internal/metadata_v2.cpp index 093fa8fe..3fb9ce75 100644 --- a/src/reader/internal/metadata_v2.cpp +++ b/src/reader/internal/metadata_v2.cpp @@ -2214,24 +2214,6 @@ class metadata_ final : public metadata_v2::impl { data_.check_consistency(LOG_PROXY_ARG); } - void dump(std::ostream& os, fsinfo_options const& opts, - filesystem_info const* fsinfo, - std::function const& icb) - const override { - data_.dump(os, opts, fsinfo, icb); - } - - nlohmann::json info_as_json(fsinfo_options const& opts, - filesystem_info const* fsinfo) const override { - return data_.info_as_json(opts, fsinfo); - } - - nlohmann::json as_json() const override { return data_.as_json(); } - - std::string serialize_as_json(bool simple) const override { - return data_.serialize_as_json(simple); - } - size_t size() const override { return data_.size(); } void walk(std::function const& func) const override { @@ -2357,11 +2339,34 @@ class metadata_ final : public metadata_v2::impl { return data_.get_block_numbers_by_category(category); } + metadata_v2_data const& internal_data() const override { return data_; } + private: LOG_PROXY_DECL(LoggerPolicy); metadata_v2_data const data_; }; +metadata_v2_utils::metadata_v2_utils(metadata_v2 const& meta) + : data_{meta.internal_data()} {} + +void metadata_v2_utils::dump( + std::ostream& os, fsinfo_options const& opts, filesystem_info const* fsinfo, + std::function const& icb) const { + data_.dump(os, opts, fsinfo, icb); +} + +nlohmann::json +metadata_v2_utils::info_as_json(fsinfo_options const& opts, + filesystem_info const* fsinfo) const { + return data_.info_as_json(opts, fsinfo); +} + +nlohmann::json metadata_v2_utils::as_json() const { return data_.as_json(); } + +std::string metadata_v2_utils::serialize_as_json(bool simple) const { + return data_.serialize_as_json(simple); +} + metadata_v2::metadata_v2( logger& lgr, std::span schema, std::span data, metadata_options const& options, int inode_offset,