Skip to content

Commit e9f3139

Browse files
committed
MNDR:
- split MYSQLND_NET into MYSQLND_NET and MYSQLND_VIO MYSQLND_NET is above MYSQLND_VIO. _NET takes care of protocol packet counting (even with compressed), while VIO is just about the network (or in case of windows, non-network, but PIPE) transport.
1 parent a990573 commit e9f3139

12 files changed

+537
-260
lines changed

Diff for: ext/mysqlnd/mysqlnd.c

+23-11
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,10 @@ MYSQLND_METHOD(mysqlnd_conn_data, free_contents)(MYSQLND_CONN_DATA * conn)
270270
conn->net->data->m.free_contents(conn->net);
271271
}
272272

273+
if (conn->vio) {
274+
conn->vio->data->m.free_contents(conn->vio);
275+
}
276+
273277
DBG_INF("Freeing memory of members");
274278

275279
if (conn->host) {
@@ -341,6 +345,11 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_conn_data, dtor)(MYSQLND_CONN_DATA * conn)
341345
conn->net = NULL;
342346
}
343347

348+
if (conn->vio) {
349+
mysqlnd_vio_free(conn->vio, conn->stats, conn->error_info);
350+
conn->vio = NULL;
351+
}
352+
344353
if (conn->payload_decoder_factory) {
345354
mysqlnd_protocol_payload_decoder_factory_free(conn->payload_decoder_factory);
346355
conn->payload_decoder_factory = NULL;
@@ -655,6 +664,7 @@ static unsigned int
655664
MYSQLND_METHOD(mysqlnd_conn_data, get_updated_connect_flags)(MYSQLND_CONN_DATA * conn, unsigned int mysql_flags)
656665
{
657666
MYSQLND_NET * net = conn->net;
667+
MYSQLND_VIO * vio = conn->vio;
658668

659669
DBG_ENTER("mysqlnd_conn_data::get_updated_connect_flags");
660670
/* we allow load data local infile by default */
@@ -680,8 +690,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, get_updated_connect_flags)(MYSQLND_CONN_DATA *
680690
mysql_flags &= ~CLIENT_SSL;
681691
}
682692
#else
683-
if (net && (net->data->options.ssl_key || net->data->options.ssl_cert ||
684-
net->data->options.ssl_ca || net->data->options.ssl_capath || net->data->options.ssl_cipher))
693+
if (vio && (vio->data->options.ssl_key || vio->data->options.ssl_cert ||
694+
vio->data->options.ssl_ca || vio->data->options.ssl_capath || vio->data->options.ssl_cipher))
685695
{
686696
mysql_flags |= CLIENT_SSL;
687697
}
@@ -705,9 +715,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect_handshake)(MYSQLND_CONN_DATA * conn,
705715
size_t client_flags = mysql_flags;
706716
DBG_ENTER("mysqlnd_conn_data::connect_handshake");
707717

708-
if (FAIL == conn->net->data->m.connect_ex(conn->net, *scheme, conn->persistent, conn->stats, conn->error_info)) {
718+
if (FAIL == conn->vio->data->m.connect(conn->vio, *scheme, conn->persistent, conn->stats, conn->error_info)) {
709719
DBG_RETURN(FAIL);
710-
} else {
720+
} else if (PASS == conn->net->data->m.connect(conn->net, *scheme, conn->persistent, conn->stats, conn->error_info)) {
711721
struct st_mysqlnd_protocol_command * command = conn->command_factory(COM_HANDSHAKE, conn, username, password, database, client_flags);
712722
if (command) {
713723
ret = command->run(command);
@@ -1203,7 +1213,7 @@ static int mysqlnd_stream_array_to_fd_set(MYSQLND ** conn_array, fd_set * fds, p
12031213
* when casting. It is only used here so that the buffered data warning
12041214
* is not displayed.
12051215
* */
1206-
stream = (*p)->data->net->data->m.get_stream((*p)->data->net);
1216+
stream = (*p)->data->vio->data->m.get_stream((*p)->data->vio);
12071217
DBG_INF_FMT("conn=%llu stream=%p", (*p)->data->thread_id, stream);
12081218
if (stream != NULL && SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL,
12091219
(void*)&this_fd, 1) && ZEND_VALID_SOCKET(this_fd)) {
@@ -1233,7 +1243,7 @@ static int mysqlnd_stream_array_from_fd_set(MYSQLND ** conn_array, fd_set * fds)
12331243
DBG_ENTER("mysqlnd_stream_array_from_fd_set");
12341244

12351245
while (*fwd) {
1236-
stream = (*fwd)->data->net->data->m.get_stream((*fwd)->data->net);
1246+
stream = (*fwd)->data->vio->data->m.get_stream((*fwd)->data->vio);
12371247
DBG_INF_FMT("conn=%llu stream=%p", (*fwd)->data->thread_id, stream);
12381248
if (stream != NULL && SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL,
12391249
(void*)&this_fd, 1) && ZEND_VALID_SOCKET(this_fd)) {
@@ -1426,7 +1436,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, ssl_set)(MYSQLND_CONN_DATA * const conn, const
14261436
{
14271437
const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), ssl_set);
14281438
enum_func_status ret = FAIL;
1429-
MYSQLND_NET * net = conn->net;
1439+
MYSQLND_VIO * net = conn->vio;
14301440
DBG_ENTER("mysqlnd_conn_data::ssl_set");
14311441

14321442
if (PASS == conn->m->local_tx_start(conn, this_func)) {
@@ -1677,8 +1687,8 @@ static enum_func_status
16771687
MYSQLND_METHOD(mysqlnd_conn_data, send_close)(MYSQLND_CONN_DATA * const conn)
16781688
{
16791689
enum_func_status ret = PASS;
1680-
MYSQLND_NET * net = conn->net;
1681-
php_stream * net_stream = net->data->m.get_stream(net);
1690+
MYSQLND_VIO * vio = conn->vio;
1691+
php_stream * net_stream = vio->data->m.get_stream(vio);
16821692
enum mysqlnd_connection_state state;
16831693

16841694
DBG_ENTER("mysqlnd_send_close");
@@ -1702,7 +1712,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, send_close)(MYSQLND_CONN_DATA * const conn)
17021712
ret = command->run(command);
17031713
command->free_command(command);
17041714
}
1705-
net->data->m.close_stream(net, conn->stats, conn->error_info);
1715+
vio->data->m.close_stream(vio, conn->stats, conn->error_info);
17061716
}
17071717
SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT);
17081718
break;
@@ -1732,7 +1742,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, send_close)(MYSQLND_CONN_DATA * const conn)
17321742
/* Fall-through */
17331743
case CONN_QUIT_SENT:
17341744
/* The user has killed its own connection */
1735-
net->data->m.close_stream(net, conn->stats, conn->error_info);
1745+
vio->data->m.close_stream(vio, conn->stats, conn->error_info);
17361746
break;
17371747
}
17381748

@@ -2104,6 +2114,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c
21042114
case MYSQL_OPT_CONNECT_TIMEOUT:
21052115
case MYSQLND_OPT_NET_CMD_BUFFER_SIZE:
21062116
case MYSQLND_OPT_NET_READ_BUFFER_SIZE:
2117+
ret = conn->vio->data->m.set_client_option(conn->vio, option, value);
2118+
break;
21072119
case MYSQL_SERVER_PUBLIC_KEY:
21082120
ret = conn->net->data->m.set_client_option(conn->net, option, value);
21092121
break;

Diff for: ext/mysqlnd/mysqlnd_auth.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ mysqlnd_native_auth_get_auth_data(struct st_mysqlnd_authentication_plugin * self
360360
MYSQLND_CONN_DATA * conn, const char * const user, const char * const passwd,
361361
const size_t passwd_len, zend_uchar * auth_plugin_data, size_t auth_plugin_data_len,
362362
const MYSQLND_SESSION_OPTIONS * const session_options,
363-
const MYSQLND_IO_OPTIONS * const io_options,
363+
const MYSQLND_NET_OPTIONS * const io_options,
364364
zend_ulong mysql_flags
365365
)
366366
{
@@ -420,7 +420,7 @@ mysqlnd_pam_auth_get_auth_data(struct st_mysqlnd_authentication_plugin * self,
420420
MYSQLND_CONN_DATA * conn, const char * const user, const char * const passwd,
421421
const size_t passwd_len, zend_uchar * auth_plugin_data, size_t auth_plugin_data_len,
422422
const MYSQLND_SESSION_OPTIONS * const session_options,
423-
const MYSQLND_IO_OPTIONS * const io_options,
423+
const MYSQLND_NET_OPTIONS * const io_options,
424424
zend_ulong mysql_flags
425425
)
426426
{
@@ -481,7 +481,7 @@ mysqlnd_xor_string(char * dst, const size_t dst_len, const char * xor_str, const
481481
static RSA *
482482
mysqlnd_sha256_get_rsa_key(MYSQLND_CONN_DATA * conn,
483483
const MYSQLND_SESSION_OPTIONS * const session_options,
484-
const MYSQLND_IO_OPTIONS * const io_options
484+
const MYSQLND_NET_OPTIONS * const io_options
485485
)
486486
{
487487
RSA * ret = NULL;
@@ -570,7 +570,7 @@ mysqlnd_sha256_auth_get_auth_data(struct st_mysqlnd_authentication_plugin * self
570570
MYSQLND_CONN_DATA * conn, const char * const user, const char * const passwd,
571571
const size_t passwd_len, zend_uchar * auth_plugin_data, size_t auth_plugin_data_len,
572572
const MYSQLND_SESSION_OPTIONS * const session_options,
573-
const MYSQLND_IO_OPTIONS * const io_options,
573+
const MYSQLND_NET_OPTIONS * const io_options,
574574
zend_ulong mysql_flags
575575
)
576576
{

Diff for: ext/mysqlnd/mysqlnd_driver.c

+42-5
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(struct st_mysqlnd_object_
140140
mysqlnd_stats_init(&data->stats, STAT_LAST, persistent);
141141

142142
data->net = mysqlnd_net_init(persistent, data->stats, data->error_info);
143+
data->vio = mysqlnd_vio_init(persistent, data->stats, data->error_info);
143144
data->payload_decoder_factory = mysqlnd_protocol_payload_decoder_factory_init(data, persistent);
144145
data->command_factory = mysqlnd_command_factory_get();
145146

@@ -241,16 +242,16 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement)(MYSQLND_CONN_DATA
241242
/* }}} */
242243

243244

244-
/* {{{ mysqlnd_object_factory::get_io_channel */
245-
PHPAPI MYSQLND_NET *
246-
MYSQLND_METHOD(mysqlnd_object_factory, get_io_channel)(zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
245+
/* {{{ mysqlnd_object_factory::get_net */
246+
static MYSQLND_NET *
247+
MYSQLND_METHOD(mysqlnd_object_factory, get_net)(zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
247248
{
248249
size_t net_alloc_size = sizeof(MYSQLND_NET) + mysqlnd_plugin_count() * sizeof(void *);
249250
size_t net_data_alloc_size = sizeof(MYSQLND_NET_DATA) + mysqlnd_plugin_count() * sizeof(void *);
250251
MYSQLND_NET * net = mnd_pecalloc(1, net_alloc_size, persistent);
251252
MYSQLND_NET_DATA * net_data = mnd_pecalloc(1, net_data_alloc_size, persistent);
252253

253-
DBG_ENTER("mysqlnd_object_factory::get_io_channel");
254+
DBG_ENTER("mysqlnd_object_factory::get_net");
254255
DBG_INF_FMT("persistent=%u", persistent);
255256
if (net && net_data) {
256257
net->data = net_data;
@@ -276,6 +277,41 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_io_channel)(zend_bool persistent, MYS
276277
/* }}} */
277278

278279

280+
/* {{{ mysqlnd_object_factory::get_vio */
281+
static MYSQLND_VIO *
282+
MYSQLND_METHOD(mysqlnd_object_factory, get_vio)(zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
283+
{
284+
size_t vio_alloc_size = sizeof(MYSQLND_VIO) + mysqlnd_plugin_count() * sizeof(void *);
285+
size_t vio_data_alloc_size = sizeof(MYSQLND_VIO_DATA) + mysqlnd_plugin_count() * sizeof(void *);
286+
MYSQLND_VIO * vio = mnd_pecalloc(1, vio_alloc_size, persistent);
287+
MYSQLND_VIO_DATA * vio_data = mnd_pecalloc(1, vio_data_alloc_size, persistent);
288+
289+
DBG_ENTER("mysqlnd_object_factory::get_vio");
290+
DBG_INF_FMT("persistent=%u", persistent);
291+
if (vio && vio_data) {
292+
vio->data = vio_data;
293+
vio->persistent = vio->data->persistent = persistent;
294+
vio->data->m = *mysqlnd_vio_get_methods();
295+
296+
if (PASS != vio->data->m.init(vio, stats, error_info)) {
297+
vio->data->m.dtor(vio, stats, error_info);
298+
vio = NULL;
299+
}
300+
} else {
301+
if (vio_data) {
302+
mnd_pefree(vio_data, persistent);
303+
vio_data = NULL;
304+
}
305+
if (vio) {
306+
mnd_pefree(vio, persistent);
307+
vio = NULL;
308+
}
309+
}
310+
DBG_RETURN(vio);
311+
}
312+
/* }}} */
313+
314+
279315
/* {{{ mysqlnd_object_factory::get_protocol_payload_decoder_factory */
280316
static MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY *
281317
MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_payload_decoder_factory)(MYSQLND_CONN_DATA * conn, zend_bool persistent)
@@ -300,7 +336,8 @@ PHPAPI MYSQLND_CLASS_METHODS_START(mysqlnd_object_factory)
300336
MYSQLND_METHOD(mysqlnd_object_factory, get_connection),
301337
MYSQLND_METHOD(mysqlnd_object_factory, clone_connection_object),
302338
MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement),
303-
MYSQLND_METHOD(mysqlnd_object_factory, get_io_channel),
339+
MYSQLND_METHOD(mysqlnd_object_factory, get_net),
340+
MYSQLND_METHOD(mysqlnd_object_factory, get_vio),
304341
MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_payload_decoder_factory)
305342
MYSQLND_CLASS_METHODS_END;
306343

Diff for: ext/mysqlnd/mysqlnd_ext_plugin.c

+22
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,24 @@ _mysqlnd_net_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_net) * methods)
327327
/* }}} */
328328

329329

330+
/* {{{ _mysqlnd_vio_get_methods */
331+
static MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio) *
332+
_mysqlnd_vio_get_methods()
333+
{
334+
return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_vio);
335+
}
336+
/* }}} */
337+
338+
339+
/* {{{ _mysqlnd_vio_set_methods */
340+
static void
341+
_mysqlnd_vio_set_methods(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio) * methods)
342+
{
343+
MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_vio) = *methods;
344+
}
345+
/* }}} */
346+
347+
330348
/* {{{ mysqlnd_command_factory_get */
331349
static func_mysqlnd__command_factory
332350
_mysqlnd_command_factory_get()
@@ -401,6 +419,10 @@ struct st_mysqlnd_plugin_methods_xetters mysqlnd_plugin_methods_xetters =
401419
_mysqlnd_net_get_methods,
402420
_mysqlnd_net_set_methods,
403421
},
422+
{
423+
_mysqlnd_vio_get_methods,
424+
_mysqlnd_vio_set_methods,
425+
},
404426
{
405427
_mysqlnd_error_info_get_methods,
406428
_mysqlnd_error_info_set_methods,

Diff for: ext/mysqlnd/mysqlnd_ext_plugin.h

+12-4
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,17 @@ struct st_mysqlnd_plugin_methods_xetters
9797
void (*set)(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_payload_decoder_factory) *methods);
9898
} protocol;
9999

100-
struct st_mnd_io_xetters
100+
struct st_mnd_net_xetters
101101
{
102102
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_net) * (*get)();
103103
void (*set)(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_net) * methods);
104-
} io;
104+
} net;
105+
106+
struct st_mnd_vio_xetters
107+
{
108+
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio) * (*get)();
109+
void (*set)(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio) * methods);
110+
} vio;
105111

106112
struct st_mnd_error_info_xetters
107113
{
@@ -143,9 +149,11 @@ extern struct st_mysqlnd_plugin_methods_xetters mysqlnd_plugin_methods_xetters;
143149
#define mysqlnd_protocol_get_methods() mysqlnd_plugin_methods_xetters.protocol.get()
144150
#define mysqlnd_protocol_set_methods(m) mysqlnd_plugin_methods_xetters.protocol.set((m))
145151

146-
#define mysqlnd_net_get_methods() mysqlnd_plugin_methods_xetters.io.get()
147-
#define mysqlnd_net_set_methods(m) mysqlnd_plugin_methods_xetters.io.set((m))
152+
#define mysqlnd_net_get_methods() mysqlnd_plugin_methods_xetters.net.get()
153+
#define mysqlnd_net_set_methods(m) mysqlnd_plugin_methods_xetters.net.set((m))
148154

155+
#define mysqlnd_vio_get_methods() mysqlnd_plugin_methods_xetters.vio.get()
156+
#define mysqlnd_vio_set_methods(m) mysqlnd_plugin_methods_xetters.vio.set((m))
149157

150158
#define mysqlnd_command_factory_get() mysqlnd_plugin_methods_xetters.command_factory.get()
151159
#define mysqlnd_command_factory_set(m) mysqlnd_plugin_methods_xetters.command_factory.set((m))

Diff for: ext/mysqlnd/mysqlnd_loaddata.c

+5-4
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,14 @@ mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char * const filenam
152152
size_t ret;
153153
MYSQLND_INFILE infile;
154154
MYSQLND_NET * net = conn->net;
155+
MYSQLND_VIO * vio = conn->vio;
155156

156157
DBG_ENTER("mysqlnd_handle_local_infile");
157158

158159
if (!(conn->options->flags & CLIENT_LOCAL_FILES)) {
159160
php_error_docref(NULL, E_WARNING, "LOAD DATA LOCAL INFILE forbidden");
160161
/* write empty packet to server */
161-
ret = net->data->m.send_ex(net, empty_packet, 0, conn->stats, conn->error_info);
162+
ret = net->data->m.send(net, vio, empty_packet, 0, conn->stats, conn->error_info);
162163
*is_warning = TRUE;
163164
goto infile_error;
164165
}
@@ -178,21 +179,21 @@ mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char * const filenam
178179
tmp_error_no = infile.local_infile_error(info, tmp_buf, sizeof(tmp_buf));
179180
SET_CLIENT_ERROR(conn->error_info, tmp_error_no, UNKNOWN_SQLSTATE, tmp_buf);
180181
/* write empty packet to server */
181-
ret = net->data->m.send_ex(net, empty_packet, 0, conn->stats, conn->error_info);
182+
ret = net->data->m.send(net, vio, empty_packet, 0, conn->stats, conn->error_info);
182183
goto infile_error;
183184
}
184185

185186
/* read data */
186187
while ((bufsize = infile.local_infile_read (info, buf + MYSQLND_HEADER_SIZE, buflen - MYSQLND_HEADER_SIZE)) > 0) {
187-
if ((ret = net->data->m.send_ex(net, buf, bufsize, conn->stats, conn->error_info)) == 0) {
188+
if ((ret = net->data->m.send(net, vio, buf, bufsize, conn->stats, conn->error_info)) == 0) {
188189
DBG_ERR_FMT("Error during read : %d %s %s", CR_SERVER_LOST, UNKNOWN_SQLSTATE, lost_conn);
189190
SET_CLIENT_ERROR(conn->error_info, CR_SERVER_LOST, UNKNOWN_SQLSTATE, lost_conn);
190191
goto infile_error;
191192
}
192193
}
193194

194195
/* send empty packet for eof */
195-
if ((ret = net->data->m.send_ex(net, empty_packet, 0, conn->stats, conn->error_info)) == 0) {
196+
if ((ret = net->data->m.send(net, vio, empty_packet, 0, conn->stats, conn->error_info)) == 0) {
196197
SET_CLIENT_ERROR(conn->error_info, CR_SERVER_LOST, UNKNOWN_SQLSTATE, lost_conn);
197198
goto infile_error;
198199
}

0 commit comments

Comments
 (0)