]> granicus.if.org Git - php/commitdiff
MNDR:
authorAndrey Hristov <andrey@php.net>
Mon, 2 Nov 2015 15:35:59 +0000 (16:35 +0100)
committerAndrey Hristov <andrey@php.net>
Thu, 12 Nov 2015 15:19:16 +0000 (16:19 +0100)
- move COM_INIT_DE result handling to the command

ext/mysqlnd/mysqlnd.c
ext/mysqlnd/mysqlnd_structs.h
ext/mysqlnd/mysqlnd_wireprotocol.c

index 3fb0d36a133a12c5622b2b27b3980a9c0fb4c7fc..f37d5139a973bd84c184e6ca27fbed9d3447e6d0 100644 (file)
@@ -284,9 +284,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, free_contents)(MYSQLND_CONN_DATA * conn)
                mnd_pefree(conn->passwd, pers);
                conn->passwd = NULL;
        }
-       if (conn->connect_or_select_db) {
-               mnd_pefree(conn->connect_or_select_db, pers);
-               conn->connect_or_select_db = NULL;
+       if (conn->connect_or_select_db.s) {
+               mnd_pefree(conn->connect_or_select_db.s, pers);
+               conn->connect_or_select_db.s = NULL;
        }
        if (conn->unix_socket) {
                mnd_pefree(conn->unix_socket, pers);
@@ -925,10 +925,10 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
                conn->passwd                    = mnd_pestrndup(passwd, passwd_len, conn->persistent);
                conn->passwd_len                = passwd_len;
                conn->port                              = port;
-               conn->connect_or_select_db = mnd_pestrndup(db, db_len, conn->persistent);
-               conn->connect_or_select_db_len = db_len;
+               conn->connect_or_select_db.s = mnd_pestrndup(db, db_len, conn->persistent);
+               conn->connect_or_select_db.l = db_len;
 
-               if (!conn->user || !conn->passwd || !conn->connect_or_select_db) {
+               if (!conn->user || !conn->passwd || !conn->connect_or_select_db.s) {
                        SET_OOM_ERROR(conn->error_info);
                        goto err; /* OOM */
                }
@@ -1538,23 +1538,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, select_db)(MYSQLND_CONN_DATA * const conn, con
                        command->free_command(command);
                }
 
-               /*
-                 The server sends 0 but libmysql doesn't read it and has established
-                 a protocol of giving back -1. Thus we have to follow it :(
-               */
-               UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
-               if (ret == PASS) {
-                       if (conn->connect_or_select_db) {
-                               mnd_pefree(conn->connect_or_select_db, conn->persistent);
-                       }
-                       conn->connect_or_select_db = mnd_pestrndup(db, db_len, conn->persistent);
-                       conn->connect_or_select_db_len = db_len;
-                       if (!conn->connect_or_select_db) {
-                               /* OOM */
-                               SET_OOM_ERROR(conn->error_info);
-                               ret = FAIL;
-                       }
-               }
                conn->m->local_tx_end(conn, this_func, ret);
        }
        DBG_RETURN(ret);
index 8c15a7b885c0fe26bd2af5174462d965210fc963..468e11b973e49b3e630ed26380dd86a45e0f0638 100644 (file)
@@ -985,8 +985,7 @@ struct st_mysqlnd_connection_data
        size_t                  auth_plugin_data_len;
        const MYSQLND_CHARSET *charset;
        const MYSQLND_CHARSET *greet_charset;
-       char                    *connect_or_select_db;
-       unsigned int    connect_or_select_db_len;
+       MYSQLND_STRING  connect_or_select_db;
        MYSQLND_INFILE  infile;
        unsigned int    protocol_version;
        zend_ulong              max_packet_size;
index 975239011f62667ee1fb6e09e1203f823aae3513..8cfbec3c14a6e2c4c270891d155735d64be006fa 100644 (file)
@@ -3020,6 +3020,7 @@ mysqlnd_com_init_db_run(void *cmd)
        struct st_mysqlnd_protocol_com_init_db_command * command = (struct st_mysqlnd_protocol_com_init_db_command *) cmd;
        enum_func_status ret = FAIL;
        MYSQLND_CONN_DATA * conn = command->context.conn;
+       const MYSQLND_CSTRING db = command->context.db;
 
        DBG_ENTER("mysqlnd_com_init_db_run");
 
@@ -3036,6 +3037,24 @@ mysqlnd_com_init_db_run(void *cmd)
                                                                                   conn->error_info, conn->upsert_status, conn->payload_decoder_factory, &conn->last_message, conn->persistent);
        }
 
+       /*
+         The server sends 0 but libmysql doesn't read it and has established
+         a protocol of giving back -1. Thus we have to follow it :(
+       */
+       UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
+       if (ret == PASS) {
+               if (conn->connect_or_select_db.s) {
+                       mnd_pefree(conn->connect_or_select_db.s, conn->persistent);
+               }
+               conn->connect_or_select_db.s = mnd_pestrndup(db.s, db.l, conn->persistent);
+               conn->connect_or_select_db.l = db.l;
+               if (!conn->connect_or_select_db.s) {
+                       /* OOM */
+                       SET_OOM_ERROR(conn->error_info);
+                       ret = FAIL;
+               }
+       }
+
        DBG_RETURN(ret);
 }
 /* }}} */