File: sql_service_command.h

package info (click to toggle)
mysql-8.0 8.0.45-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,048 kB
  • sloc: cpp: 4,685,434; ansic: 412,712; pascal: 108,396; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; python: 21,816; sh: 17,285; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,083; makefile: 1,793; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (362 lines) | stat: -rw-r--r-- 11,355 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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
/* 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 */

#ifndef SQL_SERVICE_COMMAND_INCLUDE
#define SQL_SERVICE_COMMAND_INCLUDE

#include <stddef.h>

#include "my_inttypes.h"
#include "plugin/group_replication/include/plugin_utils.h"
#include "plugin/group_replication/include/sql_service/sql_service_interface.h"

#define GR_PLUGIN_SESSION_THREAD_TIMEOUT 10

/**
  What is the policy when creation a new server session for SQL execution.
*/
enum enum_plugin_con_isolation {
  PSESSION_USE_THREAD,       ///< Use the current thread
  PSESSION_INIT_THREAD,      ///< Use the current thread but initialize it
  PSESSION_DEDICATED_THREAD  ///< Use a dedicated thread to open a session
};

class Sql_service_commands {
 public:
  /**
   Method to kill the session identified by the given session id in those
   cases where the server hangs while executing the sql query.

   @param sql_interface  the server session interface for query execution
   @param session_id  id of the session to be killed.

   @return the error value returned
    @retval 0  - success
    @retval >0 - Failure
  */
  long internal_kill_session(Sql_service_interface *sql_interface,
                             void *session_id = nullptr);

  /**
    Method to remotely clone a server

    @param[in] sql_interface  The connection where to execute the query
    @param[in] variable_args  Tuple <string,string,string,string,bool,string>

    @return the error value returned
      @retval 0      OK
      @retval !=0    Error on execution
  */
  long internal_clone_server(Sql_service_interface *sql_interface,
                             void *variable_args = nullptr);

  /**
    Method to execute a given query

    @param[in] sql_interface  The connection where to execute the query
    @param[in] variable_args  Tuple <string, string>

    @return the error value returned
      @retval 0      OK
      @retval !=0    Error on execution
  */
  long internal_execute_query(Sql_service_interface *sql_interface,
                              void *variable_args = nullptr);

  /**
    Method to execute a given conditional query

    @param[in] sql_interface  The connection where to execute the query
    @param[in] variable_args  Tuple <string, bool, string>

    @return the error value returned
      @retval 0      OK
      @retval !=0    Error on execution
  */
  long internal_execute_conditional_query(Sql_service_interface *sql_interface,
                                          void *variable_args = nullptr);
};

struct st_session_method {
  long (Sql_service_commands::*method)(Sql_service_interface *, void *);
  bool terminated;
};

class Session_plugin_thread {
 public:
  Session_plugin_thread(Sql_service_commands *command_interface);

  ~Session_plugin_thread();

  /**
    Launch a new thread that will create a new server session.

    @param plugin_pointer_var the plugin pointer for session creation
    @param user               the user for the connection

    @return the operation was successful
      @retval 0      OK
      @retval !=0    Error
  */
  int launch_session_thread(void *plugin_pointer_var, const char *user);

  /**
    Terminate the thread and close the session.

    @return the operation was successful
      @retval 0      OK
      @retval !=0    Error
  */
  int terminate_session_thread();

  /**
    Thread handler for session creation.
  */
  int session_thread_handler();

  /**
     Method to submit a new method into execution on the session thread
     @param method    method to executed
     @param terminate termination flag to the class
  */
  void queue_new_method_for_application(
      long (Sql_service_commands::*method)(Sql_service_interface *, void *),
      bool terminate = false);

  /**
    Wait for the queued method to return.
    @return the return value of the submitted method
  */
  long wait_for_method_execution();

  Sql_service_interface *get_service_interface();

  /**
    Sets a pointer that the next queued method will use to return a value
    @param pointer the pointer where the method will store some return value
  */
  void set_return_pointer(void *pointer) { return_object = pointer; }

 private:
  Sql_service_commands *command_interface;

  Sql_service_interface *m_server_interface;

  Synchronized_queue<st_session_method *> *incoming_methods;

  void *m_plugin_pointer;

  /** The value for returning on methods */
  void *return_object;

  /** Session thread handle */
  my_thread_handle m_plugin_session_pthd;
  /* run conditions and locks */
  mysql_mutex_t m_run_lock;
  mysql_cond_t m_run_cond;
  /* method completion conditions and locks */
  mysql_mutex_t m_method_lock;
  mysql_cond_t m_method_cond;

  /**The user for the session connection*/
  const char *session_user;
  /** Session thread method completion flag */
  bool m_method_execution_completed;
  /** The method return value */
  long m_method_execution_return_value;
  /** Session thread state */
  thread_state m_session_thread_state;
  /** Session termination flag */
  bool m_session_thread_terminate;
  /** Session thread error flag */
  int m_session_thread_error;
};

class Sql_service_command_interface {
 public:
  Sql_service_command_interface();
  ~Sql_service_command_interface();

  /**
    Establishes the connection to the server.

    @param isolation_param  session creation requirements: use current thread,
                            use thread but initialize it or create it in a
                            dedicated thread
    @param user             the user for the connection
    @param plugin_pointer   the plugin pointer for threaded connections

    @return the connection was successful
      @retval 0      OK
      @retval !=0    Error
  */
  int establish_session_connection(enum_plugin_con_isolation isolation_param,
                                   const char *user,
                                   void *plugin_pointer = nullptr);

  /**
    Terminates the old connection and creates a new one to the server.

    @param isolation_param  session creation requirements: use current thread,
                            use thread but initialize it or create it in a
                            dedicated thread
    @param user             the user for the connection
    @param plugin_pointer   the plugin pointer for threaded connections

    @return the connection was successful
      @retval 0      OK
      @retval !=0    Error
  */
  int reestablish_connection(enum_plugin_con_isolation isolation_param,
                             const char *user, void *plugin_pointer = nullptr);
  /**
    Was this session killed?

    @retval true   session was killed
    @retval false  session was not killed
  */
  bool is_session_killed();

  /**
    Stops and deletes all connection related structures
  */
  void terminate_connection_fields();

  /**
    Returns the SQL service interface associated to this class

    @return the sql service interface field
  */
  Sql_service_interface *get_sql_service_interface();

  /**
    Sets the SQL API user to be used on security checks

    @param user the user to be used

    @return the operation was successful
      @retval 0      OK
      @retval !=0    Error
  */
  int set_interface_user(const char *user);

  /**
   Method to kill the session identified by the given session id in those
   cases where the server hangs while executing the sql query.

   @param session_id  id of the session to be killed.

   @return the error value returned
      @retval 0  - success
      @retval >0 - Failure
  */
  long kill_session(unsigned long session_id);

  /**
    Checks if there is an existing session

    @return the error value returned
      @retval true  valid
      @retval false some issue prob happened on connection
  */
  bool is_session_valid();

  /**
    Method to remotely clone a server

    @param [in] host      The host to clone
    @param [in] port      The host port
    @param [in] username  The username to authenticate in the remote server
    @param [in] password  The password to authenticate in the remote server
    @param [in] use_ssl   Is ssl configured for the clone process
    @param [out] error    The error message in case of error

    @return the error value returned
      @retval 0      OK
      @retval !=0    Error on execution
  */
  long clone_server(std::string &host, std::string &port, std::string &username,
                    std::string &password, bool use_ssl, std::string &error);

  /**
    Execute a query passed as parameter.

    @param [in] query      The query to execute

    @return the error value returned
      @retval 0      OK
      @retval !=0    Error on execution
  */
  long execute_query(std::string &query);

  /**
    Execute a query passed as parameter.

    @param [in] query      The query to execute
    @param [out] error     The error message in case of error

    @return the error value returned
      @retval 0      OK
      @retval !=0    Error on execution
  */
  long execute_query(std::string &query, std::string &error);

  /**
    Execute a conditional query passed as parameter.

    @param [in] query      The query to execute
    @param [in] result     The result of the query

    @return the error value returned
      @retval 0      OK
      @retval !=0    Error on execution
  */
  long execute_conditional_query(std::string &query, bool *result);

  /**
    Execute a conditional query passed as parameter.

    @param [in] query      The query to execute
    @param [in] result     The result of the query
    @param [out] error     The error message in case of error

    @return the error value returned
      @retval 0      OK
      @retval !=0    Error on execution
  */
  long execute_conditional_query(std::string &query, bool *result,
                                 std::string &error);

 private:
  enum_plugin_con_isolation connection_thread_isolation;

  Sql_service_commands sql_service_commands;

  /** The internal SQL session service interface to the server */
  Sql_service_interface *m_server_interface;

  /* The thread where the connection leaves if isolation is needed*/
  Session_plugin_thread *m_plugin_session_thread;
};

#endif  // SQL_SERVICE_COMMAND_INCLUDE