MySQL 8.0.40
Source Code Documentation
protocol.h
Go to the documentation of this file.
1#ifndef PROTOCOL_INCLUDED
2#define PROTOCOL_INCLUDED
3
4/* Copyright (c) 2002, 2024, Oracle and/or its affiliates.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License, version 2.0,
8 as published by the Free Software Foundation.
9
10 This program is designed to work with certain software (including
11 but not limited to OpenSSL) that is licensed under separate terms,
12 as designated in a particular file or component or in included license
13 documentation. The authors of MySQL hereby grant you an additional
14 permission to link the program and your derivative works with the
15 separately licensed software that they have either included with
16 the program or referenced in the documentation.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License, version 2.0, for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
26
27#include <assert.h>
28
29#include "mysql/com_data.h"
30#include "mysql/mysql_lex_string.h" // LEX_STRING
31#include "mysql_com.h" // mysql_enum_shutdown_level
32#include "mysql_time.h" // MYSQL_TIME
33#include "sql_string.h" // String
34#include "violite.h" /* SSL && enum_vio_type */
35
36class my_decimal;
37class Send_field;
38class Item_param;
39template <class T>
40class List;
41class Field;
42
43class Protocol {
44 private:
45 /// Pointer to the Protocol below on the stack.
47
48 public:
49 virtual ~Protocol() = default;
50
51 /**
52 Remove the reference to the previous protocol and return it.
53
54 @returns The new top of the Protocol stack.
55 */
57 assert(m_previous_protocol);
58 Protocol *protocol = m_previous_protocol;
59 m_previous_protocol = nullptr;
60 return protocol;
61 }
62
63 /**
64 Set reference to "this" as the previous protocol on the protocol provided
65 as argument.
66
67 @param protocol Protocol to become the top of Protocol stack.
68 */
69 void push_protocol(Protocol *protocol) {
70 assert(!protocol->m_previous_protocol);
71 protocol->m_previous_protocol = this;
72 }
73
74 /**
75 Read packet from client
76
77 @retval -1 fatal error
78 @retval 0 ok
79 @retval 1 non-fatal error
80 */
81 virtual int read_packet() = 0;
82
83 /**
84 Reads the command from the protocol and creates a command.
85
86 @param com_data out parameter
87 @param cmd out parameter
88
89 @returns
90 -1 fatal protocol error
91 0 ok
92 1 non-fatal protocol or parsing error
93 */
94 virtual int get_command(COM_DATA *com_data, enum_server_command *cmd) = 0;
95
96 /**
97 Enum used by type() to specify the protocol type
98 */
100 PROTOCOL_TEXT = 0, // text Protocol type used mostly
101 // for the old (MySQL 4.0 protocol)
102 PROTOCOL_BINARY = 1, // binary protocol type
103 PROTOCOL_LOCAL = 2, // local protocol type(intercepts communication)
104 PROTOCOL_ERROR = 3, // error protocol instance
105 PROTOCOL_PLUGIN = 4 // pluggable protocol type
106 };
107
108 /**
109 Flags available to alter the way the messages are sent to the client
110 */
111 enum { SEND_NUM_ROWS = 1, SEND_DEFAULTS = 2, SEND_EOF = 4 };
112
113 virtual enum enum_protocol_type type() const = 0;
114
115 virtual enum enum_vio_type connection_type() const = 0;
116
117 /* Data sending functions */
118 virtual bool store_null() = 0;
119 virtual bool store_tiny(longlong from, uint32 zerofill) = 0;
120 virtual bool store_short(longlong from, uint32 zerofill) = 0;
121 virtual bool store_long(longlong from, uint32 zerofill) = 0;
122 virtual bool store_longlong(longlong from, bool unsigned_flag,
123 uint32 zerofill) = 0;
124 virtual bool store_decimal(const my_decimal *, uint, uint) = 0;
125 virtual bool store_string(const char *from, size_t length,
126 const CHARSET_INFO *fromcs) = 0;
127 virtual bool store_float(float from, uint32 decimals, uint32 zerofill) = 0;
128 virtual bool store_double(double from, uint32 decimals, uint32 zerofill) = 0;
129 virtual bool store_datetime(const MYSQL_TIME &time, uint precision) = 0;
130 virtual bool store_date(const MYSQL_TIME &time) = 0;
131 virtual bool store_time(const MYSQL_TIME &time, uint precision) = 0;
132 virtual bool store_field(const Field *field) = 0;
133 // Convenience wrappers
134 bool store(int from) { return store_long(longlong{from}, 0); }
135 bool store(uint32 from) { return store_long(longlong{from}, 0); }
136 bool store(longlong from) { return store_longlong(from, false, 0); }
137 bool store(ulonglong from) {
138 return store_longlong(static_cast<longlong>(from), true, 0);
139 }
140 bool store_tiny(longlong from) { return store_tiny(from, 0); }
141 bool store_short(longlong from) { return store_short(from, 0); }
142 bool store_long(longlong from) { return store_long(from, 0); }
143 bool store_longlong(longlong from, bool unsigned_flag) {
144 return store_longlong(from, unsigned_flag, 0);
145 }
146 /**
147 Send \\0 end terminated string.
148
149 @param from NullS or \\0 terminated string.
150 @param fromcs Character set of the from string.
151
152 @note In most cases one should use store(from, length, cs) instead of
153 this function
154
155 @retval false ok
156 @retval true error
157 */
158 inline bool store(const char *from, const CHARSET_INFO *fromcs) {
159 return from ? store_string(from, strlen(from), fromcs) : store_null();
160 }
161 inline bool store(String *str) {
162 return store_string(str->ptr(), str->length(), str->charset());
163 }
164 inline bool store(const LEX_STRING &s, const CHARSET_INFO *cs) {
165 return store_string(s.str, s.length, cs);
166 }
167
168 /**
169 Returns the client capabilities stored on the protocol.
170 The available capabilities are defined in mysql_com.h
171 */
172 virtual ulong get_client_capabilities() = 0;
173 /**
174 Checks if the client capabilities include the one
175 specified as parameter.
176
177 @retval true if it includes the specified capability
178 @retval false otherwise
179 */
180 virtual bool has_client_capability(unsigned long client_capability) = 0;
181
182 /**
183 Checks if the protocol's connection with the client is still alive.
184 It should always return true unless the protocol closed the connection.
185
186 @retval true if the connection is still alive
187 @retval false otherwise
188 */
189 virtual bool connection_alive() const = 0;
190
191 /**
192 Result set sending functions
193
194 @details Server uses following schema to send result:
195 ... sending metadata ...
196 | start_result_metadata(...)
197 | start_row()
198 | send_field_metadata(...)
199 | end_row()
200 ... same for each field sent ...
201 | end_result_metadata(...)
202 |
203 ... sending result ...
204 | start_row(...)
205 | store_xxx(...)
206 ... store_xxx(..) is called for each field ...
207 | end_row(...)
208 ... same for each row, until all rows are sent ...
209 | send_ok/eof/error(...)
210 However, a protocol implementation might use different schema. For
211 example, Protocol_callback ignores start/end_row when metadata is being
212 sent.
213 */
214
215 virtual void start_row() = 0;
216 virtual bool end_row() = 0;
217 virtual void abort_row() = 0;
218 virtual void end_partial_result_set() = 0;
219
220 /**
221 Thread is being shut down, disconnect and free resources
222
223 @param server_shutdown If false then this is normal thread shutdown. If
224 true then the server is shutting down.
225 */
226 virtual int shutdown(bool server_shutdown = false) = 0;
227 /**
228 Returns the read/writing status
229
230 @retval 1 Read
231 @retval 2 Write
232 @retval 0 Other(Idle, Killed)
233 */
234 virtual uint get_rw_status() = 0;
235 /**
236 Returns if the protocol is compressed or not.
237
238 @retval false Not compressed
239 @retval true Compressed
240 */
241 virtual bool get_compression() = 0;
242 /**
243 Returns compression algorithm name.
244
245 @retval string compression method name
246 @retval NULL if no compression is enabled
247 */
248 virtual char *get_compression_algorithm() = 0;
249 /**
250 Returns compression level.
251
252 @returns compression level
253 */
255 /**
256 Prepares the server for metadata sending.
257 Notifies the client that the metadata sending will start.
258
259 @param num_cols Number of columns that will be sent
260 @param flags Flags to alter the metadata sending
261 Can be any of the following:
262 SEND_NUM_ROWS, SEND_DEFAULTS, SEND_EOF
263 @param resultcs Charset to convert to
264
265 @retval false Ok
266 @retval true An error occurred
267 */
268
269 virtual bool start_result_metadata(uint num_cols, uint flags,
270 const CHARSET_INFO *resultcs) = 0;
271 /**
272 Sends field metadata.
273
274 @param field Field metadata to be send to the client
275 @param charset Field's charset: in case it is different
276 than the one used by the connection it will
277 be used to convert the value to
278 the connection's charset
279
280 @retval false The metadata was successfully sent
281 @retval true An error occurred
282 */
283
284 virtual bool send_field_metadata(Send_field *field,
285 const CHARSET_INFO *charset) = 0;
286 /**
287 Signals the client that the metadata sending is done.
288 Clears the server after sending the metadata.
289
290 @retval false Ok
291 @retval true An error occurred
292 */
293 virtual bool end_result_metadata() = 0;
294
295 /**
296 Send ok message to the client.
297
298 @param server_status The server status
299 @param statement_warn_count Total number of warnings
300 @param affected_rows Number of rows changed by statement
301 @param last_insert_id Last insert id (Auto_increment id for first
302 row if used)
303 @param message Message to send to the client
304
305 @retval false The message was successfully sent
306 @retval true An error occurred and the messages wasn't sent properly
307 */
308 virtual bool send_ok(uint server_status, uint statement_warn_count,
309 ulonglong affected_rows, ulonglong last_insert_id,
310 const char *message) = 0;
311 /**
312 Send eof message to the client.
313
314 @param server_status The server status
315 @param statement_warn_count Total number of warnings
316
317 @retval false The message was successfully sent
318 @retval true An error occurred and the messages wasn't sent properly
319 */
320 virtual bool send_eof(uint server_status, uint statement_warn_count) = 0;
321 /**
322 Send error message to the client.
323
324 @param sql_errno The error code to send
325 @param err_msg A pointer to the error message
326 @param sql_state SQL state
327
328 @retval false The message was successfully sent
329 @retval true An error occurred and the messages wasn't sent properly
330 */
331
332 virtual bool send_error(uint sql_errno, const char *err_msg,
333 const char *sql_state) = 0;
334
335 /**
336 Used for the classic protocol.
337 Makes the protocol send the messages/data to the client.
338
339 @retval false The flush was successful.
340 @retval true An error occurred.
341 */
342 virtual bool flush() = 0;
343
344 /**
345 Sends prepared statement's id and metadata to the client after prepare.
346
347 @param stmt_id Statement id.
348 @param column_count Number of columns.
349 @param param_count Number of parameters.
350 @param cond_count Number of conditions raised by the current statement.
351
352 @return Error status.
353 @retval false The send was successful.
354 @retval true An error occurred.
355 */
356 virtual bool store_ps_status(ulong stmt_id, uint column_count,
357 uint param_count, ulong cond_count) = 0;
358
359 /**
360 Sends the OUT-parameters to the client.
361
362 @param parameters List of PS/SP parameters (both input and output).
363 @param is_sql_prepare Used for the legacy protocol. If we're dealing with
364 sql prepare then text protocol will be used.
365
366 @return Error status.
367 @retval false Success.
368 @retval true Error.
369 */
370 virtual bool send_parameters(List<Item_param> *parameters,
371 bool is_sql_prepare) = 0;
372};
373
374#endif /* PROTOCOL_INCLUDED */
Definition: field.h:575
Dynamic parameters used as placeholders ('?') inside prepared statements.
Definition: item.h:4574
Definition: sql_list.h:434
Definition: protocol.h:33
bool store(uint32 from)
Definition: protocol.h:135
virtual bool flush()=0
Used for the classic protocol.
virtual bool store_field(const Field *field)=0
virtual bool store_ps_status(ulong stmt_id, uint column_count, uint param_count, ulong cond_count)=0
Sends prepared statement's id and metadata to the client after prepare.
virtual bool store_null()=0
virtual bool store_float(float from, uint32 decimals, uint32 zerofill)=0
virtual bool store_decimal(const my_decimal *, uint, uint)=0
virtual bool store_short(longlong from, uint32 zerofill)=0
virtual bool store_time(const MYSQL_TIME &time, uint precision)=0
virtual bool store_long(longlong from, uint32 zerofill)=0
bool store(longlong from)
Definition: protocol.h:136
virtual bool store_string(const char *from, size_t length, const CHARSET_INFO *fromcs)=0
virtual ~Protocol()=default
virtual bool store_datetime(const MYSQL_TIME &time, uint precision)=0
virtual bool end_result_metadata()=0
Signals the client that the metadata sending is done.
Protocol * pop_protocol()
Remove the reference to the previous protocol and return it.
Definition: protocol.h:56
bool store_long(longlong from)
Definition: protocol.h:142
bool store(ulonglong from)
Definition: protocol.h:137
virtual void abort_row()=0
virtual uint get_compression_level()=0
Returns compression level.
void push_protocol(Protocol *protocol)
Set reference to "this" as the previous protocol on the protocol provided as argument.
Definition: protocol.h:69
@ SEND_DEFAULTS
Definition: protocol.h:111
@ SEND_NUM_ROWS
Definition: protocol.h:111
@ SEND_EOF
Definition: protocol.h:111
virtual bool send_ok(uint server_status, uint statement_warn_count, ulonglong affected_rows, ulonglong last_insert_id, const char *message)=0
Send ok message to the client.
bool store_longlong(longlong from, bool unsigned_flag)
Definition: protocol.h:143
virtual char * get_compression_algorithm()=0
Returns compression algorithm name.
virtual int shutdown(bool server_shutdown=false)=0
Thread is being shut down, disconnect and free resources.
virtual int get_command(COM_DATA *com_data, enum_server_command *cmd)=0
Reads the command from the protocol and creates a command.
bool store_tiny(longlong from)
Definition: protocol.h:140
virtual void start_row()=0
Result set sending functions.
virtual bool end_row()=0
virtual bool send_error(uint sql_errno, const char *err_msg, const char *sql_state)=0
Send error message to the client.
bool store(String *str)
Definition: protocol.h:161
virtual bool get_compression()=0
Returns if the protocol is compressed or not.
Protocol * m_previous_protocol
Pointer to the Protocol below on the stack.
Definition: protocol.h:46
virtual int read_packet()=0
Read packet from client.
virtual uint get_rw_status()=0
Returns the read/writing status.
virtual bool store_double(double from, uint32 decimals, uint32 zerofill)=0
virtual enum enum_vio_type connection_type() const =0
virtual bool send_eof(uint server_status, uint statement_warn_count)=0
Send eof message to the client.
virtual bool start_result_metadata(uint num_cols, uint flags, const CHARSET_INFO *resultcs)=0
Prepares the server for metadata sending.
bool store(const char *from, const CHARSET_INFO *fromcs)
Send \0 end terminated string.
Definition: protocol.h:158
virtual bool connection_alive() const =0
Checks if the protocol's connection with the client is still alive.
virtual enum enum_protocol_type type() const =0
bool store(const LEX_STRING &s, const CHARSET_INFO *cs)
Definition: protocol.h:164
virtual bool send_field_metadata(Send_field *field, const CHARSET_INFO *charset)=0
Sends field metadata.
enum_protocol_type
Enum used by type() to specify the protocol type.
Definition: protocol.h:99
@ PROTOCOL_ERROR
Definition: protocol.h:104
@ PROTOCOL_PLUGIN
Definition: protocol.h:105
@ PROTOCOL_BINARY
Definition: protocol.h:102
@ PROTOCOL_LOCAL
Definition: protocol.h:103
@ PROTOCOL_TEXT
Definition: protocol.h:100
bool store_short(longlong from)
Definition: protocol.h:141
virtual bool send_parameters(List< Item_param > *parameters, bool is_sql_prepare)=0
Sends the OUT-parameters to the client.
virtual bool store_date(const MYSQL_TIME &time)=0
bool store(int from)
Definition: protocol.h:134
virtual bool store_tiny(longlong from, uint32 zerofill)=0
virtual bool has_client_capability(unsigned long client_capability)=0
Checks if the client capabilities include the one specified as parameter.
virtual bool store_longlong(longlong from, bool unsigned_flag, uint32 zerofill)=0
virtual void end_partial_result_set()=0
virtual ulong get_client_capabilities()=0
Returns the client capabilities stored on the protocol.
Definition: field.h:4637
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:168
my_decimal class limits 'decimal_t' type to what we need in MySQL.
Definition: my_decimal.h:94
Definition of COM_DATA to be used with the Command service as data input structure.
static int flags[50]
Definition: hp_test1.cc:40
enum_server_command
A list of all MySQL protocol commands.
Definition: my_command.h:48
unsigned long long int ulonglong
Definition: my_inttypes.h:56
long long int longlong
Definition: my_inttypes.h:55
uint32_t uint32
Definition: my_inttypes.h:67
Common definition between mysql server & client.
Time declarations shared between the server and client API: you should not add anything to this heade...
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1052
constexpr value_type zerofill
Definition: classic_protocol_constants.h:274
const std::string charset("charset")
Definition: commit_order_queue.h:34
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
Our own string classes, used pervasively throughout the executor.
Definition: m_ctype.h:385
Definition: mysql_lex_string.h:35
char * str
Definition: mysql_lex_string.h:36
size_t length
Definition: mysql_lex_string.h:37
Definition: mysql_time.h:82
unsigned int uint
Definition: uca9-dump.cc:75
Definition: com_data.h:112
Vio Lite.
enum_vio_type
Definition: violite.h:79