24#ifndef ROUTER_SRC_ROUTING_GUIDELINES_SRC_RPN_H_
25#define ROUTER_SRC_ROUTING_GUIDELINES_SRC_RPN_H_
34#include <unordered_map>
42class Routing_guidelines_parser_test;
43class Routing_guidelines_document_parser;
47struct Function_definition;
101 template <
typename T>
102 requires std::is_arithmetic_v<T>
106 template <
typename T>
107 requires std::is_constructible_v<std::string, T>
126 bool is_role()
const {
return type_ == Type::ROLE; }
128 double get_num()
const {
return std::get<double>(value_); }
130 bool is_bool()
const {
return type_ == Type::BOOL; }
132 bool get_bool(
const char *exception_msg =
nullptr)
const;
137 if (std::holds_alternative<std::string>(value_)) {
138 return std::get<std::string>(value_);
140 throw std::runtime_error(
"Type error, expected string");
145 double &
number() {
return std::get<double>(value_); }
147 const double &
number()
const {
return std::get<double>(value_); }
149 const std::string &
string()
const {
return std::get<std::string>(value_); }
151 std::string &
string() {
return std::get<std::string>(value_); }
154 return std::holds_alternative<Location>(value_) ||
155 std::holds_alternative<Function>(value_);
159 return std::holds_alternative<Function>(value_)
160 ? std::get<Function>(value_).location
161 : std::get<Location>(value_);
165 return *std::get<Function>(value_).definition;
170 template <
class Visitor>
171 constexpr auto visit(Visitor &&vis)
const {
172 return std::visit(vis, value_);
178 std::variant<double, std::string, Location, Function>
value_;
186 return !(lhs == rhs);
198 std::vector<rpn::Token::Type>
args;
200 void (*reducer)(std::vector<Token> *);
202 void reduce(std::vector<rpn::Token> *
stack)
const;
212 Token get(
const std::string &name)
const;
213 Token get(
int offset)
const {
return context_vars_[offset](); }
215 std::optional<std::string> get_var_name(
const Token &tok)
const;
218 void set(
const std::string &name, T &&value) {
219 context_vars_.emplace_back(
220 [t =
Token(std::forward<T>(value))]() {
return t; });
221 context_[
name] = context_vars_.size() - 1;
225 server_ = &server_info;
231 session_ = &session_info;
243 router_ = &router_info;
252 &parse_mode_, [](
bool *b) { *b =
false; });
255 Token handle_miss(std::string_view name)
const;
264 bool parse_mode_{
false};
265 bool extended_session_info_{
false};
273 Expression(
const std::vector<Token> &rpn,
const std::string &code)
274 : rpn_(rpn), code_(code) {}
275 Expression(std::vector<Token> &&rpn,
const std::string &code)
276 : rpn_(
std::move(rpn)), code_(code) {}
280 const bool dry_run =
false)
const;
284 std::string
variable()
const {
return rpn_.back().string(); }
286 bool empty() {
return rpn_.empty(); }
300std::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:186
Conducting the whole scanning and parsing of routing guidelines rules.
Definition: rules_parser.h:72
void clear_sql_info()
Definition: rpn.h:240
std::unique_ptr< bool, std::function< void(bool *)> > start_parse_mode()
Definition: rpn.h:249
Context & operator=(const Context &)=delete
void clear_server_info()
Definition: rpn.h:228
void set_server_info(const routing_guidelines::Server_info &server_info)
Definition: rpn.h:224
void set_sql_info(const routing_guidelines::Sql_info &sql_info)
Definition: rpn.h:236
Context(const Context &)=delete
void set(const std::string &name, T &&value)
Definition: rpn.h:218
void set_router_info(const routing_guidelines::Router_info &router_info)
Definition: rpn.h:242
Token get(int offset) const
Definition: rpn.h:213
std::vector< std::function< Token()> > context_vars_
Definition: rpn.h:263
void clear_router_info()
Definition: rpn.h:246
std::map< std::string, int, std::less<> > context_
Definition: rpn.h:262
void set_session_info(const routing_guidelines::Session_info &session_info)
Definition: rpn.h:230
void clear_session_info()
Definition: rpn.h:234
friend Routing_guidelines_document_parser
Definition: rpn.h:297
Expression(std::vector< Token > &&rpn, const std::string &code)
Definition: rpn.h:275
std::string code_
Definition: rpn.h:294
bool empty()
Definition: rpn.h:286
friend Routing_guidelines_parser_test
Definition: rpn.h:296
Expression(const std::vector< Token > &rpn, const std::string &code)
Definition: rpn.h:273
std::string variable() const
Definition: rpn.h:284
std::vector< Token > rpn_
Definition: rpn.h:293
Token(Token &&i) noexcept=default
bool has_location() const
Definition: rpn.h:153
Token(const Token &i)=default
bool is_string() const
Definition: rpn.h:134
const Function_definition & function() const
Definition: rpn.h:164
std::variant< double, std::string, Location, Function > value_
Definition: rpn.h:178
bool is_num() const
Definition: rpn.h:124
std::string & string()
Definition: rpn.h:151
bool is_role() const
Definition: rpn.h:126
double & number()
Definition: rpn.h:145
Type type_
Definition: rpn.h:176
Token(T &&s, Type type=Type::STR)
Definition: rpn.h:108
bool is_null() const
Definition: rpn.h:143
const double & number() const
Definition: rpn.h:147
Token(const Function_definition &function, int start, int end)
Definition: rpn.h:113
Token()
Definition: rpn.h:96
Token(Type type, int start, int end)
Definition: rpn.h:98
bool is_bool() const
Definition: rpn.h:130
Token & operator=(const Token &i)=default
Token(T v, Type type=Type::NUM)
Definition: rpn.h:103
Type type() const
Definition: rpn.h:168
Token & operator=(Token &&i) noexcept=default
const Location & location() const
Definition: rpn.h:158
double get_num() const
Definition: rpn.h:128
Token(bool val)
Definition: rpn.h:111
const std::string & get_string() const
Definition: rpn.h:136
constexpr auto visit(Visitor &&vis) const
Definition: rpn.h:171
const std::string & string() const
Definition: rpn.h:149
static Gcs_tagged_lock::Tag get_tag(std::uint64_t const &lock_word)
Definition: gcs_tagged_lock.cc:38
static void start(mysql_harness::PluginFuncEnv *env)
Definition: http_auth_backend_plugin.cc:180
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:5674
@ NONE
Definition: base.h:45
static mysql_service_status_t get(THD **thd) noexcept
Definition: mysql_current_thread_reader_all_empty.cc:31
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:115
static mysql_service_status_t clear(reference_caching_channel channel) noexcept
Definition: component.cc:146
Type
Definition: resource_group_basic_types.h:33
std::vector< std::string_view > get_variables_names()
Definition: rpn.cc:841
bool operator<(const Token &lhs, const Token &rhs)
Definition: rpn.cc:124
bool operator>(const Token &lhs, const Token &rhs)
Definition: rpn.h:188
bool operator<=(const Token &lhs, const Token &rhs)
Definition: rpn.cc:138
bool operator==(const Token &lhs, const Token &rhs)
Definition: rpn.cc:105
std::string error_msg(const char *msg, const std::string &exp, int beg, int end)
Definition: rpn.cc:828
bool operator>=(const Token &lhs, const Token &rhs)
Definition: rpn.h:189
bool operator!=(const Token &lhs, const Token &rhs)
Definition: rpn.h:185
Definition: routing_guidelines_datatypes.h:30
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
@ NUM
Definition: sql_yacc.h:425
case opt name
Definition: sslopt-case.h:29
Information about this Router instance.
Definition: routing_guidelines.h:57
Information about one server destination.
Definition: routing_guidelines.h:78
Information about incoming session.
Definition: routing_guidelines.h:101
Information about query details.
Definition: routing_guidelines.h:115
rpn::Token::Type ret_val
Definition: rpn.h:199
std::vector< rpn::Token::Type > args
Definition: rpn.h:198
const char * name
Definition: rpn.h:197
Location location
Definition: rpn.h:93
const Function_definition * definition
Definition: rpn.h:92
int end
Definition: rpn.h:88
int start
Definition: rpn.h:87
task_env * stack
Definition: task.cc:896
const char * get_type(TYPELIB *typelib, unsigned int nr)