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_
|