Skip to content

Commit 10d4fb8

Browse files
committed
MDNR:
- Refactor the command factory. Let the factory be exchangeable.
1 parent e24dc94 commit 10d4fb8

9 files changed

+1128
-1091
lines changed

ext/mysqlnd/mysqlnd.c

+12-1,057
Large diffs are not rendered by default.

ext/mysqlnd/mysqlnd_driver.c

+1
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(struct st_mysqlnd_object_
155155

156156
data->net = mysqlnd_net_init(persistent, data->stats, data->error_info);
157157
data->payload_decoder_factory = mysqlnd_protocol_payload_decoder_factory_init(data, persistent);
158+
data->command_factory = mysqlnd_command_factory_get();
158159

159160
if (!data->net || !data->payload_decoder_factory) {
160161
new_object->m->dtor(new_object);

ext/mysqlnd/mysqlnd_enum_n_def.h

+3
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@
4949
#define MYSQLND_NET_CMD_BUFFER_MIN_SIZE 4096
5050
#define MYSQLND_NET_CMD_BUFFER_MIN_SIZE_STR "4096"
5151

52+
#define MYSQLND_STMT_ID_LENGTH 4
53+
54+
5255
#define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */
5356
#define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */
5457
#define SERVER_MORE_RESULTS_EXISTS 8 /* Multi query - next query exists */

ext/mysqlnd/mysqlnd_ext_plugin.c

+24-1
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,25 @@ _mysqlnd_net_set_methods(struct st_mysqlnd_net_methods * methods)
327327
/* }}} */
328328

329329

330+
/* {{{ mysqlnd_command_factory_get */
331+
static func_mysqlnd__command_factory
332+
_mysqlnd_command_factory_get()
333+
{
334+
return mysqlnd_command_factory;
335+
}
336+
/* }}} */
337+
338+
339+
/* {{{ mysqlnd_command_factory_set */
340+
static void
341+
_mysqlnd_command_factory_set(func_mysqlnd__command_factory factory)
342+
{
343+
mysqlnd_command_factory = factory;
344+
}
345+
/* }}} */
346+
347+
348+
330349
struct st_mysqlnd_plugin_methods_xetters mysqlnd_plugin_methods_xetters =
331350
{
332351
{
@@ -363,7 +382,11 @@ struct st_mysqlnd_plugin_methods_xetters mysqlnd_plugin_methods_xetters =
363382
},
364383
{
365384
_mysqlnd_net_get_methods,
366-
_mysqlnd_net_set_methods
385+
_mysqlnd_net_set_methods,
386+
},
387+
{
388+
_mysqlnd_command_factory_get,
389+
_mysqlnd_command_factory_set,
367390
},
368391
};
369392

ext/mysqlnd/mysqlnd_ext_plugin.h

+11-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ struct st_mysqlnd_plugin_methods_xetters
6767
void (*set)(struct st_mysqlnd_conn_data_methods * methods);
6868
} connection_data;
6969

70-
struct st_mnd_result_etters
70+
struct st_mnd_result_xetters
7171
{
7272
struct st_mysqlnd_res_methods * (*get)();
7373
void (*set)(struct st_mysqlnd_res_methods * methods);
@@ -102,6 +102,12 @@ struct st_mysqlnd_plugin_methods_xetters
102102
struct st_mysqlnd_net_methods * (*get)();
103103
void (*set)(struct st_mysqlnd_net_methods * methods);
104104
} io;
105+
106+
struct st_mnd_command_factory_xetters
107+
{
108+
func_mysqlnd__command_factory (*get)();
109+
void (*set)(func_mysqlnd__command_factory factory);
110+
} command_factory;
105111
};
106112

107113
extern struct st_mysqlnd_plugin_methods_xetters mysqlnd_plugin_methods_xetters;
@@ -134,6 +140,10 @@ extern struct st_mysqlnd_plugin_methods_xetters mysqlnd_plugin_methods_xetters;
134140
#define mysqlnd_net_get_methods() mysqlnd_plugin_methods_xetters.io.get()
135141
#define mysqlnd_net_set_methods(m) mysqlnd_plugin_methods_xetters.io.set((m))
136142

143+
144+
#define mysqlnd_command_factory_get() mysqlnd_plugin_methods_xetters.command_factory.get()
145+
#define mysqlnd_command_factory_set(m) mysqlnd_plugin_methods_xetters.command_factory.set((m))
146+
137147
#endif /* MYSQLND_EXT_PLUGIN_H */
138148

139149
/*

ext/mysqlnd/mysqlnd_priv.h

+1-4
Original file line numberDiff line numberDiff line change
@@ -240,10 +240,7 @@ mysqlnd_auth_change_user(MYSQLND_CONN_DATA * const conn,
240240
size_t * switch_to_auth_protocol_data_len
241241
);
242242

243-
/* {{{ mysqlnd_get_command */
244-
struct st_mysqlnd_protocol_command *
245-
mysqlnd_get_command(enum php_mysqlnd_server_command command, ...);
246-
243+
extern func_mysqlnd__command_factory mysqlnd_command_factory;
247244

248245
#endif /* MYSQLND_PRIV_H */
249246

ext/mysqlnd/mysqlnd_ps.c

+13-20
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const
420420
{
421421
enum_func_status ret = FAIL;
422422
const MYSQLND_CSTRING query_string = {query, query_len};
423-
struct st_mysqlnd_protocol_command * command = mysqlnd_get_command(COM_STMT_PREPARE, stmt_to_prepare->conn, query_string);
423+
struct st_mysqlnd_protocol_command * command = stmt_to_prepare->conn->command_factory(COM_STMT_PREPARE, stmt_to_prepare->conn, query_string);
424424
if (command) {
425425
ret = command->run(command);
426426
command->free_command(command);
@@ -734,7 +734,7 @@ MYSQLND_METHOD(mysqlnd_stmt, send_execute)(MYSQLND_STMT * const s, enum_mysqlnd_
734734
ret = s->m->generate_execute_request(s, &request, &request_len, &free_request);
735735
if (ret == PASS) {
736736
const MYSQLND_CSTRING payload = {request, request_len};
737-
struct st_mysqlnd_protocol_command * command = mysqlnd_get_command(COM_STMT_EXECUTE, stmt->conn, payload);
737+
struct st_mysqlnd_protocol_command * command = stmt->conn->command_factory(COM_STMT_EXECUTE, stmt->conn, payload);
738738
ret = FAIL;
739739
if (command) {
740740
ret = command->run(command);
@@ -1033,16 +1033,14 @@ MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT * s)
10331033
/* }}} */
10341034

10351035

1036-
#define STMT_ID_LENGTH 4
1037-
10381036
/* {{{ mysqlnd_fetch_row_cursor */
10391037
enum_func_status
10401038
mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, unsigned int flags, zend_bool * fetched_anything)
10411039
{
10421040
enum_func_status ret;
10431041
MYSQLND_STMT * s = (MYSQLND_STMT *) param;
10441042
MYSQLND_STMT_DATA * stmt = s? s->data:NULL;
1045-
zend_uchar buf[STMT_ID_LENGTH /* statement id */ + 4 /* number of rows to fetch */];
1043+
zend_uchar buf[MYSQLND_STMT_ID_LENGTH /* statement id */ + 4 /* number of rows to fetch */];
10461044
MYSQLND_PACKET_ROW * row_packet;
10471045

10481046
DBG_ENTER("mysqlnd_fetch_stmt_row_cursor");
@@ -1069,11 +1067,11 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, unsigned int f
10691067
SET_EMPTY_ERROR(*stmt->conn->error_info);
10701068

10711069
int4store(buf, stmt->stmt_id);
1072-
int4store(buf + STMT_ID_LENGTH, 1); /* for now fetch only one row */
1070+
int4store(buf + MYSQLND_STMT_ID_LENGTH, 1); /* for now fetch only one row */
10731071

10741072
{
10751073
const MYSQLND_CSTRING payload = {buf, sizeof(buf)};
1076-
struct st_mysqlnd_protocol_command * command = mysqlnd_get_command(COM_STMT_FETCH, stmt->conn, payload);
1074+
struct st_mysqlnd_protocol_command * command = stmt->conn->command_factory(COM_STMT_FETCH, stmt->conn, payload);
10771075
ret = FAIL;
10781076
if (command) {
10791077
ret = command->run(command);
@@ -1262,7 +1260,6 @@ MYSQLND_METHOD(mysqlnd_stmt, reset)(MYSQLND_STMT * const s)
12621260
{
12631261
MYSQLND_STMT_DATA * stmt = s? s->data:NULL;
12641262
enum_func_status ret = PASS;
1265-
zend_uchar cmd_buf[STMT_ID_LENGTH /* statement id */];
12661263

12671264
DBG_ENTER("mysqlnd_stmt::reset");
12681265
if (!stmt || !stmt->conn) {
@@ -1294,11 +1291,9 @@ MYSQLND_METHOD(mysqlnd_stmt, reset)(MYSQLND_STMT * const s)
12941291
be separated before that.
12951292
*/
12961293

1297-
int4store(cmd_buf, stmt->stmt_id);
1298-
12991294
if (CONN_GET_STATE(conn) == CONN_READY) {
1300-
const MYSQLND_CSTRING payload = {cmd_buf, sizeof(cmd_buf)};
1301-
struct st_mysqlnd_protocol_command * command = mysqlnd_get_command(COM_STMT_RESET, stmt->conn, payload);
1295+
size_t stmt_id = stmt->stmt_id;
1296+
struct st_mysqlnd_protocol_command * command = stmt->conn->command_factory(COM_STMT_RESET, stmt->conn, stmt_id);
13021297
ret = FAIL;
13031298
if (command) {
13041299
ret = command->run(command);
@@ -1411,18 +1406,18 @@ MYSQLND_METHOD(mysqlnd_stmt, send_long_data)(MYSQLND_STMT * const s, unsigned in
14111406

14121407
if (CONN_GET_STATE(conn) == CONN_READY) {
14131408
size_t packet_len;
1414-
cmd_buf = mnd_emalloc(packet_len = STMT_ID_LENGTH + 2 + length);
1409+
cmd_buf = mnd_emalloc(packet_len = MYSQLND_STMT_ID_LENGTH + 2 + length);
14151410
if (cmd_buf) {
14161411
stmt->param_bind[param_no].flags |= MYSQLND_PARAM_BIND_BLOB_USED;
14171412

14181413
int4store(cmd_buf, stmt->stmt_id);
1419-
int2store(cmd_buf + STMT_ID_LENGTH, param_no);
1420-
memcpy(cmd_buf + STMT_ID_LENGTH + 2, data, length);
1414+
int2store(cmd_buf + MYSQLND_STMT_ID_LENGTH, param_no);
1415+
memcpy(cmd_buf + MYSQLND_STMT_ID_LENGTH + 2, data, length);
14211416

14221417
/* COM_STMT_SEND_LONG_DATA doesn't send an OK packet*/
14231418
{
14241419
const MYSQLND_CSTRING payload = {cmd_buf, packet_len};
1425-
struct st_mysqlnd_protocol_command * command = mysqlnd_get_command(COM_STMT_SEND_LONG_DATA, stmt->conn, payload);
1420+
struct st_mysqlnd_protocol_command * command = stmt->conn->command_factory(COM_STMT_SEND_LONG_DATA, stmt->conn, payload);
14261421
ret = FAIL;
14271422
if (command) {
14281423
ret = command->run(command);
@@ -2207,7 +2202,6 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_stmt, net_close)(MYSQLND_STMT * const s, zend_boo
22072202
{
22082203
MYSQLND_STMT_DATA * stmt = s? s->data:NULL;
22092204
MYSQLND_CONN_DATA * conn;
2210-
zend_uchar cmd_buf[STMT_ID_LENGTH /* statement id */];
22112205
enum_mysqlnd_collected_stats statistic = STAT_LAST;
22122206

22132207
DBG_ENTER("mysqlnd_stmt::net_close");
@@ -2247,11 +2241,10 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_stmt, net_close)(MYSQLND_STMT * const s, zend_boo
22472241
MYSQLND_INC_GLOBAL_STATISTIC(implicit == TRUE? STAT_FREE_RESULT_IMPLICIT:
22482242
STAT_FREE_RESULT_EXPLICIT);
22492243

2250-
int4store(cmd_buf, stmt->stmt_id);
22512244
if (CONN_GET_STATE(conn) == CONN_READY) {
22522245
enum_func_status ret = FAIL;
2253-
const MYSQLND_CSTRING payload = {cmd_buf, sizeof(cmd_buf)};
2254-
struct st_mysqlnd_protocol_command * command = mysqlnd_get_command(COM_STMT_CLOSE, conn, payload);
2246+
size_t stmt_id = stmt->stmt_id;
2247+
struct st_mysqlnd_protocol_command * command = conn->command_factory(COM_STMT_CLOSE, conn, stmt_id);
22552248
if (command) {
22562249
ret = command->run(command);
22572250
command->free_command(command);

ext/mysqlnd/mysqlnd_structs.h

+10-7
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,15 @@ struct st_mysqlnd_protocol_payload_decoder_factory
900900
};
901901

902902

903+
struct st_mysqlnd_protocol_command
904+
{
905+
enum_func_status (*run)(void *cmd);
906+
void (*free_command)(void * cmd);
907+
};
908+
909+
typedef struct st_mysqlnd_protocol_command * (*func_mysqlnd__command_factory)(enum php_mysqlnd_server_command command, ...);
910+
911+
903912
struct st_mysqlnd_connection_data
904913
{
905914
/* Operation related */
@@ -978,6 +987,7 @@ struct st_mysqlnd_connection_data
978987
zend_bool in_async_err_cb;
979988

980989
struct st_mysqlnd_object_factory_methods object_factory;
990+
func_mysqlnd__command_factory command_factory;
981991

982992
struct st_mysqlnd_conn_data_methods * m;
983993

@@ -1240,11 +1250,4 @@ struct st_mysqlnd_authentication_plugin
12401250
} methods;
12411251
};
12421252

1243-
1244-
struct st_mysqlnd_protocol_command
1245-
{
1246-
enum_func_status (*run)(void *cmd);
1247-
void (*free_command)(void * cmd);
1248-
};
1249-
12501253
#endif /* MYSQLND_STRUCTS_H */

0 commit comments

Comments
 (0)