Skip to content

Commit cfd8686

Browse files
committed
MDNR:
- removed init() method from mysqlnd_conn_data and moved the initialization to the object factory->get_connection(). Now it is unified as with the prepared statement which doesn't have any init() method - the protocol decoder factory now takes connection as parameter at creation and thus there is no need to pass the connection as parameter when calling the read or the write method of a packet. - saved the protocol payload decoder factory as pointer in every packet (read/write) so the connection doesn't need to be passed on every call of read/write (dependency has been already injected at creation). This will alow to move protocol specific code from MYSQLND_NET (send_ex()) to make MYSQLND_NET leaner and free from protocol stuff.
1 parent 75dc67c commit cfd8686

7 files changed

+121
-57
lines changed

ext/mysqlnd/mysqlnd.c

-17
Original file line numberDiff line numberDiff line change
@@ -2974,27 +2974,10 @@ MYSQLND_METHOD(mysqlnd_conn_data, local_tx_end)(MYSQLND_CONN_DATA * conn, size_t
29742974
/* }}} */
29752975

29762976

2977-
/* {{{ mysqlnd_conn_data::init */
2978-
static enum_func_status
2979-
MYSQLND_METHOD(mysqlnd_conn_data, init)(MYSQLND_CONN_DATA * conn)
2980-
{
2981-
DBG_ENTER("mysqlnd_conn_data::init");
2982-
mysqlnd_stats_init(&conn->stats, STAT_LAST, conn->persistent);
2983-
SET_ERROR_AFF_ROWS(conn);
2984-
2985-
conn->net = mysqlnd_net_init(conn->persistent, conn->stats, conn->error_info);
2986-
conn->payload_decoder_factory = mysqlnd_protocol_payload_decoder_factory_init(conn->persistent);
2987-
2988-
DBG_RETURN(conn->stats && conn->net && conn->payload_decoder_factory? PASS:FAIL);
2989-
}
2990-
/* }}} */
2991-
2992-
29932977
MYSQLND_STMT * _mysqlnd_stmt_init(MYSQLND_CONN_DATA * const conn);
29942978

29952979

29962980
MYSQLND_CLASS_METHODS_START(mysqlnd_conn_data)
2997-
MYSQLND_METHOD(mysqlnd_conn_data, init),
29982981
MYSQLND_METHOD(mysqlnd_conn_data, connect),
29992982

30002983
MYSQLND_METHOD(mysqlnd_conn_data, escape_string),

ext/mysqlnd/mysqlnd_driver.c

+12-6
Original file line numberDiff line numberDiff line change
@@ -142,17 +142,22 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(zend_bool persistent)
142142
CONN_SET_STATE(data, CONN_ALLOCED);
143143
data->m->get_reference(data);
144144

145-
if (PASS != data->m->init(data)) {
145+
data->error_info->error_list = mnd_pecalloc(1, sizeof(zend_llist), persistent);
146+
if (!data->error_info->error_list) {
146147
new_object->m->dtor(new_object);
147148
DBG_RETURN(NULL);
148149
}
150+
zend_llist_init(data->error_info->error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t)mysqlnd_error_list_pdtor, persistent);
149151

150-
data->error_info->error_list = mnd_pecalloc(1, sizeof(zend_llist), persistent);
151-
if (!data->error_info->error_list) {
152+
mysqlnd_stats_init(&data->stats, STAT_LAST, persistent);
153+
SET_ERROR_AFF_ROWS(data);
154+
155+
data->net = mysqlnd_net_init(persistent, data->stats, data->error_info);
156+
data->payload_decoder_factory = mysqlnd_protocol_payload_decoder_factory_init(data, persistent);
157+
158+
if (!data->net || !data->payload_decoder_factory) {
152159
new_object->m->dtor(new_object);
153160
DBG_RETURN(NULL);
154-
} else {
155-
zend_llist_init(data->error_info->error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t)mysqlnd_error_list_pdtor, persistent);
156161
}
157162

158163
DBG_RETURN(new_object);
@@ -284,7 +289,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_io_channel)(zend_bool persistent, MYS
284289

285290
/* {{{ mysqlnd_object_factory::get_protocol_payload_decoder_factory */
286291
static MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY *
287-
MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_payload_decoder_factory)(zend_bool persistent)
292+
MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_payload_decoder_factory)(MYSQLND_CONN_DATA * conn, zend_bool persistent)
288293
{
289294
size_t alloc_size = sizeof(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY) + mysqlnd_plugin_count() * sizeof(void *);
290295
MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY *ret = mnd_pecalloc(1, alloc_size, persistent);
@@ -293,6 +298,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_payload_decoder_factory)(zen
293298
DBG_INF_FMT("persistent=%u", persistent);
294299
if (ret) {
295300
ret->persistent = persistent;
301+
ret->conn = conn;
296302
ret->m = MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_protocol_payload_decoder_factory);
297303
}
298304

ext/mysqlnd/mysqlnd_ext_plugin.c

+15
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,21 @@ PHPAPI void ** _mysqlnd_plugin_get_plugin_net_data(const MYSQLND_NET * net, unsi
148148
/* }}} */
149149

150150

151+
/* {{{ mysqlnd_conn_get_methods */
152+
PHPAPI struct st_mysqlnd_object_factory_methods *
153+
mysqlnd_object_factory_get_methods()
154+
{
155+
return &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory);
156+
}
157+
/* }}} */
158+
159+
/* {{{ mysqlnd_conn_set_methods */
160+
PHPAPI void mysqlnd_object_factory_set_methods(struct st_mysqlnd_object_factory_methods *methods)
161+
{
162+
MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_object_factory) = *methods;
163+
}
164+
/* }}} */
165+
151166

152167
/* {{{ mysqlnd_conn_get_methods */
153168
PHPAPI struct st_mysqlnd_conn_methods *

ext/mysqlnd/mysqlnd_ext_plugin.h

+3
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ PHPAPI void ** _mysqlnd_plugin_get_plugin_net_data(const MYSQLND_NET * net, unsi
5050
#define mysqlnd_plugin_get_plugin_net_data(n, p_id) _mysqlnd_plugin_get_plugin_net_data((n), (p_id))
5151

5252

53+
PHPAPI struct st_mysqlnd_object_factory_methods * mysqlnd_object_factory_get_methods();
54+
PHPAPI void mysqlnd_object_factory_set_methods(struct st_mysqlnd_object_factory_methods * methods);
55+
5356
PHPAPI struct st_mysqlnd_conn_methods * mysqlnd_conn_get_methods();
5457
PHPAPI void mysqlnd_conn_set_methods(struct st_mysqlnd_conn_methods * methods);
5558

ext/mysqlnd/mysqlnd_structs.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ struct st_mysqlnd_packet_auth_pam;
357357
struct st_mysqlnd_packet_sha256_pk_request;
358358
struct st_mysqlnd_packet_sha256_pk_request_response;
359359

360+
typedef MYSQLND_CONN_DATA * (*func_mysqlnd_protocol_payload_decoder_factory__get_mysqlnd_conn_data)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory);
360361
typedef struct st_mysqlnd_packet_greet * (*func_mysqlnd_protocol_payload_decoder_factory__get_greet_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent);
361362
typedef struct st_mysqlnd_packet_auth * (*func_mysqlnd_protocol_payload_decoder_factory__get_auth_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent);
362363
typedef struct st_mysqlnd_packet_auth_response *(*func_mysqlnd_protocol_payload_decoder_factory__get_auth_response_packet)(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const factory, zend_bool persistent);
@@ -375,6 +376,7 @@ typedef struct st_mysqlnd_packet_sha256_pk_request_response *(*func_mysqlnd_prot
375376

376377
struct st_mysqlnd_protocol_payload_decoder_factory_methods
377378
{
379+
func_mysqlnd_protocol_payload_decoder_factory__get_mysqlnd_conn_data get_mysqlnd_conn_data;
378380
func_mysqlnd_protocol_payload_decoder_factory__get_greet_packet get_greet_packet;
379381
func_mysqlnd_protocol_payload_decoder_factory__get_auth_packet get_auth_packet;
380382
func_mysqlnd_protocol_payload_decoder_factory__get_auth_response_packet get_auth_response_packet;
@@ -401,7 +403,7 @@ typedef MYSQLND * (*func_mysqlnd_object_factory__get_connection)(zend_bool persi
401403
typedef MYSQLND * (*func_mysqlnd_object_factory__clone_connection_object)(MYSQLND * conn);
402404
typedef MYSQLND_STMT * (*func_mysqlnd_object_factory__get_prepared_statement)(MYSQLND_CONN_DATA * conn);
403405
typedef MYSQLND_NET * (*func_mysqlnd_object_factory__get_io_channel)(zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
404-
typedef MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * (*func_mysqlnd_object_factory__get_protocol_payload_decoder_factory)(zend_bool persistent);
406+
typedef MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * (*func_mysqlnd_object_factory__get_protocol_payload_decoder_factory)(MYSQLND_CONN_DATA * conn, zend_bool persistent);
405407

406408

407409
struct st_mysqlnd_object_factory_methods
@@ -414,7 +416,6 @@ struct st_mysqlnd_object_factory_methods
414416
};
415417

416418

417-
typedef enum_func_status (*func_mysqlnd_conn_data__init)(MYSQLND_CONN_DATA * conn);
418419
typedef enum_func_status (*func_mysqlnd_conn_data__connect)(MYSQLND_CONN_DATA * conn, const char * host, const char * user, const char * passwd, unsigned int passwd_len, const char * db, unsigned int db_len, unsigned int port, const char * socket_or_pipe, unsigned int mysql_flags);
419420
typedef zend_ulong (*func_mysqlnd_conn_data__escape_string)(MYSQLND_CONN_DATA * const conn, char *newstr, const char *escapestr, size_t escapestr_len);
420421
typedef enum_func_status (*func_mysqlnd_conn_data__set_charset)(MYSQLND_CONN_DATA * const conn, const char * const charset);
@@ -510,7 +511,6 @@ typedef unsigned int (*func_mysqlnd_conn_data__get_client_api_capabilities)(con
510511

511512
struct st_mysqlnd_conn_data_methods
512513
{
513-
func_mysqlnd_conn_data__init init;
514514
func_mysqlnd_conn_data__connect connect;
515515
func_mysqlnd_conn_data__escape_string escape_string;
516516
func_mysqlnd_conn_data__set_charset set_charset;
@@ -894,6 +894,7 @@ struct st_mysqlnd_net
894894

895895
struct st_mysqlnd_protocol_payload_decoder_factory
896896
{
897+
MYSQLND_CONN_DATA * conn;
897898
zend_bool persistent;
898899
struct st_mysqlnd_protocol_payload_decoder_factory_methods m;
899900
};

0 commit comments

Comments
 (0)