diff --git a/include/dwarfs/categorizer.h b/include/dwarfs/categorizer.h index d7d3a0cc..7aa0d065 100644 --- a/include/dwarfs/categorizer.h +++ b/include/dwarfs/categorizer.h @@ -30,6 +30,8 @@ #include #include +#include + #include "dwarfs/inode_fragments.h" namespace boost::program_options { @@ -50,6 +52,7 @@ class categorizer { virtual std::span categories() const = 0; virtual bool is_single_fragment() const = 0; + virtual folly::dynamic category_metadata(fragment_category c) const = 0; }; class random_access_categorizer : public categorizer { @@ -132,6 +135,10 @@ class categorizer_manager { return impl_->category_name(c); } + folly::dynamic category_metadata(fragment_category c) const { + return impl_->category_metadata(c); + } + class impl { public: virtual ~impl() = default; @@ -140,6 +147,7 @@ class categorizer_manager { virtual categorizer_job job(std::filesystem::path const& path) const = 0; virtual std::string_view category_name(fragment_category::value_type c) const = 0; + virtual folly::dynamic category_metadata(fragment_category c) const = 0; }; private: diff --git a/src/dwarfs/categorizer.cpp b/src/dwarfs/categorizer.cpp index 00dcc50c..d50a9c9e 100644 --- a/src/dwarfs/categorizer.cpp +++ b/src/dwarfs/categorizer.cpp @@ -185,6 +185,8 @@ class categorizer_manager_ final : public categorizer_manager_private { std::string_view category_name(fragment_category::value_type c) const override; + folly::dynamic category_metadata(fragment_category c) const override; + std::vector> const& categorizers() const override { return categorizers_; @@ -201,9 +203,9 @@ class categorizer_manager_ final : public categorizer_manager_private { } private: - void add_category(std::string_view cat) { + void add_category(std::string_view cat, size_t categorizer_index) { if (catmap_.emplace(cat, categories_.size()).second) { - categories_.emplace_back(cat); + categories_.emplace_back(cat, categorizer_index); } else { LOG_WARN << "duplicate category: " << cat; } @@ -212,7 +214,7 @@ class categorizer_manager_ final : public categorizer_manager_private { logger& lgr_; LOG_PROXY_DECL(LoggerPolicy); std::vector> categorizers_; - std::vector categories_; + std::vector> categories_; std::unordered_map catmap_; bool has_multi_fragment_sequential_categorizers_{false}; }; @@ -221,7 +223,7 @@ template void categorizer_manager_::add( std::shared_ptr c) { for (auto const& c : c->categories()) { - add_category(c); + add_category(c, categorizers_.size()); } if (!c->is_single_fragment() && @@ -243,7 +245,15 @@ categorizer_job categorizer_manager_::job( template std::string_view categorizer_manager_::category_name( fragment_category::value_type c) const { - return DWARFS_NOTHROW(categories_.at(c)); + return DWARFS_NOTHROW(categories_.at(c)).first; +} + +template +folly::dynamic categorizer_manager_::category_metadata( + fragment_category c) const { + auto categorizer = + DWARFS_NOTHROW(categorizers_.at(categories_.at(c.value()).second)); + return categorizer->category_metadata(c); } categorizer_manager::categorizer_manager(logger& lgr) diff --git a/src/dwarfs/categorizer/binary_categorizer.cpp b/src/dwarfs/categorizer/binary_categorizer.cpp index 73e33b65..e14c03a9 100644 --- a/src/dwarfs/categorizer/binary_categorizer.cpp +++ b/src/dwarfs/categorizer/binary_categorizer.cpp @@ -64,6 +64,10 @@ class binary_categorizer_ final : public binary_categorizer_base { bool is_single_fragment() const override { return false; } + folly::dynamic category_metadata(fragment_category) const override { + return folly::dynamic(); + } + private: LOG_PROXY_DECL(LoggerPolicy); }; diff --git a/src/dwarfs/categorizer/incompressible_categorizer.cpp b/src/dwarfs/categorizer/incompressible_categorizer.cpp index 4cc61f7a..7af8fc0b 100644 --- a/src/dwarfs/categorizer/incompressible_categorizer.cpp +++ b/src/dwarfs/categorizer/incompressible_categorizer.cpp @@ -156,8 +156,13 @@ class incompressible_categorizer_ final : public sequential_categorizer { std::unique_ptr job(std::filesystem::path const& path, size_t total_size, category_mapper const& mapper) const override; + bool is_single_fragment() const override { return true; } + folly::dynamic category_metadata(fragment_category) const override { + return folly::dynamic(); + } + private: logger& lgr_; incompressible_categorizer_config const config_; diff --git a/src/dwarfs/categorizer/libmagic_categorizer.cpp b/src/dwarfs/categorizer/libmagic_categorizer.cpp index f22ccd1c..05dba28d 100644 --- a/src/dwarfs/categorizer/libmagic_categorizer.cpp +++ b/src/dwarfs/categorizer/libmagic_categorizer.cpp @@ -149,6 +149,10 @@ class libmagic_categorizer_ final : public libmagic_categorizer_base { bool is_single_fragment() const override { return true; } + folly::dynamic category_metadata(fragment_category) const override { + return folly::dynamic(); + } + private: LOG_PROXY_DECL(LoggerPolicy); magic_wrapper m_;