26#ifndef ROUTER_SRC_INCLUDE_MYSQLROUTER_JIT_EXECUTOR_VALUE_H_
27#define ROUTER_SRC_INCLUDE_MYSQLROUTER_JIT_EXECUTOR_VALUE_H_
36#include "mysqlrouter/jit_executor_plugin_export.h"
46 using std::runtime_error::runtime_error;
130struct JIT_EXECUTOR_PLUGIN_EXPORT
Value final {
143 inline bool has_key(
const std::string &k)
const {
return find(k) != end(); }
152 const std::string &def =
"")
const;
153 bool get_bool(
const std::string &k,
bool def =
false)
const;
154 int64_t get_int(
const std::string &k, int64_t def = 0)
const;
155 uint64_t get_uint(
const std::string &k, uint64_t def = 0)
const;
156 double get_double(
const std::string &k,
double def = 0.0)
const;
158 const std::string &k,
159 std::shared_ptr<Map_type> def = std::shared_ptr<Map_type>())
const;
161 const std::string &k,
162 std::shared_ptr<Array_type> def = std::shared_ptr<Array_type>())
const;
163 void merge_contents(std::shared_ptr<Map_type>
source,
bool overwrite);
178 size_t erase(
const std::string &k) {
return _map.erase(k); }
195 void set(
const std::string &k,
Value &&v) { _map[k] = std::move(v); }
197 void set(
const std::string &k,
const Value &v) { _map[k] = v; }
199 const container_type::mapped_type &
at(
const std::string &k)
const {
202 container_type::mapped_type &
operator[](
const std::string &k) {
215 bool empty()
const {
return _map.empty(); }
216 size_t size()
const {
return _map.size(); }
217 size_t count(
const std::string &k)
const {
return _map.count(k); }
220 std::pair<iterator, bool>
emplace(
const std::string &
key,
T &&v) {
221 return _map.emplace(
key,
Value(std::forward<T>(v)));
240 explicit
Value(const
char *);
241 explicit
Value(const
char *,
size_t n,
bool binary = false);
243 explicit
Value(
std::wstring_view s);
245 explicit
Value(
int i);
246 explicit
Value(
unsigned int ui);
247 explicit
Value(int64_t i);
248 explicit
Value(uint64_t ui);
249 explicit
Value(
float f);
250 explicit
Value(
double d);
251 explicit
Value(
bool b);
254 explicit
Value(const
std::shared_ptr<polyglot::Polyglot_object> &o);
255 explicit
Value(const
std::shared_ptr<polyglot::Object_bridge> &o);
299 explicit operator bool() const noexcept {
311 std::string descr(
bool pprint =
false)
const;
315 std::string repr()
const;
318 std::string json(
bool pprint =
false)
const;
323 std::string &append_descr(std::string &s_out,
int indent = -1,
324 char quote_strings =
'\0')
const;
325 std::string &append_repr(std::string &s_out)
const;
330 bool as_bool() const;
331 int64_t as_int() const;
332 uint64_t as_uint() const;
333 double as_double() const;
335 std::wstring as_wstring() const;
340 if (std::holds_alternative<binary_string>(m_value))
341 return std::get<binary_string>(m_value);
342 return std::get<std::string>(m_value);
350 return std::dynamic_pointer_cast<C>(
351 std::get<std::shared_ptr<polyglot::Object_bridge>>(m_value));
354 std::shared_ptr<polyglot::Object_bridge> as_object_bridge()
const;
355 std::shared_ptr<polyglot::Polyglot_object> as_object()
const;
357 std::shared_ptr<Map_type>
as_map()
const {
361 return std::get<std::shared_ptr<Map_type>>(m_value);
368 return std::get<std::shared_ptr<Array_type>>(m_value);
421 int64_t, uint64_t, double, std::shared_ptr<polyglot::Polyglot_object>,
422 std::shared_ptr<polyglot::Object_bridge>,
423 std::shared_ptr<Array_type>,
424 std::shared_ptr<Map_type>
437template <
typename... Arg>
440 (void)std::initializer_list<int>{
441 (array->emplace_back(std::forward<Arg>(args)), 0)...};
445template <
template <
typename...>
class C,
typename T>
449 array->emplace_back(item);
454template <
template <
typename...>
class C,
typename T>
458 array->emplace_back(std::move(item));
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:167
Definition: jit_executor_value.h:45
Definition: jit_executor_value.h:134
iterator find(const std::string &k)
Definition: jit_executor_value.h:176
container_type _map
Definition: jit_executor_value.h:225
container_type::iterator iterator
Definition: jit_executor_value.h:138
bool operator<(const Map_type &) const =delete
iterator end()
Definition: jit_executor_value.h:190
iterator begin()
Definition: jit_executor_value.h:184
reverse_iterator rbegin()
Definition: jit_executor_value.h:187
bool has_key(const std::string &k) const
Definition: jit_executor_value.h:143
size_t count(const std::string &k) const
Definition: jit_executor_value.h:217
bool is_null(const std::string &k) const
Definition: jit_executor_value.h:147
bool empty() const
Definition: jit_executor_value.h:215
const container_type::mapped_type & at(const std::string &k) const
Definition: jit_executor_value.h:199
void clear()
Definition: jit_executor_value.h:181
reverse_iterator rend()
Definition: jit_executor_value.h:193
std::map< std::string, Value > container_type
Definition: jit_executor_value.h:136
const_reverse_iterator rbegin() const
Definition: jit_executor_value.h:186
bool operator>=(const Map_type &) const =delete
std::shared_ptr< Value::Array_type > get_array(const std::string &k, std::shared_ptr< Array_type > def=std::shared_ptr< Array_type >()) const
bool operator==(const Map_type &other) const
Definition: jit_executor_value.h:206
container_type::value_type value_type
Definition: jit_executor_value.h:139
size_t erase(const std::string &k)
Definition: jit_executor_value.h:178
const_iterator find(const std::string &k) const
Definition: jit_executor_value.h:175
const_iterator begin() const
Definition: jit_executor_value.h:183
iterator erase(const_iterator it)
Definition: jit_executor_value.h:179
const_reverse_iterator rend() const
Definition: jit_executor_value.h:192
bool operator<=(const Map_type &) const =delete
container_type::const_iterator const_iterator
Definition: jit_executor_value.h:137
container_type::const_reverse_iterator const_reverse_iterator
Definition: jit_executor_value.h:141
void set(const std::string &k, const Value &v)
Definition: jit_executor_value.h:197
iterator erase(iterator it)
Definition: jit_executor_value.h:180
std::shared_ptr< Value::Map_type > get_map(const std::string &k, std::shared_ptr< Map_type > def=std::shared_ptr< Map_type >()) const
bool operator!=(const Map_type &other) const
Definition: jit_executor_value.h:207
container_type::mapped_type & operator[](const std::string &k)
Definition: jit_executor_value.h:202
size_t size() const
Definition: jit_executor_value.h:216
void set(const std::string &k, Value &&v)
Definition: jit_executor_value.h:195
std::pair< iterator, bool > emplace(const std::string &key, T &&v)
Definition: jit_executor_value.h:220
bool operator>(const Map_type &) const =delete
const_iterator end() const
Definition: jit_executor_value.h:189
container_type::reverse_iterator reverse_iterator
Definition: jit_executor_value.h:140
#define T
Definition: jit_executor_value.cc:373
bool operator==(const my_thread_handle &a, const my_thread_handle &b)
Definition: my_thread.h:151
static char * get_string(char **to_ptr, const char **from_ptr, struct st_command *command)
Definition: mysqltest.cc:6276
uint16_t value_type
Definition: vt100.h:184
constexpr value_type binary
Definition: classic_protocol_constants.h:275
Definition: atomics_array.h:39
Container::const_iterator find(const Container &c, Value &&value)
Definition: generic.h:39
static mysql_service_status_t get(THD **thd) noexcept
Definition: mysql_current_thread_reader_all_empty.cc:31
bool parse(MYSQL_THD thd, const string &query, bool is_prepared, Condition_handler *handler)
Definition: services.cc:81
bool is_null(poly_thread thread, poly_value value)
Definition: jit_executor_type_conversion.cc:46
Definition: file_system_exceptions.h:34
Value::Array_type_ref Array_t
Definition: jit_executor_value.h:431
Value_type
Basic types that can be passed around code in different languages.
Definition: jit_executor_value.h:53
@ String
true or false
Definition: jit_executor_value.h:57
@ Bool
Null/None value.
Definition: jit_executor_value.h:56
@ Integer
String values, UTF-8 encoding.
Definition: jit_executor_value.h:58
@ ObjectBridge
Polyglot object of any type.
Definition: jit_executor_value.h:65
@ Array
C++ Object.
Definition: jit_executor_value.h:67
@ Float
unsigned 64bit integer numbers
Definition: jit_executor_value.h:60
@ Binary
Dictionary/Map/Object container.
Definition: jit_executor_value.h:71
@ UInteger
64bit integer numbers
Definition: jit_executor_value.h:59
@ Map
Array/List container.
Definition: jit_executor_value.h:68
@ Undefined
Definition: jit_executor_value.h:54
@ Object
double numbers
Definition: jit_executor_value.h:64
@ Null
Undefined.
Definition: jit_executor_value.h:55
bool is_compatible_type(Value_type source_type, Value_type target_type)
Definition: jit_executor_value.cc:1428
Array_t make_array()
Definition: jit_executor_value.h:435
std::vector< Value > Argument_list
Definition: jit_executor_value.h:429
Dictionary_t JIT_EXECUTOR_PLUGIN_EXPORT make_dict()
Definition: jit_executor_value.cc:1968
Value::Map_type_ref Dictionary_t
Definition: jit_executor_value.h:430
Definition: gcs_xcom_synode.h:64
required string key
Definition: replication_asynchronous_connection_failover.proto:60
repeated Source source
Definition: replication_asynchronous_connection_failover.proto:42
required string type
Definition: replication_group_member_actions.proto:34
Definition: jit_executor_value.h:418
Definition: jit_executor_value.h:417
Pointer to a function that may be implemented in any language.
Definition: jit_executor_value.h:130
std::shared_ptr< Map_type > Map_type_ref
Definition: jit_executor_value.h:227
std::vector< Value > Array_type
Definition: jit_executor_value.h:131
std::variant< std::monostate, null_value, bool, std::string, binary_string, int64_t, uint64_t, double, std::shared_ptr< polyglot::Polyglot_object >, std::shared_ptr< polyglot::Object_bridge >, std::shared_ptr< Array_type >, std::shared_ptr< Map_type > > m_value
Definition: jit_executor_value.h:426
friend std::ostream & operator<<(std::ostream &os, const Value &v)
bool is_null() const noexcept
Definition: jit_executor_value.h:304
std::shared_ptr< Array_type > as_array() const
Definition: jit_executor_value.h:364
static Value True()
Definition: jit_executor_value.h:284
bool operator>(const Value &) const =delete
static Value new_map()
Definition: jit_executor_value.h:274
std::shared_ptr< C > as_object_bridge() const
Definition: jit_executor_value.h:346
bool operator<(const Value &) const =delete
static Value False()
Definition: jit_executor_value.h:285
bool operator!=(const Value &other) const
Definition: jit_executor_value.h:291
static Value Null()
Definition: jit_executor_value.h:278
std::shared_ptr< Map_type > as_map() const
Definition: jit_executor_value.h:357
bool operator>=(const Value &) const =delete
Value(Value &&) noexcept=default
std::shared_ptr< Array_type > Array_type_ref
Definition: jit_executor_value.h:132
bool operator<=(const Value &) const =delete
Value(const Value &)=default
const char * get_type(TYPELIB *typelib, unsigned int nr)
int n
Definition: xcom_base.cc:509