Skip to content

Commit e30e884

Browse files
committed
MNDR:
- move COM_INIT_DE result handling to the command
1 parent fefc304 commit e30e884

File tree

3 files changed

+26
-25
lines changed

3 files changed

+26
-25
lines changed

ext/mysqlnd/mysqlnd.c

+6-23
Original file line numberDiff line numberDiff line change
@@ -284,9 +284,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, free_contents)(MYSQLND_CONN_DATA * conn)
284284
mnd_pefree(conn->passwd, pers);
285285
conn->passwd = NULL;
286286
}
287-
if (conn->connect_or_select_db) {
288-
mnd_pefree(conn->connect_or_select_db, pers);
289-
conn->connect_or_select_db = NULL;
287+
if (conn->connect_or_select_db.s) {
288+
mnd_pefree(conn->connect_or_select_db.s, pers);
289+
conn->connect_or_select_db.s = NULL;
290290
}
291291
if (conn->unix_socket) {
292292
mnd_pefree(conn->unix_socket, pers);
@@ -925,10 +925,10 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
925925
conn->passwd = mnd_pestrndup(passwd, passwd_len, conn->persistent);
926926
conn->passwd_len = passwd_len;
927927
conn->port = port;
928-
conn->connect_or_select_db = mnd_pestrndup(db, db_len, conn->persistent);
929-
conn->connect_or_select_db_len = db_len;
928+
conn->connect_or_select_db.s = mnd_pestrndup(db, db_len, conn->persistent);
929+
conn->connect_or_select_db.l = db_len;
930930

931-
if (!conn->user || !conn->passwd || !conn->connect_or_select_db) {
931+
if (!conn->user || !conn->passwd || !conn->connect_or_select_db.s) {
932932
SET_OOM_ERROR(conn->error_info);
933933
goto err; /* OOM */
934934
}
@@ -1538,23 +1538,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, select_db)(MYSQLND_CONN_DATA * const conn, con
15381538
command->free_command(command);
15391539
}
15401540

1541-
/*
1542-
The server sends 0 but libmysql doesn't read it and has established
1543-
a protocol of giving back -1. Thus we have to follow it :(
1544-
*/
1545-
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
1546-
if (ret == PASS) {
1547-
if (conn->connect_or_select_db) {
1548-
mnd_pefree(conn->connect_or_select_db, conn->persistent);
1549-
}
1550-
conn->connect_or_select_db = mnd_pestrndup(db, db_len, conn->persistent);
1551-
conn->connect_or_select_db_len = db_len;
1552-
if (!conn->connect_or_select_db) {
1553-
/* OOM */
1554-
SET_OOM_ERROR(conn->error_info);
1555-
ret = FAIL;
1556-
}
1557-
}
15581541
conn->m->local_tx_end(conn, this_func, ret);
15591542
}
15601543
DBG_RETURN(ret);

ext/mysqlnd/mysqlnd_structs.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -985,8 +985,7 @@ struct st_mysqlnd_connection_data
985985
size_t auth_plugin_data_len;
986986
const MYSQLND_CHARSET *charset;
987987
const MYSQLND_CHARSET *greet_charset;
988-
char *connect_or_select_db;
989-
unsigned int connect_or_select_db_len;
988+
MYSQLND_STRING connect_or_select_db;
990989
MYSQLND_INFILE infile;
991990
unsigned int protocol_version;
992991
zend_ulong max_packet_size;

ext/mysqlnd/mysqlnd_wireprotocol.c

+19
Original file line numberDiff line numberDiff line change
@@ -3020,6 +3020,7 @@ mysqlnd_com_init_db_run(void *cmd)
30203020
struct st_mysqlnd_protocol_com_init_db_command * command = (struct st_mysqlnd_protocol_com_init_db_command *) cmd;
30213021
enum_func_status ret = FAIL;
30223022
MYSQLND_CONN_DATA * conn = command->context.conn;
3023+
const MYSQLND_CSTRING db = command->context.db;
30233024

30243025
DBG_ENTER("mysqlnd_com_init_db_run");
30253026

@@ -3036,6 +3037,24 @@ mysqlnd_com_init_db_run(void *cmd)
30363037
conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent);
30373038
}
30383039

3040+
/*
3041+
The server sends 0 but libmysql doesn't read it and has established
3042+
a protocol of giving back -1. Thus we have to follow it :(
3043+
*/
3044+
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
3045+
if (ret == PASS) {
3046+
if (conn->connect_or_select_db.s) {
3047+
mnd_pefree(conn->connect_or_select_db.s, conn->persistent);
3048+
}
3049+
conn->connect_or_select_db.s = mnd_pestrndup(db.s, db.l, conn->persistent);
3050+
conn->connect_or_select_db.l = db.l;
3051+
if (!conn->connect_or_select_db.s) {
3052+
/* OOM */
3053+
SET_OOM_ERROR(conn->error_info);
3054+
ret = FAIL;
3055+
}
3056+
}
3057+
30393058
DBG_RETURN(ret);
30403059
}
30413060
/* }}} */

0 commit comments

Comments
 (0)