MySQL 9.0.0
Source Code Documentation
mysql_async.h
Go to the documentation of this file.
1/* Copyright (c) 2019, 2024, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is designed to work with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24#ifndef MYSQL_ASYNC_INCLUDED
25#define MYSQL_ASYNC_INCLUDED
26
27#include <mysql.h>
28
29/**
30 @file mysql_async.h
31
32 Declarations for asynchronous client communication.
33
34 @note this file should not be included as part of packaging.
35*/
36
37/**
38 This enum is to represent different asynchronous operations like reading the
39 network, writing to network, idle state, or complete state.
40*/
42 NET_ASYNC_OP_IDLE = 0, /**< default state */
43 NET_ASYNC_OP_READING, /**< used by my_net_read calls */
44 NET_ASYNC_OP_WRITING, /**< used by my_net_write calls */
45 NET_ASYNC_OP_COMPLETE /**< network read or write is complete */
46};
47
48/** Reading a packet is a multi-step process, so we have a state machine. */
50 NET_ASYNC_PACKET_READ_IDLE = 0, /**< default packet read state */
51 NET_ASYNC_PACKET_READ_HEADER, /**< read packet header */
52 NET_ASYNC_PACKET_READ_BODY, /**< read packet contents */
53 NET_ASYNC_PACKET_READ_COMPLETE /**< state to define if packet is
54 completely read */
55};
56
57/** Different states when reading a query result. */
59 NET_ASYNC_READ_QUERY_RESULT_IDLE = 0, /**< default state */
60 NET_ASYNC_READ_QUERY_RESULT_FIELD_COUNT, /**< read Ok or read field
61 count sent as part of
62 COM_QUERY */
63 NET_ASYNC_READ_QUERY_RESULT_FIELD_INFO /**< read result of above
64 COM_* command */
65};
66
67/** Sending a command involves the write as well as reading the status. */
69 NET_ASYNC_SEND_COMMAND_IDLE = 0, /**< default send command state */
70 NET_ASYNC_SEND_COMMAND_WRITE_COMMAND, /**< send COM_* command */
71 NET_ASYNC_SEND_COMMAND_READ_STATUS /**< read result of above COM_*
72 command */
73};
74
75/**
76 Async operations are broadly classified into 3 phases:
77 Connection phase, phase of sending data to server (which is writing phase)
78 and reading data from server (which is reading phase). Below enum describes
79 the same
80*/
85};
86
87/**
88 Represents the packet to be sent on wire asynchronously.
89*/
90struct io_vec {
91 void *iov_base; /**< Starting address */
92 size_t iov_len; /**< Number of bytes to transfer */
93};
94
95typedef struct NET_ASYNC {
96 /**
97 The position in buff we continue reads from when data is next
98 available
99 */
100 unsigned char *cur_pos;
101 /** Blocking state */
103 /** Our current operation */
105 /** How many bytes we want to read */
107 /**
108 Simple state to know if we're reading the first row, and
109 command/query statuses.
110 */
114
115 /** State when waiting on an async read */
117 /** Size of the packet we're currently reading */
119
120 /**
121 Headers and vector for our async writes; see net_serv.c for
122 detailed description.
123 */
124 unsigned char *async_write_headers;
128
129 /**
130 If the packet length is less than MAX_PACKET_LENGTH then use a static array
131 to hold the meta packet header. The array either holds the usual packet
132 header or a compressed meta packet header as following. The compressed
133 meta packet header is followwed by usual compresses packet heder that is
134 7 bytes in length.
135
136
137 Packet
138
139 Header
140 ~~~~~~~~~~~~~~~~~~~
141 B1 B2 B3 : Packet length
142 B4 : Packet number
143 ~~~~~~~~~~~~~~~~~~~
144
145 Payload
146 ~~~~~~~~~~~~~~~~~~~
147 B5 : COM_COMMAND
148 ~~~~~~~~~~~~~~~~~~~
149
150 Compressed Packet
151
152 Header
153 ~~~~~~~~~~~~~~~~~~~
154 B1 B2 B3 : Compress packet length
155 B4 : Compress Packet Nunmber
156 00 00 00 : Indicates following payload is uncompressed
157 ~~~~~~~~~~~~~~~~~~~
158
159 Payload
160 ~~~~~~~~~~~~~~~~~~~
161 B8 B9 B10 : Packet size
162 B11 : Packet number
163 B12 : COM_COMMAND
164 ~~~~~~~~~~~~~~~~~~~
165 */
167 NET_HEADER_SIZE + 1];
169
170 /** Keep track of compressed buffers */
172 /** Size of the compressed buffer */
175
179};
180
182void net_extension_free(NET *);
183
184#define NET_EXTENSION_PTR(N) \
185 ((NET_EXTENSION *)((N)->extension ? (N)->extension : NULL))
186
187#define NET_ASYNC_DATA(M) \
188 ((NET_EXTENSION_PTR(M)) ? (NET_EXTENSION_PTR(M)->net_async_context) : NULL)
189
190/**
191 Asynchronous operations are broadly classified into 2 categories.
192 1. Connection
193 2. Query execution
194 This classification is defined in below enum
195*/
201
202/**
203 Query execution in an asynchronous fashion is broadly divided into 3 states
204 which is described in below enum
205*/
211
212typedef struct MYSQL_ASYNC {
213 /** Buffer storing the rows result for cli_read_rows_nonblocking */
215 /** a pointer to keep track of the previous row of the current result row */
217 /** Context needed to track the state of a connection being established */
219 /** Status of the current async op */
221 /** Size of the current running async query */
223 /** If a query is running, this is its state */
225 /** context needed to support metadata read operation */
230 /** a pointer to keep track of the result sets */
232
233 /** the query parameters data */
235 /** the query parameters data length */
236 unsigned long async_qp_data_length;
237
239
241 const unsigned char *packet,
242 size_t len, bool *res);
244 NET *net, unsigned char command, const unsigned char *prefix,
245 size_t prefix_len, const unsigned char *packet, size_t packet_len,
246 bool *res);
247enum net_async_status my_net_read_nonblocking(NET *net, unsigned long *len_ptr);
248
250
251#endif /* MYSQL_ASYNC_INCLUDED */
#define COMP_HEADER_SIZE
compression header extra size
Definition: mysql_com.h:1123
#define NET_HEADER_SIZE
standard header size
Definition: mysql_com.h:1122
unsigned char uchar
Definition: my_inttypes.h:52
This file defines the client API to MySQL and also the ABI of the dynamically linked libmysqlclient.
NET_EXTENSION * net_extension_init()
Definition: net_serv.cc:100
struct MYSQL_ASYNC MYSQL_ASYNC
int mysql_get_socket_descriptor(MYSQL *mysql)
Definition: client.cc:4770
net_read_query_result_status
Different states when reading a query result.
Definition: mysql_async.h:58
@ NET_ASYNC_READ_QUERY_RESULT_FIELD_COUNT
read Ok or read field count sent as part of COM_QUERY
Definition: mysql_async.h:60
@ NET_ASYNC_READ_QUERY_RESULT_IDLE
default state
Definition: mysql_async.h:59
@ NET_ASYNC_READ_QUERY_RESULT_FIELD_INFO
read result of above COM_* command
Definition: mysql_async.h:63
void net_extension_free(NET *)
Definition: net_serv.cc:109
enum net_async_status net_write_command_nonblocking(NET *net, unsigned char command, const unsigned char *prefix, size_t prefix_len, const unsigned char *packet, size_t packet_len, bool *res)
Send a command to the server in asynchronous way.
Definition: net_serv.cc:787
net_async_read_packet_state
Reading a packet is a multi-step process, so we have a state machine.
Definition: mysql_async.h:49
@ NET_ASYNC_PACKET_READ_COMPLETE
state to define if packet is completely read
Definition: mysql_async.h:53
@ NET_ASYNC_PACKET_READ_BODY
read packet contents
Definition: mysql_async.h:52
@ NET_ASYNC_PACKET_READ_IDLE
default packet read state
Definition: mysql_async.h:50
@ NET_ASYNC_PACKET_READ_HEADER
read packet header
Definition: mysql_async.h:51
enum net_async_status my_net_read_nonblocking(NET *net, unsigned long *len_ptr)
net_async_block_state
Async operations are broadly classified into 3 phases: Connection phase, phase of sending data to ser...
Definition: mysql_async.h:81
@ NET_NONBLOCKING_READ
Definition: mysql_async.h:83
@ NET_NONBLOCKING_WRITE
Definition: mysql_async.h:84
@ NET_NONBLOCKING_CONNECT
Definition: mysql_async.h:82
net_send_command_status
Sending a command involves the write as well as reading the status.
Definition: mysql_async.h:68
@ NET_ASYNC_SEND_COMMAND_IDLE
default send command state
Definition: mysql_async.h:69
@ NET_ASYNC_SEND_COMMAND_READ_STATUS
read result of above COM_* command
Definition: mysql_async.h:71
@ NET_ASYNC_SEND_COMMAND_WRITE_COMMAND
send COM_* command
Definition: mysql_async.h:70
struct NET_ASYNC NET_ASYNC
mysql_async_query_state_enum
Query execution in an asynchronous fashion is broadly divided into 3 states which is described in bel...
Definition: mysql_async.h:206
@ QUERY_READING_RESULT
Definition: mysql_async.h:209
@ QUERY_IDLE
Definition: mysql_async.h:207
@ QUERY_SENDING
Definition: mysql_async.h:208
mysql_async_operation_status
Asynchronous operations are broadly classified into 2 categories.
Definition: mysql_async.h:196
@ ASYNC_OP_CONNECT
Definition: mysql_async.h:198
@ ASYNC_OP_UNSET
Definition: mysql_async.h:197
@ ASYNC_OP_QUERY
Definition: mysql_async.h:199
enum net_async_status my_net_write_nonblocking(NET *net, const unsigned char *packet, size_t len, bool *res)
Definition: net_serv.cc:839
net_async_operation
This enum is to represent different asynchronous operations like reading the network,...
Definition: mysql_async.h:41
@ NET_ASYNC_OP_IDLE
default state
Definition: mysql_async.h:42
@ NET_ASYNC_OP_READING
used by my_net_read calls
Definition: mysql_async.h:43
@ NET_ASYNC_OP_WRITING
used by my_net_write calls
Definition: mysql_async.h:44
@ NET_ASYNC_OP_COMPLETE
network read or write is complete
Definition: mysql_async.h:45
Definition: instrumented_condition_variable.h:32
Definition: buffer.h:45
net_async_status
Definition: plugin_auth_common.h:136
Definition: mysql_async.h:212
MYSQL_ROWS ** prev_row_ptr
a pointer to keep track of the previous row of the current result row
Definition: mysql_async.h:216
enum mysql_async_query_state_enum async_query_state
If a query is running, this is its state.
Definition: mysql_async.h:224
unsigned int async_read_metadata_cur_field
Definition: mysql_async.h:229
MYSQL_FIELD * async_read_metadata_fields
Definition: mysql_async.h:227
struct mysql_async_connect * connect_context
Context needed to track the state of a connection being established.
Definition: mysql_async.h:218
MYSQL_ROWS async_read_metadata_data
Definition: mysql_async.h:228
struct MYSQL_RES * async_store_result_result
a pointer to keep track of the result sets
Definition: mysql_async.h:231
unsigned long async_qp_data_length
the query parameters data length
Definition: mysql_async.h:236
size_t async_query_length
Size of the current running async query.
Definition: mysql_async.h:222
MYSQL_DATA * rows_result_buffer
Buffer storing the rows result for cli_read_rows_nonblocking.
Definition: mysql_async.h:214
unsigned long * async_read_metadata_field_len
context needed to support metadata read operation
Definition: mysql_async.h:226
uchar * async_qp_data
the query parameters data
Definition: mysql_async.h:234
enum mysql_async_operation_status async_op_status
Status of the current async op.
Definition: mysql_async.h:220
Definition: mysql.h:163
Definition: mysql.h:121
Definition: mysql.h:340
Definition: mysql.h:153
Definition: mysql.h:300
Definition: mysql_async.h:95
struct io_vec * async_write_vector
Definition: mysql_async.h:125
enum net_async_operation async_operation
Our current operation.
Definition: mysql_async.h:104
size_t async_write_vector_size
Definition: mysql_async.h:126
unsigned char inline_async_write_header[NET_HEADER_SIZE+COMP_HEADER_SIZE+NET_HEADER_SIZE+1]
If the packet length is less than MAX_PACKET_LENGTH then use a static array to hold the meta packet h...
Definition: mysql_async.h:167
enum net_async_block_state async_blocking_state
Blocking state.
Definition: mysql_async.h:102
struct io_vec inline_async_write_vector[3]
Definition: mysql_async.h:168
bool read_rows_is_first_read
Simple state to know if we're reading the first row, and command/query statuses.
Definition: mysql_async.h:111
enum net_send_command_status async_send_command_status
Definition: mysql_async.h:112
size_t async_packet_length
Size of the packet we're currently reading.
Definition: mysql_async.h:118
size_t async_bytes_wanted
How many bytes we want to read.
Definition: mysql_async.h:106
unsigned char * cur_pos
The position in buff we continue reads from when data is next available.
Definition: mysql_async.h:100
unsigned char * async_write_headers
Headers and vector for our async writes; see net_serv.c for detailed description.
Definition: mysql_async.h:124
unsigned char ** compressed_write_buffers
Keep track of compressed buffers.
Definition: mysql_async.h:171
size_t compressed_buffers_size
Size of the compressed buffer.
Definition: mysql_async.h:173
enum net_async_read_packet_state async_packet_read_state
State when waiting on an async read.
Definition: mysql_async.h:116
size_t async_write_vector_current
Definition: mysql_async.h:127
enum net_read_query_result_status async_read_query_result_status
Definition: mysql_async.h:113
Definition: mysql_async.h:176
mysql_compress_context compress_ctx
Definition: mysql_async.h:178
NET_ASYNC * net_async_context
Definition: mysql_async.h:177
Definition: mysql_com.h:914
Represents the packet to be sent on wire asynchronously.
Definition: mysql_async.h:90
size_t iov_len
Number of bytes to transfer.
Definition: mysql_async.h:92
void * iov_base
Starting address.
Definition: mysql_async.h:91
Definition: client_async_authentication.h:164
Compression context information.
Definition: my_compress.h:74
command
Definition: version_token.cc:280