File: xsession_impl.h

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (163 lines) | stat: -rw-r--r-- 6,715 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*
 * Copyright (c) 2015, 2025, Oracle and/or its affiliates.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License, version 2.0,
 * as published by the Free Software Foundation.
 *
 * This program is designed to work with certain software (including
 * but not limited to OpenSSL) that is licensed under separate terms,
 * as designated in a particular file or component or in included license
 * documentation.  The authors of MySQL hereby grant you an additional
 * permission to link the program and your derivative works with the
 * separately licensed software that they have either included with
 * the program or referenced in the documentation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License, version 2.0, for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 */

// MySQL DB access module, for use by plugins and others
// For the module that implements interactive DB functionality see mod_db

#ifndef PLUGIN_X_CLIENT_XSESSION_IMPL_H_
#define PLUGIN_X_CLIENT_XSESSION_IMPL_H_

#include <chrono>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <utility>
#include <vector>

#include "plugin/x/client/context/xcontext.h"
#include "plugin/x/client/mysqlxclient/xargument.h"
#include "plugin/x/client/mysqlxclient/xsession.h"

namespace xcl {

class Result;
class Protocol_impl;
class Protocol_factory;

class Session_impl : public XSession {
 public:
  explicit Session_impl(std::unique_ptr<Protocol_factory> factory = {});
  ~Session_impl() override;

  XProtocol::Client_id client_id() const override {
    return m_context->m_client_id;
  }
  XProtocol &get_protocol() override;

  XError set_mysql_option(const Mysqlx_option option,
                          const bool value) override;
  XError set_mysql_option(const Mysqlx_option option,
                          const std::string &value) override;
  XError set_mysql_option(const Mysqlx_option option,
                          const std::vector<std::string> &values_list) override;
  XError set_mysql_option(const Mysqlx_option option,
                          const char *value) override;
  XError set_mysql_option(const Mysqlx_option option,
                          const int64_t value) override;

  XError set_capability(const Mysqlx_capability capability, const bool value,
                        const bool required = true) override;
  XError set_capability(const Mysqlx_capability capability,
                        const std::string &value,
                        const bool required = true) override;
  XError set_capability(const Mysqlx_capability capability, const char *value,
                        const bool required = true) override;
  XError set_capability(const Mysqlx_capability capability, const int64_t value,
                        const bool required = true) override;
  XError set_capability(const Mysqlx_capability capability,
                        const Argument_object &value,
                        const bool required = true) override;
  XError set_capability(const Mysqlx_capability capability,
                        const Argument_uobject &value,
                        const bool required = true) override;

  XError connect(const char *host, const uint16_t port, const char *user,
                 const char *pass, const char *schema) override;

  XError connect(const char *socket_file, const char *user, const char *pass,
                 const char *schema) override;

  XError reauthenticate(const char *user, const char *pass,
                        const char *schema) override;

  std::unique_ptr<XQuery_result> execute_sql(const std::string &sql,
                                             XError *out_error) override;

  std::unique_ptr<XQuery_result> execute_stmt(const std::string &ns,
                                              const std::string &sql,
                                              const Argument_array &args,
                                              XError *out_error) override;

  void close() override;

  Argument_uobject get_connect_attrs() const override;
  bool is_protocol() const { return m_protocol.use_count(); }

 private:
  using Context_ptr = std::shared_ptr<Context>;
  using Protocol_factory_ptr = std::unique_ptr<Protocol_factory>;
  using XProtocol_ptr = std::shared_ptr<XProtocol>;

  void setup_protocol();
  void setup_session_notices_handler();
  void setup_general_notices_handler();
  void setup_server_supported_compression(
      const Mysqlx::Datatypes::Object_ObjectField *field);
  void setup_server_supported_features(
      const Mysqlx::Connection::Capabilities *capabilities);

  static std::vector<Auth> get_methods_sequence_from_auto(
      const Auth auto_authentication, const bool can_use_plain);
  static bool is_auto_method(const Auth authentication_method);
  static std::string get_method_from_auth(const Auth auth);

  Argument_object &get_capabilites(const bool required);
  bool needs_servers_capabilities() const;
  bool is_connected();
  XError authenticate(const char *user, const char *pass, const char *schema,
                      Connection_type connection_type);
  static Handler_result handle_notices(std::shared_ptr<Context> context,
                                       const Mysqlx::Notice::Frame::Type,
                                       const char *, const uint32_t);

  std::pair<XError, std::vector<std::string>> validate_and_adjust_auth_methods(
      const std::vector<Auth> &auth_methods, bool can_use_plain);
  Argument_value get_compression_capability(
      const bool include_compression_level = true) const;

  Argument_object m_required_capabilities;
  Argument_object m_optional_capabilities;
  XProtocol_ptr m_protocol;
  Context_ptr m_context;
  Protocol_factory_ptr m_factory;
  std::set<Auth> m_server_supported_auth_methods{Auth::k_mysql41, Auth::k_plain,
                                                 Auth::k_sha256_memory};

  class Session_connect_timeout_scope_guard {
   public:
    explicit Session_connect_timeout_scope_guard(Session_impl *parent);
    ~Session_connect_timeout_scope_guard();

   private:
    Session_impl *m_parent;
    XProtocol::Handler_id m_handler_id;
    std::chrono::steady_clock::time_point m_start_time;
  };
};

}  // namespace xcl

#endif  // PLUGIN_X_CLIENT_XSESSION_IMPL_H_