Skip to content

Commit 5609eab

Browse files
committed
MDNR:
- make MYSQLND_UPSERT_STATUS more like an object that a simple structure Still use macros to make updates simple
1 parent 092afe7 commit 5609eab

8 files changed

+203
-62
lines changed

ext/mysqlnd/mysqlnd.c

+62-18
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,42 @@ PHPAPI const char * const mysqlnd_out_of_memory = "Out of memory";
4444
PHPAPI MYSQLND_STATS *mysqlnd_global_stats = NULL;
4545

4646

47+
/* {{{ mysqlnd_upsert_status::reset */
48+
void
49+
MYSQLND_METHOD(mysqlnd_upsert_status, reset)(MYSQLND_UPSERT_STATUS * const upsert_status)
50+
{
51+
upsert_status->warning_count = 0;
52+
upsert_status->server_status = 0;
53+
upsert_status->affected_rows = 0;
54+
upsert_status->last_insert_id = 0;
55+
}
56+
/* }}} */
57+
58+
59+
/* {{{ mysqlnd_upsert_status::set_affected_rows_to_error */
60+
void
61+
MYSQLND_METHOD(mysqlnd_upsert_status, set_affected_rows_to_error)(MYSQLND_UPSERT_STATUS * upsert_status)
62+
{
63+
upsert_status->affected_rows = (uint64_t) ~0;
64+
}
65+
/* }}} */
66+
67+
68+
MYSQLND_CLASS_METHODS_START(mysqlnd_upsert_status)
69+
MYSQLND_METHOD(mysqlnd_upsert_status, reset),
70+
MYSQLND_METHOD(mysqlnd_upsert_status, set_affected_rows_to_error),
71+
MYSQLND_CLASS_METHODS_END;
72+
73+
74+
/* {{{ mysqlnd_upsert_status_init */
75+
void
76+
mysqlnd_upsert_status_init(MYSQLND_UPSERT_STATUS * const upsert_status)
77+
{
78+
upsert_status->m = &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_upsert_status);
79+
}
80+
/* }}} */
81+
82+
4783
/* {{{ mysqlnd_conn_data::free_options */
4884
static void
4985
MYSQLND_METHOD(mysqlnd_conn_data, free_options)(MYSQLND_CONN_DATA * conn)
@@ -190,9 +226,12 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_conn_data, dtor)(MYSQLND_CONN_DATA * conn)
190226

191227
/* {{{ mysqlnd_conn_data::send_command_handle_response */
192228
static enum_func_status
193-
MYSQLND_METHOD(mysqlnd_conn_data, send_command_handle_response)(MYSQLND_CONN_DATA * conn, enum mysqlnd_packet_type ok_packet,
194-
zend_bool silent, enum php_mysqlnd_server_command command,
195-
zend_bool ignore_upsert_status)
229+
MYSQLND_METHOD(mysqlnd_conn_data, send_command_handle_response)(
230+
MYSQLND_CONN_DATA * const conn,
231+
const enum mysqlnd_packet_type ok_packet,
232+
const zend_bool silent,
233+
const enum php_mysqlnd_server_command command,
234+
const zend_bool ignore_upsert_status)
196235
{
197236
enum_func_status ret = FAIL;
198237

@@ -228,14 +267,14 @@ MYSQLND_METHOD(mysqlnd_conn_data, send_command_handle_response)(MYSQLND_CONN_DAT
228267
safe to unconditionally turn off the flag here.
229268
*/
230269
conn->upsert_status->server_status &= ~SERVER_MORE_RESULTS_EXISTS;
231-
SET_ERROR_AFF_ROWS(conn);
270+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
232271
} else {
233272
SET_NEW_MESSAGE(conn->last_message, conn->last_message_len,
234273
ok_response->message, ok_response->message_len,
235274
conn->persistent);
236275

237276
if (!ignore_upsert_status) {
238-
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
277+
UPSERT_STATUS_RESET(conn->upsert_status);
239278
conn->upsert_status->warning_count = ok_response->warning_count;
240279
conn->upsert_status->server_status = ok_response->server_status;
241280
conn->upsert_status->affected_rows = ok_response->affected_rows;
@@ -263,7 +302,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, send_command_handle_response)(MYSQLND_CONN_DAT
263302
} else if (0xFF == ok_response->field_count) {
264303
/* The server signalled error. Set the error */
265304
SET_CLIENT_ERROR(*conn->error_info, ok_response->error_no, ok_response->sqlstate, ok_response->error);
266-
SET_ERROR_AFF_ROWS(conn);
305+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
267306
} else if (0xFE != ok_response->field_count) {
268307
SET_CLIENT_ERROR(*conn->error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE, "Malformed packet");
269308
if (!silent) {
@@ -288,10 +327,14 @@ MYSQLND_METHOD(mysqlnd_conn_data, send_command_handle_response)(MYSQLND_CONN_DAT
288327
/* }}} */
289328

290329

291-
/* {{{ mysqlnd_conn_data::simple_command_send_request */
330+
/* {{{ mysqlnd_conn_data::send_command_do_request */
292331
static enum_func_status
293-
MYSQLND_METHOD(mysqlnd_conn_data, send_command_do_request)(MYSQLND_CONN_DATA * conn, enum php_mysqlnd_server_command command,
294-
const zend_uchar * const arg, size_t arg_len, zend_bool silent, zend_bool ignore_upsert_status)
332+
MYSQLND_METHOD(mysqlnd_conn_data, send_command_do_request)(
333+
MYSQLND_CONN_DATA * const conn,
334+
const enum php_mysqlnd_server_command command,
335+
const zend_uchar * const arg, const size_t arg_len,
336+
const zend_bool silent,
337+
const zend_bool ignore_upsert_status)
295338
{
296339
enum_func_status ret = PASS;
297340
MYSQLND_PACKET_COMMAND * cmd_packet;
@@ -314,7 +357,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, send_command_do_request)(MYSQLND_CONN_DATA * c
314357
DBG_RETURN(FAIL);
315358
}
316359

317-
SET_ERROR_AFF_ROWS(conn);
360+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
318361
SET_EMPTY_ERROR(*conn->error_info);
319362

320363
cmd_packet = conn->payload_decoder_factory->m.get_command_packet(conn->payload_decoder_factory, FALSE);
@@ -747,7 +790,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect_handshake)(MYSQLND_CONN_DATA * conn,
747790
{
748791
goto err;
749792
}
750-
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
793+
794+
UPSERT_STATUS_RESET(conn->upsert_status);
751795
conn->upsert_status->warning_count = 0;
752796
conn->upsert_status->server_status = greet_packet->server_status;
753797
conn->upsert_status->affected_rows = 0;
@@ -791,7 +835,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
791835
local_tx_started = TRUE;
792836

793837
SET_EMPTY_ERROR(*conn->error_info);
794-
SET_ERROR_AFF_ROWS(conn);
838+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
795839

796840
DBG_INF_FMT("host=%s user=%s db=%s port=%u flags=%u persistent=%u state=%u",
797841
host?host:"", user?user:"", db?db:"", port, mysql_flags,
@@ -1595,7 +1639,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, select_db)(MYSQLND_CONN_DATA * const conn, con
15951639
The server sends 0 but libmysql doesn't read it and has established
15961640
a protocol of giving back -1. Thus we have to follow it :(
15971641
*/
1598-
SET_ERROR_AFF_ROWS(conn);
1642+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
15991643
if (ret == PASS) {
16001644
if (conn->connect_or_select_db) {
16011645
mnd_pefree(conn->connect_or_select_db, conn->persistent);
@@ -1635,7 +1679,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, ping)(MYSQLND_CONN_DATA * const conn)
16351679
The server sends 0 but libmysql doesn't read it and has established
16361680
a protocol of giving back -1. Thus we have to follow it :(
16371681
*/
1638-
SET_ERROR_AFF_ROWS(conn);
1682+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
16391683

16401684
conn->m->local_tx_end(conn, this_func, ret);
16411685
}
@@ -1711,7 +1755,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, kill)(MYSQLND_CONN_DATA * conn, unsigned int p
17111755
The server sends 0 but libmysql doesn't read it and has established
17121756
a protocol of giving back -1. Thus we have to follow it :(
17131757
*/
1714-
SET_ERROR_AFF_ROWS(conn);
1758+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
17151759
} else if (PASS == ret) {
17161760
CONN_SET_STATE(conn, CONN_QUIT_SENT);
17171761
conn->m->send_close(conn);
@@ -2095,7 +2139,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, next_result)(MYSQLND_CONN_DATA * const conn)
20952139
}
20962140

20972141
SET_EMPTY_ERROR(*conn->error_info);
2098-
SET_ERROR_AFF_ROWS(conn);
2142+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
20992143
/*
21002144
We are sure that there is a result set, since conn->state is set accordingly
21012145
in mysqlnd_store_result() or mysqlnd_fetch_row_unbuffered()
@@ -2202,7 +2246,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, change_user)(MYSQLND_CONN_DATA * const conn,
22022246
}
22032247

22042248
SET_EMPTY_ERROR(*conn->error_info);
2205-
SET_ERROR_AFF_ROWS(conn);
2249+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
22062250

22072251
if (!user) {
22082252
user = "";
@@ -2961,7 +3005,7 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_conn_data)
29613005
MYSQLND_METHOD_PRIVATE(mysqlnd_conn_data, get_state),
29623006
MYSQLND_METHOD_PRIVATE(mysqlnd_conn_data, set_state),
29633007

2964-
MYSQLND_METHOD(mysqlnd_conn_data, send_command_do_request),
3008+
// MYSQLND_METHOD(mysqlnd_conn_data, send_command_do_request),
29653009
MYSQLND_METHOD(mysqlnd_conn_data, send_command_handle_response),
29663010
MYSQLND_METHOD(mysqlnd_conn_data, restart_psession),
29673011
MYSQLND_METHOD(mysqlnd_conn_data, end_psession),

ext/mysqlnd/mysqlnd_auth.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ mysqlnd_auth_change_user(MYSQLND_CONN_DATA * const conn,
289289
mnd_pefree(conn->last_message, conn->persistent);
290290
conn->last_message = NULL;
291291
}
292-
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
292+
UPSERT_STATUS_RESET(conn->upsert_status);
293293
/* set charset for old servers */
294294
if (conn->m->get_server_version(conn) < 50123) {
295295
ret = conn->m->set_charset(conn, old_cs->name);

ext/mysqlnd/mysqlnd_driver.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,10 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(struct st_mysqlnd_object_
135135

136136
data->error_info = &(data->error_info_impl);
137137
data->options = &(data->options_impl);
138+
139+
mysqlnd_upsert_status_init(&data->upsert_status_impl);
138140
data->upsert_status = &(data->upsert_status_impl);
141+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(data->upsert_status);
139142

140143
data->persistent = persistent;
141144
data->m = mysqlnd_conn_data_get_methods();
@@ -151,7 +154,6 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(struct st_mysqlnd_object_
151154
zend_llist_init(data->error_info->error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t)mysqlnd_error_list_pdtor, persistent);
152155

153156
mysqlnd_stats_init(&data->stats, STAT_LAST, persistent);
154-
SET_ERROR_AFF_ROWS(data);
155157

156158
data->net = mysqlnd_net_init(persistent, data->stats, data->error_info);
157159
data->payload_decoder_factory = mysqlnd_protocol_payload_decoder_factory_init(data, persistent);
@@ -219,6 +221,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement)(MYSQLND_CONN_DATA
219221
}
220222
stmt->persistent = persistent;
221223
stmt->error_info = &(stmt->error_info_impl);
224+
mysqlnd_upsert_status_init(&stmt->upsert_status_impl);
222225
stmt->upsert_status = &(stmt->upsert_status_impl);
223226
stmt->state = MYSQLND_STMT_INITTED;
224227
stmt->execute_cmd_buffer.length = 4096;

ext/mysqlnd/mysqlnd_priv.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,10 @@
7676

7777
#define MAX_CHARSET_LEN 32
7878

79+
void mysqlnd_upsert_status_init(MYSQLND_UPSERT_STATUS * const upsert_status);
7980

80-
#define SET_ERROR_AFF_ROWS(s) (s)->upsert_status->affected_rows = (uint64_t) ~0
81+
#define UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(status) (status)->m->set_affected_rows_to_error((status))
82+
#define UPSERT_STATUS_RESET(status) (status)->m->reset((status))
8183

8284
/* Error handling */
8385
#define SET_NEW_MESSAGE(buf, buf_len, message, len, persistent) \
@@ -181,6 +183,7 @@ PHPAPI extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_result_unbuffered)
181183
PHPAPI extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_result_buffered);
182184
PHPAPI extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_protocol_payload_decoder_factory);
183185
PHPAPI extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_net);
186+
PHPAPI extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_upsert_status);
184187

185188
enum_func_status mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char * filename, zend_bool * is_warning);
186189

ext/mysqlnd/mysqlnd_ps.c

+15-10
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,11 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s)
358358
if (stmt->result) {
359359
stmt->result->m.free_result_contents(stmt->result);
360360
mnd_efree(stmt->result);
361+
/* XXX: This will crash, because we will null also the methods.
362+
But seems it happens in extreme cases or doesn't. Should be fixed by exporting a function
363+
(from mysqlnd_driver.c?) to do the reset.
364+
This is done also in mysqlnd_result.c
365+
*/
361366
memset(stmt, 0, sizeof(MYSQLND_STMT_DATA));
362367
stmt->state = MYSQLND_STMT_INITTED;
363368
}
@@ -389,8 +394,8 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const
389394
DBG_INF_FMT("stmt=%lu", stmt->stmt_id);
390395
DBG_INF_FMT("query=%s", query);
391396

392-
SET_ERROR_AFF_ROWS(stmt);
393-
SET_ERROR_AFF_ROWS(stmt->conn);
397+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(stmt->upsert_status);
398+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(stmt->conn->upsert_status);
394399

395400
SET_EMPTY_ERROR(*stmt->error_info);
396401
SET_EMPTY_ERROR(*stmt->conn->error_info);
@@ -516,7 +521,7 @@ mysqlnd_stmt_execute_parse_response(MYSQLND_STMT * const s, enum_mysqlnd_parse_e
516521
ret = stmt->conn->m->query_read_result_set_header(stmt->conn, s);
517522
if (ret == FAIL) {
518523
COPY_CLIENT_ERROR(*stmt->error_info, *conn->error_info);
519-
memset(stmt->upsert_status, 0, sizeof(*stmt->upsert_status));
524+
UPSERT_STATUS_RESET(stmt->upsert_status);
520525
stmt->upsert_status->affected_rows = conn->upsert_status->affected_rows;
521526
if (CONN_GET_STATE(conn) == CONN_QUIT_SENT) {
522527
/* close the statement here, the connection has been closed */
@@ -650,8 +655,8 @@ MYSQLND_METHOD(mysqlnd_stmt, send_execute)(MYSQLND_STMT * const s, enum_mysqlnd_
650655
conn = stmt->conn;
651656
DBG_INF_FMT("stmt=%lu", stmt->stmt_id);
652657

653-
SET_ERROR_AFF_ROWS(stmt);
654-
SET_ERROR_AFF_ROWS(stmt->conn);
658+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(stmt->upsert_status);
659+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(stmt->conn->upsert_status);
655660

656661
if (stmt->result && stmt->state >= MYSQLND_STMT_PREPARED && stmt->field_count) {
657662
/*
@@ -733,7 +738,7 @@ MYSQLND_METHOD(mysqlnd_stmt, send_execute)(MYSQLND_STMT * const s, enum_mysqlnd_
733738
}
734739
ret = s->m->generate_execute_request(s, &request, &request_len, &free_request);
735740
if (ret == PASS) {
736-
const MYSQLND_CSTRING payload = {request, request_len};
741+
const MYSQLND_CSTRING payload = {(const char*) request, request_len};
737742
struct st_mysqlnd_protocol_command * command = stmt->conn->command_factory(COM_STMT_EXECUTE, stmt->conn, payload);
738743
ret = FAIL;
739744
if (command) {
@@ -970,7 +975,7 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, unsigned i
970975
DBG_INF("EOF");
971976
/* Mark the connection as usable again */
972977
result->unbuf->eof_reached = TRUE;
973-
memset(result->conn->upsert_status, 0, sizeof(*result->conn->upsert_status));
978+
UPSERT_STATUS_RESET(result->conn->upsert_status);
974979
result->conn->upsert_status->warning_count = row_packet->warning_count;
975980
result->conn->upsert_status->server_status = row_packet->server_status;
976981
/*
@@ -1070,7 +1075,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, unsigned int f
10701075
int4store(buf + MYSQLND_STMT_ID_LENGTH, 1); /* for now fetch only one row */
10711076

10721077
{
1073-
const MYSQLND_CSTRING payload = {buf, sizeof(buf)};
1078+
const MYSQLND_CSTRING payload = {(const char*) buf, sizeof(buf)};
10741079
struct st_mysqlnd_protocol_command * command = stmt->conn->command_factory(COM_STMT_FETCH, stmt->conn, payload);
10751080
ret = FAIL;
10761081
if (command) {
@@ -1096,7 +1101,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, unsigned int f
10961101

10971102
row_packet->skip_extraction = stmt->result_bind? FALSE:TRUE;
10981103

1099-
memset(stmt->upsert_status, 0, sizeof(*stmt->upsert_status));
1104+
UPSERT_STATUS_RESET(stmt->upsert_status);
11001105
if (PASS == (ret = PACKET_READ(row_packet, result->conn)) && !row_packet->eof) {
11011106
const MYSQLND_RES_METADATA * const meta = result->meta;
11021107
unsigned int i, field_count = result->field_count;
@@ -1416,7 +1421,7 @@ MYSQLND_METHOD(mysqlnd_stmt, send_long_data)(MYSQLND_STMT * const s, unsigned in
14161421

14171422
/* COM_STMT_SEND_LONG_DATA doesn't send an OK packet*/
14181423
{
1419-
const MYSQLND_CSTRING payload = {cmd_buf, packet_len};
1424+
const MYSQLND_CSTRING payload = {(const char *) cmd_buf, packet_len};
14201425
struct st_mysqlnd_protocol_command * command = stmt->conn->command_factory(COM_STMT_SEND_LONG_DATA, stmt->conn, payload);
14211426
ret = FAIL;
14221427
if (command) {

ext/mysqlnd/mysqlnd_result.c

+14-7
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s)
418418
break;
419419
}
420420

421-
SET_ERROR_AFF_ROWS(conn);
421+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
422422

423423
if (FAIL == (ret = PACKET_READ(rset_header, conn))) {
424424
php_error_docref(NULL, E_WARNING, "Error reading result set's header");
@@ -465,7 +465,7 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s)
465465
DBG_INF("UPSERT");
466466
conn->last_query_type = QUERY_UPSERT;
467467
conn->field_count = rset_header->field_count;
468-
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
468+
UPSERT_STATUS_RESET(conn->upsert_status);
469469
conn->upsert_status->warning_count = rset_header->warning_count;
470470
conn->upsert_status->server_status = rset_header->server_status;
471471
conn->upsert_status->affected_rows = rset_header->affected_rows;
@@ -490,9 +490,9 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s)
490490
SET_EMPTY_MESSAGE(conn->last_message, conn->last_message_len, conn->persistent);
491491

492492
MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_RSET_QUERY);
493-
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
493+
UPSERT_STATUS_RESET(conn->upsert_status);
494494
/* restore after zeroing */
495-
SET_ERROR_AFF_ROWS(conn);
495+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
496496

497497
conn->last_query_type = QUERY_SELECT;
498498
CONN_SET_STATE(conn, CONN_FETCHING_DATA);
@@ -556,6 +556,11 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s)
556556
conn->current_result = NULL;
557557
} else {
558558
stmt->result = NULL;
559+
/* XXX: This will crash, because we will null also the methods.
560+
But seems it happens in extreme cases or doesn't. Should be fixed by exporting a function
561+
(from mysqlnd_driver.c?) to do the reset.
562+
This is done also in mysqlnd_ps.c
563+
*/
559564
memset(stmt, 0, sizeof(*stmt));
560565
stmt->state = MYSQLND_STMT_INITTED;
561566
}
@@ -772,7 +777,8 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row_c)(MYSQLND_RES * result, voi
772777
/* Mark the connection as usable again */
773778
DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status);
774779
result->unbuf->eof_reached = TRUE;
775-
memset(result->conn->upsert_status, 0, sizeof(*result->conn->upsert_status));
780+
781+
UPSERT_STATUS_RESET(result->conn->upsert_status);
776782
result->conn->upsert_status->warning_count = row_packet->warning_count;
777783
result->conn->upsert_status->server_status = row_packet->server_status;
778784
/*
@@ -898,7 +904,8 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void
898904
/* Mark the connection as usable again */
899905
DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status);
900906
result->unbuf->eof_reached = TRUE;
901-
memset(result->conn->upsert_status, 0, sizeof(*result->conn->upsert_status));
907+
908+
UPSERT_STATUS_RESET(result->conn->upsert_status);
902909
result->conn->upsert_status->warning_count = row_packet->warning_count;
903910
result->conn->upsert_status->server_status = row_packet->server_status;
904911
/*
@@ -1354,7 +1361,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c
13541361

13551362
/* Finally clean */
13561363
if (row_packet->eof) {
1357-
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
1364+
UPSERT_STATUS_RESET(conn->upsert_status);
13581365
conn->upsert_status->warning_count = row_packet->warning_count;
13591366
conn->upsert_status->server_status = row_packet->server_status;
13601367
}

0 commit comments

Comments
 (0)