26#ifndef MYSQLROUTER_CONFIG_SECTION_PRINTER_INCLUDED
27#define MYSQLROUTER_CONFIG_SECTION_PRINTER_INCLUDED
29#include "harness_export.h"
46 std::ostream &ostream,
47 const std::map<std::string, std::string> &config_cmdln_options,
48 const std::string §ion_name)
50 config_cmdln_options_(config_cmdln_options),
51 section_name_(section_name) {
52 auto section_name_lc = section_name;
54 section_name_lc.begin(), ::
tolower);
56 used_sections_.insert(section_name_lc);
60 bool force_empty =
false) {
61 std::string key_s(
key);
62 std::string cmdln_option_key = section_name_ +
"." + key_s;
64 cmdln_option_key.begin(), ::
tolower);
67 if (config_cmdln_options_.contains(cmdln_option_key)) {
68 section_options_.emplace_back(
key,
69 config_cmdln_options_.at(cmdln_option_key));
71 used_cmdln_options_.insert(key_s);
72 }
else if (!
value.empty() || force_empty) {
73 section_options_.emplace_back(
key,
value);
83 for (
const auto &cmdln_option : config_cmdln_options_) {
84 const auto &cmdln_option_key = cmdln_option.first;
85 const auto dot = cmdln_option_key.find(
'.');
86 if (dot == std::string::npos)
continue;
87 const std::string section = cmdln_option_key.substr(0, dot);
89 std::string section_name_lowerc = section_name_;
90 std::transform(section_name_lowerc.begin(), section_name_lowerc.end(),
91 section_name_lowerc.begin(), ::
tolower);
93 if (section != section_name_lowerc)
continue;
95 const std::string option =
96 cmdln_option_key.substr(dot + 1, cmdln_option_key.length() - dot - 1);
98 if (!used_cmdln_options_.contains(option))
99 section_options_.emplace_back(option, cmdln_option.second);
106 std::ostream &ostream,
107 const std::map<std::string, std::string> &config_cmdln_options) {
108 std::string current_section;
109 std::vector<ConfigBuilder::kv_type> section_options;
111 for (
const auto &cmdln_option : config_cmdln_options) {
112 const auto &cmdln_option_key = cmdln_option.first;
113 const auto dot = cmdln_option_key.find(
'.');
115 assert(dot != std::string::npos);
116 const std::string section_name = cmdln_option_key.substr(0, dot);
121 if (section_name ==
"mysql_rest_service") {
125 if (used_sections_.contains(section_name)) {
129 if (section_name != current_section) {
130 if (!current_section.empty()) {
134 current_section = section_name;
135 section_options.clear();
138 const std::string option =
139 cmdln_option_key.substr(dot + 1, cmdln_option_key.length() - dot - 1);
141 section_options.emplace_back(option, cmdln_option.second);
144 if (!current_section.empty()) {
static std::string build_section(const std::string §ion, const std::initializer_list< kv_type > &pairs)
build a config file section from key-value pairs.
Definition: config_builder.h:50
Definition: config_section_printer.h:43
const std::map< std::string, std::string > & config_cmdln_options_
Definition: config_section_printer.h:151
static std::set< std::string > used_sections_
Definition: config_section_printer.h:157
static void add_remaining_sections(std::ostream &ostream, const std::map< std::string, std::string > &config_cmdln_options)
Definition: config_section_printer.h:105
ConfigSectionPrinter & add_line(std::string_view key, const std::string &value, bool force_empty=false)
Definition: config_section_printer.h:59
std::set< std::string > used_cmdln_options_
Definition: config_section_printer.h:156
std::vector< ConfigBuilder::kv_type > section_options_
Definition: config_section_printer.h:154
const std::string section_name_
Definition: config_section_printer.h:152
ConfigSectionPrinter(std::ostream &ostream, const std::map< std::string, std::string > &config_cmdln_options, const std::string §ion_name)
Definition: config_section_printer.h:45
std::ostream & ostream_
Definition: config_section_printer.h:150
~ConfigSectionPrinter()
Definition: config_section_printer.h:79
ValueType value(const std::optional< ValueType > &v)
Definition: gtid.h:83
char tolower(const char &ch)
Definition: parsing_helpers.h:41
std::basic_string< Char > transform(std::basic_string_view< Char > s, F fun)
Definition: utils_string.h:53
required string key
Definition: replication_asynchronous_connection_failover.proto:60