26#ifndef _ROUTER_MYSQL_SESSION_H_
27#define _ROUTER_MYSQL_SESSION_H_
56 operator bool() {
return code_ != 0; }
78template <mysql_option Opt,
class ValueType>
90 constexpr const void *
data()
const {
return std::addressof(
v_); }
93 constexpr void *
data() {
return std::addressof(
v_); }
114template <mysql_option Opt>
124 constexpr const void *
data()
const {
return v_; }
126 constexpr void *
data() {
return std::addressof(v_); }
136template <mysql_option Opt>
147 constexpr const void *
data()
const {
return nullptr; }
149 constexpr void *
data() {
return nullptr; }
162 typedef std::vector<const char *>
Row;
170 static const char kSslModeDisabled[];
171 static const char kSslModePreferred[];
172 static const char kSslModeRequired[];
173 static const char kSslModeVerifyCa[];
174 static const char kSslModeVerifyIdentity[];
181 template <mysql_option Opt>
185 template <mysql_option Opt>
189 template <mysql_option Opt>
193 template <mysql_option Opt>
247 other.session_ =
nullptr;
251 : session_(session) {
253 session_->execute(consisten_snapshot
254 ?
"START TRANSACTION WITH CONSISTENT SNAPSHOT"
255 :
"START TRANSACTION");
268 session_->execute(
"COMMIT");
275 session_->execute(
"ROLLBACK");
289 class Error :
public std::runtime_error {
295 Error(
const char *error,
unsigned int code,
296 const std::string message =
"<not set>")
297 :
std::runtime_error(
error), code_(code), message_(message) {}
299 Error(
const std::string &error,
unsigned int code,
300 const std::string &message =
"<not set>")
301 :
std::runtime_error(
error), code_(code), message_(message) {}
303 unsigned int code()
const {
return code_; }
304 std::string
message()
const {
return message_; }
316 : idx_{idx}, parent_{parent} {}
317 const char *
operator*()
const {
return (*parent_)[idx_]; }
321 if (parent_ != other.
parent_)
return false;
322 return idx_ != other.
idx_;
331 size_t size()
const {
return row_.size(); }
354 const std::string &ca,
const std::string &capath,
355 const std::string &crl,
356 const std::string &crlpath);
363 std::string
ssl_ca()
const;
375 virtual void set_ssl_cert(
const std::string &cert,
const std::string &
key);
390 template <
class SettableMysqlOption>
416 template <
class GettableMysqlOption>
428 const std::string &username,
const std::string &
password,
433 unsigned long extra_client_flags = 0);
437 const std::string &db);
440 const std::string &username,
446 unsigned long extra_client_flags = 0);
455 const std::string &db);
459 virtual void reset();
463 uint64_t ps_id, std::vector<MYSQL_BIND> bind_parameters,
469 const std::string &
query);
473 virtual std::unique_ptr<MySQLSession::ResultRow>
query_one(
474 const std::string &
query,
484 virtual std::unique_ptr<MySQLSession::ResultRow>
query_one(
485 const std::string &stmt) {
491 const std::string &
query);
498 virtual
std::
string quote(const
std::
string &s,
char qchar = '\'') const;
531 uint64_t last_stmt_id{0};
536 unsigned long extra_client_flags_{0};
537 uint64_t connection_id_{0};
554 bool async_query_logged_ =
false;
570 const std::string &
q);
573 const std::string &
q);
581 const std::string &
q);
584 const std::string &
q);
586 void throw_mysqlerror(
MYSQL_STMT *stmt, uint64_t ps_id);
592 bool log_queries_{
true};
mysqlrouter::MySQLSession MySQLSession
Definition: bootstrap_mysql_account.cc:41
Null-terminated string which is securely wiped on destruction.
Definition: secure_string.h:59
Definition: mysql_session.h:289
Error(const char *error, unsigned int code, const std::string message="<not set>")
Definition: mysql_session.h:295
std::string message() const
Definition: mysql_session.h:304
unsigned int code() const
Definition: mysql_session.h:303
const std::string message_
Definition: mysql_session.h:308
Error(const std::string &error, unsigned int code, const std::string &message="<not set>")
Definition: mysql_session.h:299
const unsigned int code_
Definition: mysql_session.h:307
Definition: mysql_session.h:539
void operator()(MYSQL_RES *res)
Definition: mysql_session.h:541
Definition: mysql_session.h:313
bool operator!=(const RowIt &other) const
Definition: mysql_session.h:320
uint32_t idx_
Definition: mysql_session.h:326
RowIt(const ResultRow *parent, uint32_t idx=0)
Definition: mysql_session.h:315
void operator++()
Definition: mysql_session.h:318
const ResultRow * parent_
Definition: mysql_session.h:327
const char * operator*() const
Definition: mysql_session.h:317
Definition: mysql_session.h:311
ResultRow(Row row)
Definition: mysql_session.h:329
size_t size() const
Definition: mysql_session.h:331
RowIt begin() const
Definition: mysql_session.h:332
RowIt end() const
Definition: mysql_session.h:333
virtual size_t get_data_size(size_t i) const
Definition: mysql_session.h:336
Row row_
Definition: mysql_session.h:340
virtual ~ResultRow()=default
const char * operator[](size_t i) const
Definition: mysql_session.h:335
const char *& operator[](size_t i)
Definition: mysql_session.h:334
Definition: mysql_session.h:243
Transaction(MySQLSession *session, const bool consisten_snapshot=false)
Definition: mysql_session.h:250
Transaction & operator=(Transaction &&other)
Definition: mysql_session.h:280
Transaction(Transaction &&other)
Definition: mysql_session.h:246
Transaction()
Definition: mysql_session.h:245
void commit()
Definition: mysql_session.h:266
void rollback()
Definition: mysql_session.h:273
~Transaction()
Definition: mysql_session.h:258
Definition: mysql_session.h:157
std::function< void(unsigned, MYSQL_FIELD *)> FieldValidator
Definition: mysql_session.h:166
virtual std::unique_ptr< MySQLSession::ResultRow > query_one(const std::string &stmt)
Definition: mysql_session.h:484
std::string connection_address_
Definition: mysql_session.h:535
std::string ssl_crlpath() const
Definition: mysql_session.cc:300
virtual bool has_data_on_socket()
Definition: mysql_session.cc:1004
virtual void set_ssl_cert(const std::string &cert, const std::string &key)
Definition: mysql_session.cc:309
bool get_option(GettableMysqlOption &opt) const
get a mysql option.
Definition: mysql_session.h:417
MYSQL * connection_
Definition: mysql_session.h:533
std::function< bool(const ResultRow &)> ResultRowProcessor
Definition: mysql_session.h:164
std::string ssl_key() const
Definition: mysql_session.cc:327
virtual unsigned warning_count() noexcept
Definition: mysql_session.cc:1024
virtual uint64_t affected_rows() noexcept
Definition: mysql_session.cc:1000
std::unique_ptr< MYSQL_RES, MYSQL_RES_Deleter > mysql_result_type
Definition: mysql_session.h:544
virtual ~MySQLSession()
Definition: mysql_session.cc:137
std::function< bool(const Row &)> RowProcessor
Definition: mysql_session.h:163
stdx::expected< void, MysqlError > set_option(const SettableMysqlOption &opt)
set a mysql option.
Definition: mysql_session.h:391
virtual void prepare_execute_with_bind_parameters(uint64_t ps_id, std::vector< MYSQL_BIND > bind_parameters, const ResultRowProcessor &processor, const FieldValidator &validator, const OnResultSetEnd &on_resultset_end)
Definition: mysql_session.cc:746
std::string ssl_ca() const
Definition: mysql_session.cc:273
virtual uint64_t prepare(const std::string &query)
Definition: mysql_session.cc:709
virtual int ping()
Definition: mysql_session.cc:1028
void query(const std::string &stmt, const RowProcessor &processor)
Definition: mysql_session.h:480
virtual bool is_ssl_session_reused()
Definition: mysql_session.cc:1056
virtual std::unique_ptr< MySQLSession::ResultRow > query_one(const std::string &query, const FieldValidator &validator)
Definition: mysql_session.cc:916
std::string ssl_crl() const
Definition: mysql_session.cc:291
std::function< void()> OnResultSetEnd
Definition: mysql_session.h:167
std::string ssl_cert() const
Definition: mysql_session.cc:318
bool log_queries_
Definition: mysql_session.h:592
std::string default_schema
Definition: mysql_session.h:528
const std::string & get_address() noexcept
Definition: mysql_session.h:501
bool connected_
Definition: mysql_session.h:534
mysql_ssl_mode ssl_mode() const
Definition: mysql_session.cc:246
virtual uint64_t last_insert_id() noexcept
Definition: mysql_session.cc:996
virtual bool execute_nb(const std::string &query)
Definition: mysql_session.cc:956
virtual unsigned long server_version()
Definition: mysql_session.cc:1060
std::string tls_version() const
Definition: mysql_session.cc:255
std::string host
Definition: mysql_session.h:525
virtual const char * last_sqlstate()
Definition: mysql_session.cc:1041
virtual std::vector< std::string > get_session_tracker_data(enum enum_session_state_type type)
Definition: mysql_session.cc:1008
MYSQL * get_handle()
Definition: mysql_session.h:516
std::string ssl_cipher() const
Definition: mysql_session.cc:264
static mysql_ssl_mode parse_ssl_mode(std::string ssl_mode)
Definition: mysql_session.cc:144
std::string unix_socket
Definition: mysql_session.h:527
virtual void prepare_remove(uint64_t ps_id)
Definition: mysql_session.cc:823
uint64_t connection_id()
Definition: mysql_session.cc:234
int read_timeout() const
Definition: mysql_session.cc:345
AsyncQueryState
Definition: mysql_session.h:546
std::string ssl_capath() const
Definition: mysql_session.cc:282
void log_queries(bool log)
Definition: mysql_session.h:518
std::vector< const char * > Row
Definition: mysql_session.h:161
std::map< uint64_t, MYSQL_STMT * > stmts_
Definition: mysql_session.h:532
virtual std::string quote(const std::string &s, char qchar='\'') const
Definition: mysql_session.cc:1030
virtual unsigned int last_errno()
Definition: mysql_session.cc:1048
void change_user(const std::string &user, const std::string &password, const std::string &db)
Definition: mysql_session.cc:465
bool log_queries() const
Definition: mysql_session.h:519
Definition: mysql_session.h:48
MysqlError(unsigned int code, std::string message, std::string sql_state)
Definition: mysql_session.h:51
unsigned int value() const
Definition: mysql_session.h:60
std::string message() const
Definition: mysql_session.h:58
std::string sql_state() const
Definition: mysql_session.h:59
std::string sql_state_
Definition: mysql_session.h:65
unsigned int code_
Definition: mysql_session.h:63
std::string message_
Definition: mysql_session.h:64
A SQLLogFilter allows to replace substrings defined by a set of hardcoded regular expressions with '*...
Definition: log_filter.h:79
gettable, settable option for 'const char *' based mysql_option's.
Definition: mysql_session.h:115
constexpr const void * data() const
Definition: mysql_session.h:124
const char * value_type
Definition: mysql_session.h:117
constexpr void * data()
Definition: mysql_session.h:126
constexpr Option(value_type v)
Definition: mysql_session.h:120
constexpr value_type value() const
Definition: mysql_session.h:130
constexpr mysql_option option() const noexcept
Definition: mysql_session.h:122
constexpr void value(value_type v)
Definition: mysql_session.h:128
constexpr mysql_option option() const noexcept
Definition: mysql_session.h:145
constexpr value_type value() const
Definition: mysql_session.h:151
constexpr void * data()
Definition: mysql_session.h:149
std::nullptr_t value_type
Definition: mysql_session.h:139
constexpr Option(value_type)
Definition: mysql_session.h:143
constexpr const void * data() const
Definition: mysql_session.h:147
gettable, settable option for mysql_option's.
Definition: mysql_session.h:79
constexpr Option()=default
constexpr Option(value_type v)
Definition: mysql_session.h:84
constexpr const void * data() const
Definition: mysql_session.h:90
ValueType value_type
Definition: mysql_session.h:81
constexpr void * data()
Definition: mysql_session.h:93
value_type v_
Definition: mysql_session.h:102
constexpr mysql_option option() const noexcept
Definition: mysql_session.h:87
constexpr value_type value() const
Definition: mysql_session.h:99
constexpr void value(value_type v)
Definition: mysql_session.h:96
Definition: expected.h:286
static bool execute(MYSQL_STMT *stmt, char *packet, ulong length, bool send_param_count)
Auxiliary function to send COM_STMT_EXECUTE packet to server and read reply.
Definition: libmysql.cc:1831
static char * query
Definition: myisam_ftdump.cc:47
This file defines the client API to MySQL and also the ABI of the dynamically linked libmysqlclient.
const char *STDCALL mysql_sqlstate(MYSQL *mysql)
Definition: client.cc:9536
unsigned int STDCALL mysql_errno(MYSQL *mysql)
Definition: client.cc:9194
mysql_option
Definition: mysql.h:170
int STDCALL mysql_get_option(MYSQL *mysql, enum mysql_option option, const void *arg)
Return the current values for the options settable through mysql_options()
Definition: client.cc:8893
const char *STDCALL mysql_error(MYSQL *mysql)
Definition: client.cc:9198
void STDCALL mysql_free_result(MYSQL_RES *result)
Definition: client.cc:1955
int STDCALL mysql_options(MYSQL *mysql, enum mysql_option option, const void *arg)
Definition: client.cc:8554
mysql_ssl_mode
Definition: mysql.h:272
enum_session_state_type
Type of state change information that the server can include in the Ok packet.
Definition: mysql_com.h:1071
static char * password
Definition: mysql_secure_installation.cc:58
char * user
Definition: mysqladmin.cc:67
const char * host
Definition: mysqladmin.cc:66
void error(const char *format,...)
ulong connect_timeout
Definition: mysqld.cc:1356
std::string HARNESS_EXPORT reset()
get 'reset attributes' ESC sequence.
Definition: vt100.cc:37
void set_ssl_options(MySQLSession *sess, const std::map< std::string, std::string > &options)
Definition: router_conf.cc:182
void disconnect(Connection &c)
Definition: server.cc:48
Definition: http_server_component.cc:34
constexpr char kNone[]
Definition: logging.h:70
size_t size(const char *const c)
Definition: base64.h:46
int last_error()
get last socket error.
Definition: socket_error.h:82
stdx::expected< void, error_type > connect(native_handle_type native_handle, const struct sockaddr *addr, size_t addr_len)
wrap connect() in a portable way.
Definition: socket.h:353
Definition: gcs_xcom_synode.h:64
unexpected(E) -> unexpected< E >
static int is_connected(connection_descriptor *con)
Definition: node_connection.h:95
required string key
Definition: replication_asynchronous_connection_failover.proto:60
required uint64 port
Definition: replication_asynchronous_connection_failover.proto:33
required string type
Definition: replication_group_member_actions.proto:34
#define ROUTER_MYSQL_EXPORT
Definition: router_mysql_export.h:15
static bool rollback(THD *thd)
Abort the current statement and transaction.
Definition: sql_cmd_srs.cc:140
static void swap(String &a, String &b) noexcept
Definition: sql_string.h:650
constexpr const char * ssl_mode_to_string(SslMode mode)
Definition: ssl_mode.h:44
synode_no q[FIFO_SIZE]
Definition: xcom_base.cc:4112