26#ifndef ROUTER_SRC_ROUTING_GUIDELINES_SRC_RPN_H_
27#define ROUTER_SRC_ROUTING_GUIDELINES_SRC_RPN_H_
36#include <unordered_map>
46class Routing_guidelines_parser_test;
47class Routing_guidelines_document_parser;
51struct Function_definition;
105 template <
typename T>
106 requires std::is_arithmetic_v<T>
110 template <
typename T>
111 requires std::is_constructible_v<std::string, T>
130 bool is_role()
const {
return type_ == Type::ROLE; }
132 double get_num()
const {
return std::get<double>(value_); }
134 bool is_bool()
const {
return type_ == Type::BOOL; }
136 bool get_bool(
const char *exception_msg =
nullptr)
const;
141 if (std::holds_alternative<std::string>(value_)) {
142 return std::get<std::string>(value_);
144 throw std::runtime_error(
"Type error, expected string");
149 double &
number() {
return std::get<double>(value_); }
151 const double &
number()
const {
return std::get<double>(value_); }
153 const std::string &
string()
const {
return std::get<std::string>(value_); }
155 std::string &
string() {
return std::get<std::string>(value_); }
158 return std::holds_alternative<Location>(value_) ||
159 std::holds_alternative<Function>(value_);
163 return std::holds_alternative<Function>(value_)
164 ? std::get<Function>(value_).location
165 : std::get<Location>(value_);
169 return *std::get<Function>(value_).definition;
174 template <
class Visitor>
175 constexpr auto visit(Visitor &&vis)
const {
176 return std::visit(vis, value_);
182 std::variant<double, std::string, Location, Function>
value_;
190 return !(lhs == rhs);
202 std::vector<rpn::Token::Type>
args;
204 void (*reducer)(std::vector<Token> *);
206 void reduce(std::vector<rpn::Token> *
stack)
const;
216 Token get(
const std::string &name)
const;
217 Token get(
int offset)
const {
return context_vars_[offset](); }
219 std::optional<std::string> get_var_name(
const Token &tok)
const;
223 context_vars_.emplace_back(
224 [t =
Token(std::forward<T>(
value))]() {
return t; });
225 context_[
name] = context_vars_.size() - 1;
229 server_ = &server_info;
235 session_ = &session_info;
247 router_ = &router_info;
252 bool parse_tags_toggled();
264 &parse_mode_, [](
bool *b) { *b =
false; });
267 Token handle_miss(std::string_view name)
const;
276 bool parse_mode_{
false};
277 bool extended_session_info_{
false};
278 bool parsing_tags_{
false};
289 : rpn_(rpn), code_(
std::move(code)) {}
291 : rpn_(
std::move(rpn)), code_(
std::move(code)) {}
295 const bool dry_run =
false)
const;
299 std::string
variable()
const {
return rpn_.back().string(); }
301 bool empty() {
return rpn_.empty(); }
315std::string
error_msg(
const char *msg,
const std::string &exp,
int beg,
std::unordered_map< std::string, net::ip::address > ResolveCache
Map with preprocessed resolved hostnames.
Definition: routing_guidelines.h:188
Conducting the whole scanning and parsing of routing guidelines rules.
Definition: rules_parser.h:74
mysqlrouter::RoutingGuidelinesVersion get_version() const
Definition: rpn.h:254
void clear_sql_info()
Definition: rpn.h:244
std::unique_ptr< bool, std::function< void(bool *)> > start_parse_mode()
Definition: rpn.h:261
Context & operator=(const Context &)=delete
void clear_server_info()
Definition: rpn.h:232
void set_server_info(const routing_guidelines::Server_info &server_info)
Definition: rpn.h:228
void set_sql_info(const routing_guidelines::Sql_info &sql_info)
Definition: rpn.h:240
Context(const Context &)=delete
void set(const std::string &name, T &&value)
Definition: rpn.h:222
void set_router_info(const routing_guidelines::Router_info &router_info)
Definition: rpn.h:246
Token get(int offset) const
Definition: rpn.h:217
std::vector< std::function< Token()> > context_vars_
Definition: rpn.h:275
void clear_router_info()
Definition: rpn.h:250
std::map< std::string, int, std::less<> > context_
Definition: rpn.h:274
void set_version(mysqlrouter::RoutingGuidelinesVersion version)
Definition: rpn.h:256
void set_session_info(const routing_guidelines::Session_info &session_info)
Definition: rpn.h:234
void clear_session_info()
Definition: rpn.h:238
Expression(const std::vector< Token > &rpn, std::string code)
Definition: rpn.h:288
friend Routing_guidelines_document_parser
Definition: rpn.h:312
std::string code_
Definition: rpn.h:309
Expression(std::vector< Token > &&rpn, std::string code)
Definition: rpn.h:290
bool empty()
Definition: rpn.h:301
friend Routing_guidelines_parser_test
Definition: rpn.h:311
std::string variable() const
Definition: rpn.h:299
std::vector< Token > rpn_
Definition: rpn.h:308
Token(Token &&i) noexcept=default
bool has_location() const
Definition: rpn.h:157
Token(const Token &i)=default
bool is_string() const
Definition: rpn.h:138
const Function_definition & function() const
Definition: rpn.h:168
std::variant< double, std::string, Location, Function > value_
Definition: rpn.h:182
bool is_num() const
Definition: rpn.h:128
std::string & string()
Definition: rpn.h:155
bool is_role() const
Definition: rpn.h:130
double & number()
Definition: rpn.h:149
Type type_
Definition: rpn.h:180
Token(T &&s, Type type=Type::STR)
Definition: rpn.h:112
bool is_null() const
Definition: rpn.h:147
const double & number() const
Definition: rpn.h:151
Token(const Function_definition &function, int start, int end)
Definition: rpn.h:117
Token()
Definition: rpn.h:100
Token(Type type, int start, int end)
Definition: rpn.h:102
bool is_bool() const
Definition: rpn.h:134
Token & operator=(const Token &i)=default
Token(T v, Type type=Type::NUM)
Definition: rpn.h:107
Type type() const
Definition: rpn.h:172
Token & operator=(Token &&i) noexcept=default
const Location & location() const
Definition: rpn.h:162
double get_num() const
Definition: rpn.h:132
Token(bool val)
Definition: rpn.h:115
const std::string & get_string() const
Definition: rpn.h:140
constexpr auto visit(Visitor &&vis) const
Definition: rpn.h:175
const std::string & string() const
Definition: rpn.h:153
static Gcs_tagged_lock::Tag get_tag(std::uint64_t const &lock_word)
Definition: gcs_tagged_lock.cc:36
mrs::interface::RestHandler::HttpResult::Type Type
Definition: handler_content_file.cc:42
static void start(mysql_harness::PluginFuncEnv *env)
Definition: http_auth_backend_plugin.cc:180
#define T
Definition: jit_executor_value.cc:373
static std::string to_string(const LEX_STRING &str)
Definition: lex_string.h:50
bool operator==(const my_thread_handle &a, const my_thread_handle &b)
Definition: my_thread.h:151
static void print_value(FILE *file, MYSQL_RES *result, MYSQL_ROW row, const char *prefix, const char *name, int string_value)
Definition: mysqldump.cc:5765
ValueType value(const std::optional< ValueType > &v)
Definition: gtid.h:83
@ NONE
Definition: base.h:45
static mysql_service_status_t get(THD **thd) noexcept
Definition: mysql_current_thread_reader_all_empty.cc:31
constexpr RoutingGuidelinesVersion kBaseRoutingGuidelines
Definition: routing_guidelines_version.h:39
bool verify(const std::string &digest, const std::string &message, const std::string &public_key_content)
Verify a message signed by the private key pair of the provided public key.
Definition: my_base64_encode.cc:113
static mysql_service_status_t clear(reference_caching_channel channel) noexcept
Definition: component.cc:146
std::vector< std::string_view > get_variables_names()
Definition: rpn.cc:851
bool operator<(const Token &lhs, const Token &rhs)
Definition: rpn.cc:126
bool operator>(const Token &lhs, const Token &rhs)
Definition: rpn.h:192
bool operator<=(const Token &lhs, const Token &rhs)
Definition: rpn.cc:140
bool operator==(const Token &lhs, const Token &rhs)
Definition: rpn.cc:107
std::string error_msg(const char *msg, const std::string &exp, int beg, int end)
Definition: rpn.cc:838
bool operator>=(const Token &lhs, const Token &rhs)
Definition: rpn.h:193
bool operator!=(const Token &lhs, const Token &rhs)
Definition: rpn.h:189
Definition: routing_guidelines_datatypes.h:31
Definition: gcs_xcom_synode.h:64
std::vector< T, ut::allocator< T > > vector
Specialization of vector which uses allocator.
Definition: ut0new.h:2876
std::conditional_t< !std::is_array< T >::value, std::unique_ptr< T, detail::Deleter< T > >, std::conditional_t< detail::is_unbounded_array_v< T >, std::unique_ptr< T, detail::Array_deleter< std::remove_extent_t< T > > >, void > > unique_ptr
The following is a common type that is returned by all the ut::make_unique (non-aligned) specializati...
Definition: ut0new.h:2440
required uint64 version
Definition: replication_group_member_actions.proto:41
@ NUM
Definition: sql_yacc.h:425
case opt name
Definition: sslopt-case.h:29
Definition: routing_guidelines_version.h:37
Information about this Router instance.
Definition: routing_guidelines.h:59
Information about one server destination.
Definition: routing_guidelines.h:80
Information about incoming session.
Definition: routing_guidelines.h:103
Information about query details.
Definition: routing_guidelines.h:117
rpn::Token::Type ret_val
Definition: rpn.h:203
std::vector< rpn::Token::Type > args
Definition: rpn.h:202
const char * name
Definition: rpn.h:201
Location location
Definition: rpn.h:97
const Function_definition * definition
Definition: rpn.h:96
int end
Definition: rpn.h:92
int start
Definition: rpn.h:91
task_env * stack
Definition: task.cc:896
const char * get_type(TYPELIB *typelib, unsigned int nr)