File: 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 (285 lines) | stat: -rw-r--r-- 14,487 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
/*
 * Copyright (c) 2017, 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 PLUGIN_X_TESTS_DRIVER_PROCESSOR_COMMANDS_COMMAND_H_
#define PLUGIN_X_TESTS_DRIVER_PROCESSOR_COMMANDS_COMMAND_H_

#include <list>
#include <map>
#include <memory>
#include <string>
#include <vector>

#include "plugin/x/src/helper/chrono.h"
#include "plugin/x/tests/driver/connector/result_fetcher.h"
#include "plugin/x/tests/driver/processor/execution_context.h"

class Command {
 public:
  enum class Result { Continue, Stop_with_success, Stop_with_failure };
  enum class Metadata_policy { Default, Store, Use_stored };

  using Any = ::Mysqlx::Datatypes::Any;

 public:
  Command();

  bool is_command_registred(const std::string &command_line,
                            std::string *out_command_name = nullptr,
                            bool *out_is_single_line_command = nullptr) const;

  Result process(std::istream &input, Execution_context *context,
                 const std::string &command);

 private:
  using Command_method = Result (Command::*)(std::istream &,
                                             Execution_context *,
                                             const std::string &);
  using Value_callback = std::function<bool(std::string)>;
  using Command_map = std::map<std::string, Command_method>;

  struct Loop_do {
    std::streampos block_begin;
    int iterations;
    int value;
    std::string variable_name;
  };

  Command_map m_commands;
  std::list<Loop_do> m_loop_stack;
  static xpl::chrono::Time_point m_start_measure;

  Result cmd_echo(std::istream &input, Execution_context *context,
                  const std::string &args);
  Result cmd_title(std::istream &input, Execution_context *context,
                   const std::string &args);
  Result cmd_recvtype(std::istream &input, Execution_context *context,
                      const std::string &args);
  Result cmd_recvok(std::istream &input, Execution_context *context,
                    const std::string &args);
  Result cmd_recvmessage(std::istream &input, Execution_context *context,
                         const std::string &args);
  Result cmd_recverror(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_recvtovar(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_recvresult(std::istream &input, Execution_context *context,
                        const std::string &args);
  Result cmd_recvresult(std::istream &input, Execution_context *context,
                        const std::string &args, Value_callback value_callback,
                        const Metadata_policy = Metadata_policy::Default);
  Result cmd_recvuntil(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_do_ssl_handshake(std::istream &input, Execution_context *context,
                              const std::string &args);
  Result cmd_stmtsql(std::istream &input, Execution_context *context,
                     const std::string &args);
  Result cmd_stmtadmin(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_sleep(std::istream &input, Execution_context *context,
                   const std::string &args);
  Result cmd_login(std::istream &input, Execution_context *context,
                   const std::string &args);
  Result cmd_repeat(std::istream &input, Execution_context *context,
                    const std::string &args);
  Result cmd_endrepeat(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_loginerror(std::istream &input, Execution_context *context,
                        const std::string &args);
  Result cmd_system(std::istream &input, Execution_context *context,
                    const std::string &args);
  Result cmd_recv_all_until_disc(std::istream &input,
                                 Execution_context *context,
                                 const std::string &args);
  Result cmd_enable_compression(std::istream &input, Execution_context *context,
                                const std::string &args);
  Result cmd_peerdisc(std::istream &input, Execution_context *context,
                      const std::string &args);
  Result cmd_recv(std::istream &input, Execution_context *context,
                  const std::string &args);
  Result cmd_exit(std::istream &input, Execution_context *context,
                  const std::string &args);
  Result cmd_abort(std::istream &input, Execution_context *context,
                   const std::string &args);
  Result cmd_shutdown_on_classic(std::istream &input,
                                 Execution_context *context,
                                 const std::string &args);
  Result cmd_shutdown_server(std::istream &input, Execution_context *context,
                             const std::string &args);
  Result cmd_reconnect(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_nowarnings(std::istream &input, Execution_context *context,
                        const std::string &args);
  Result cmd_yeswarnings(std::istream &input, Execution_context *context,
                         const std::string &args);
  Result cmd_fatalerrors(std::istream &input, Execution_context *context,
                         const std::string &args);
  Result cmd_fatalwarnings(std::istream &input, Execution_context *context,
                           const std::string &args);
  Result cmd_nofatalerrors(std::istream &input, Execution_context *context,
                           const std::string &args);
  Result cmd_newsession_mysql41(std::istream &input, Execution_context *context,
                                const std::string &args);
  Result cmd_newsession_memory(std::istream &input, Execution_context *context,
                               const std::string &args);
  Result cmd_newsession_plain(std::istream &input, Execution_context *context,
                              const std::string &args);
  Result cmd_newsession(std::istream &input, Execution_context *context,
                        const std::string &args);
  Result cmd_setsession(std::istream &input, Execution_context *context,
                        const std::string &args);
  Result cmd_closesession(std::istream &input, Execution_context *context,
                          const std::string &args);
  Result cmd_expecterror(std::istream &input, Execution_context *context,
                         const std::string &args);
  Result cmd_expectwarnings(std::istream &input, Execution_context *context,
                            const std::string &args);
  Result cmd_measure(std::istream &input, Execution_context *context,
                     const std::string &args);
  Result cmd_endmeasure(std::istream &input, Execution_context *context,
                        const std::string &args);
  Result cmd_quiet(std::istream &input, Execution_context *context,
                   const std::string &args);
  Result cmd_noquiet(std::istream &input, Execution_context *context,
                     const std::string &args);
  Result cmd_varsub(std::istream &input, Execution_context *context,
                    const std::string &args);
  Result cmd_varreplace(std::istream &input, Execution_context *context,
                        const std::string &args);
  Result cmd_varlet(std::istream &input, Execution_context *context,
                    const std::string &args);
  Result cmd_varinc(std::istream &input, Execution_context *context,
                    const std::string &args);
  Result cmd_vargen(std::istream &input, Execution_context *context,
                    const std::string &args);
  Result cmd_varfile(std::istream &input, Execution_context *context,
                     const std::string &args);
  Result cmd_varescape(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_binsend(std::istream &input, Execution_context *context,
                     const std::string &args);
  Result cmd_hexsend(std::istream &input, Execution_context *context,
                     const std::string &args);
  Result cmd_binsendoffset(std::istream &input, Execution_context *context,
                           const std::string &args);
  Result cmd_callmacro(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_macro_delimiter_compress(std::istream &input,
                                      Execution_context *context,
                                      const std::string &args);
  Result cmd_assert(std::istream &input, Execution_context *context,
                    const std::string &args);
  Result cmd_assert_eq(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_assert_ne(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_assert_gt(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_assert_ge(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_assert_le(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_assert_lt(std::istream &input, Execution_context *context,
                       const std::string &args);
  Result cmd_query(std::istream &input, Execution_context *context,
                   const std::string &args);
  Result cmd_noquery(std::istream &input, Execution_context *context,
                     const std::string &args);
  Result cmd_compress(std::istream &input, Execution_context *context,
                      const std::string &args);
  Result cmd_wait_for(std::istream &input, Execution_context *context,
                      const std::string &args);
  Result cmd_import(std::istream &input, Execution_context *context,
                    const std::string &args);
  Result cmd_received(std::istream &input, Execution_context *context,
                      const std::string &args);
  Result cmd_clear_received(std::istream &input, Execution_context *context,
                            const std::string &args);
  Result cmd_recvresult_store_metadata(std::istream &input,
                                       Execution_context *context,
                                       const std::string &args);
  Result cmd_recv_with_stored_metadata(std::istream &input,
                                       Execution_context *context,
                                       const std::string &args);
  Result cmd_clear_stored_metadata(std::istream &input,
                                   Execution_context *context,
                                   const std::string &args);
  Result cmd_env(std::istream &input, Execution_context *context,
                 const std::string &args);

  Result do_newsession(std::istream &input, Execution_context *context,
                       const std::string &args,
                       const std::vector<std::string> &auth_methods);
  size_t value_to_offset(const std::string &data, const size_t maximum_value);
  bool json_string_to_any(const std::string &json_string, Any *any) const;
  void print_resultset(Execution_context *context, Result_fetcher *result,
                       const std::vector<std::string> &columns,
                       Value_callback value_callback, const bool quiet,
                       const bool print_column_info);

  Result get_sql_variable(Execution_context *context, const std::string &name,
                          std::string *out_var);
  static void try_result(Result result);

  template <typename Equal_operator>
  Result cmd_assert_generic(std::istream &input, Execution_context *context,
                            const std::string &args) {
    std::vector<std::string> vargs;

    try {
      aux::split(vargs, args, "\t", true);

      if (2 != vargs.size()) {
        context->print_error(context->m_script_stack,
                             "Specified invalid number of arguments for ",
                             context->m_command_name,
                             " command: ", vargs.size(), " expecting 2.\n",
                             "Executed with following argument: \"", args,
                             "\"");
        return Result::Stop_with_failure;
      }

      context->m_variables->replace(&vargs[0]);
      context->m_variables->replace(&vargs[1]);

      Equal_operator op;
      if (op(vargs[0], vargs[1])) return Result::Continue;
    } catch (const std::exception &) {
    }

    context->print_error(
        context->m_script_stack, "Execution of '", context->m_command_name, " ",
        context->m_command_arguments, "', resulted in an error.\n");
    context->print_error("Where argument0='", vargs[0], "', argument1='",
                         vargs[1], "'\n");

    return context->m_options.m_fatal_errors ? Result::Stop_with_failure
                                             : Result::Continue;
  }
};

void print_help_commands();

#endif  // PLUGIN_X_TESTS_DRIVER_PROCESSOR_COMMANDS_COMMAND_H_