From 82aeadc79d1fb4c61bd49af855cef0dbb050ee09 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Tue, 26 Aug 2025 23:20:42 +0200 Subject: [PATCH] feat: expose block category metadata in `filesystem_v2` --- include/dwarfs/reader/filesystem_v2.h | 7 +++++++ include/dwarfs/reader/internal/metadata_v2.h | 8 ++++++++ src/reader/filesystem_v2.cpp | 16 ++++++++++++++-- src/reader/internal/metadata_v2.cpp | 18 ++++++++++++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/include/dwarfs/reader/filesystem_v2.h b/include/dwarfs/reader/filesystem_v2.h index 42b09ef2..541ca2c4 100644 --- a/include/dwarfs/reader/filesystem_v2.h +++ b/include/dwarfs/reader/filesystem_v2.h @@ -324,6 +324,11 @@ class filesystem_v2_lite { return lite_->get_block_category(block_number); } + std::optional + get_block_category_metadata(size_t block_number) const { + return lite_->get_block_category_metadata(block_number); + } + void cache_blocks_by_category(std::string_view category) const { lite_->cache_blocks_by_category(category); } @@ -420,6 +425,8 @@ class filesystem_v2_lite { virtual std::vector get_all_gids() const = 0; virtual std::optional get_block_category(size_t block_number) const = 0; + virtual std::optional + get_block_category_metadata(size_t block_number) const = 0; virtual void cache_blocks_by_category(std::string_view category) const = 0; virtual void cache_all_blocks() const = 0; virtual std::shared_ptr get_parser() const = 0; diff --git a/include/dwarfs/reader/internal/metadata_v2.h b/include/dwarfs/reader/internal/metadata_v2.h index 5d656983..8c0305f6 100644 --- a/include/dwarfs/reader/internal/metadata_v2.h +++ b/include/dwarfs/reader/internal/metadata_v2.h @@ -157,6 +157,11 @@ class metadata_v2 { return impl_->get_block_category(block_number); } + std::optional + get_block_category_metadata(size_t block_number) const { + return impl_->get_block_category_metadata(block_number); + } + std::vector get_all_block_categories() const { return impl_->get_all_block_categories(); } @@ -232,6 +237,9 @@ class metadata_v2 { virtual std::optional get_block_category(size_t block_number) const = 0; + virtual std::optional + get_block_category_metadata(size_t block_number) const = 0; + virtual std::vector get_all_block_categories() const = 0; virtual std::vector get_all_uids() const = 0; diff --git a/src/reader/filesystem_v2.cpp b/src/reader/filesystem_v2.cpp index 6eaaa89e..2a8b3ff3 100644 --- a/src/reader/filesystem_v2.cpp +++ b/src/reader/filesystem_v2.cpp @@ -307,6 +307,10 @@ class filesystem_ final { std::optional get_block_category(size_t block_no) const { return meta_.get_block_category(block_no); } + std::optional + get_block_category_metadata(size_t block_no) const { + return meta_.get_block_category_metadata(block_no); + } void cache_blocks_by_category(std::string_view category) const { auto const max_blocks = get_max_cache_blocks(); @@ -689,7 +693,9 @@ void filesystem_::dump(std::ostream& os, std::string metadata; - if (bd) { + if (auto m = meta_.get_block_category_metadata(block_no)) { + metadata = fmt::format(", metadata={}", m->dump()); + } else if (bd) { if (auto m = bd->metadata()) { metadata = fmt::format(", metadata={}", *m); } @@ -769,7 +775,9 @@ filesystem_::info_as_json(fsinfo_options const& opts, section_info["size"] = uncompressed_size; section_info["ratio"] = float(s.length()) / uncompressed_size; - if (auto m = bd->metadata()) { + if (auto m = meta_.get_block_category_metadata(block_no)) { + section_info["metadata"] = *m; + } else if (auto m = bd->metadata()) { section_info["metadata"] = nlohmann::json::parse(*m); } } @@ -1328,6 +1336,10 @@ class filesystem_common_ : public Base { get_block_category(size_t block_no) const override { return fs_.get_block_category(block_no); } + std::optional + get_block_category_metadata(size_t block_no) const override { + return fs_.get_block_category_metadata(block_no); + } void cache_blocks_by_category(std::string_view category) const override { fs_.cache_blocks_by_category(category); diff --git a/src/reader/internal/metadata_v2.cpp b/src/reader/internal/metadata_v2.cpp index 85d97d18..f7a8755b 100644 --- a/src/reader/internal/metadata_v2.cpp +++ b/src/reader/internal/metadata_v2.cpp @@ -331,6 +331,19 @@ class metadata_v2_data { return std::nullopt; } + std::optional + get_block_category_metadata(size_t block_number) const { + if (auto meta_json = meta_.category_metadata_json()) { + if (auto block_cat_meta = meta_.block_category_metadata()) { + if (auto it = block_cat_meta->find(block_number); + it != block_cat_meta->end()) { + return nlohmann::json::parse(meta_json.value()[it->second()]); + } + } + } + return std::nullopt; + } + std::vector get_all_block_categories() const { std::vector rv; @@ -2192,6 +2205,11 @@ class metadata_ final : public metadata_v2::impl { return data_.get_block_category(block_number); } + std::optional + get_block_category_metadata(size_t block_number) const override { + return data_.get_block_category_metadata(block_number); + } + std::vector get_all_block_categories() const override { return data_.get_all_block_categories(); }