diff --git a/include/dwarfs/reader/filesystem_v2.h b/include/dwarfs/reader/filesystem_v2.h index eb503b8b..0ee96da9 100644 --- a/include/dwarfs/reader/filesystem_v2.h +++ b/include/dwarfs/reader/filesystem_v2.h @@ -60,6 +60,10 @@ class mmif; class os_access; class performance_monitor; +namespace thrift::metadata { +class metadata; +} + namespace reader { struct cache_tidy_config; @@ -473,6 +477,9 @@ class filesystem_v2 final : public filesystem_v2_lite { history const& get_history() const; + std::unique_ptr thawed_metadata() const; + std::unique_ptr unpacked_metadata() const; + class impl : public impl_lite { public: virtual int @@ -484,6 +491,10 @@ class filesystem_v2 final : public filesystem_v2_lite { virtual std::string serialize_metadata_as_json(bool simple) const = 0; virtual std::optional> header() const = 0; virtual history const& get_history() const = 0; + virtual std::unique_ptr + thawed_metadata() const = 0; + virtual std::unique_ptr + unpacked_metadata() const = 0; }; private: diff --git a/include/dwarfs/reader/internal/metadata_v2.h b/include/dwarfs/reader/internal/metadata_v2.h index ff2dd361..41979086 100644 --- a/include/dwarfs/reader/internal/metadata_v2.h +++ b/include/dwarfs/reader/internal/metadata_v2.h @@ -262,6 +262,10 @@ class metadata_v2_utils { std::string serialize_as_json(bool simple) const; + std::unique_ptr thaw() const; + + std::unique_ptr unpack() const; + private: metadata_v2_data const& data_; }; diff --git a/src/reader/filesystem_v2.cpp b/src/reader/filesystem_v2.cpp index 0cfb66fb..89f813ad 100644 --- a/src/reader/filesystem_v2.cpp +++ b/src/reader/filesystem_v2.cpp @@ -332,6 +332,14 @@ class filesystem_ final { ir_.cache_blocks(block_numbers); } + std::unique_ptr thawed_metadata() const { + return metadata_v2_utils(meta_).thaw(); + } + + std::unique_ptr unpacked_metadata() const { + return metadata_v2_utils(meta_).unpack(); + } + private: filesystem_parser make_fs_parser() const { return filesystem_parser(mm_, image_offset_, options_.image_size); @@ -1354,6 +1362,13 @@ class filesystem_full_ return fs().header(); } history const& get_history() const override { return history_; } + std::unique_ptr thawed_metadata() const override { + return fs().thawed_metadata(); + } + std::unique_ptr + unpacked_metadata() const override { + return fs().unpacked_metadata(); + } private: history history_; @@ -1471,6 +1486,16 @@ history const& filesystem_v2::get_history() const { return full_().get_history(); } +std::unique_ptr +filesystem_v2::thawed_metadata() const { + return full_().thawed_metadata(); +} + +std::unique_ptr +filesystem_v2::unpacked_metadata() const { + return full_().unpacked_metadata(); +} + auto filesystem_v2::full_() const -> impl const& { return this->as_(); } } // namespace dwarfs::reader diff --git a/src/reader/internal/metadata_v2.cpp b/src/reader/internal/metadata_v2.cpp index 2f13a5a1..88ec5426 100644 --- a/src/reader/internal/metadata_v2.cpp +++ b/src/reader/internal/metadata_v2.cpp @@ -634,6 +634,14 @@ class metadata_v2_data { filesystem_info const* fsinfo, std::function const& icb) const; + std::unique_ptr unpack() const { + return std::make_unique(unpack_metadata()); + } + + std::unique_ptr thaw() const { + return std::make_unique(meta_.thaw()); + } + private: template using set_type = phmap::flat_hash_set; @@ -2426,6 +2434,14 @@ std::string metadata_v2_utils::serialize_as_json(bool simple) const { return data_.serialize_as_json(simple); } +std::unique_ptr metadata_v2_utils::thaw() const { + return data_.thaw(); +} + +std::unique_ptr metadata_v2_utils::unpack() const { + return data_.unpack(); +} + metadata_v2::metadata_v2( logger& lgr, std::span schema, std::span data, metadata_options const& options, int inode_offset,