Make MySQLi work with non-standard socket
authorJesús Martínez Novo <martineznovo@gmail.com>
Sun, 1 Jun 2014 13:54:48 +0000 (15:54 +0200)
committerLegoktm <legoktm.wikipedia@gmail.com>
Sat, 13 Sep 2014 05:04:36 +0000 (05:04 +0000)
MySQLi needs to specify the socket location as a parameter, and not as part
of the hostname.

Split the socket out of the hostname if it contains *one* colon (IPv6 safe)
after checking for the port number.

Bug: 65998
Change-Id: I66ee34e1029bc1630669bde4272d0eae9d3fd9f1

includes/db/DatabaseMysqli.php

index 2ce6307..a03c9aa 100644 (file)
@@ -58,14 +58,22 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                }
 
                // Other than mysql_connect, mysqli_real_connect expects an explicit port
-               // parameter. So we need to parse the port out of $realServer
+               // and socket parameters. So we need to parse the port and socket out of
+               // $realServer
                $port = null;
+               $socket = null;
                $hostAndPort = IP::splitHostAndPort( $realServer );
                if ( $hostAndPort ) {
                        $realServer = $hostAndPort[0];
                        if ( $hostAndPort[1] ) {
                                $port = $hostAndPort[1];
                        }
+               } elseif ( substr_count( $realServer, ':' ) == 1 ) {
+                       // If we have a colon and something that's not a port number
+                       // inside the hostname, assume it's the socket location
+                       $hostAndSocket = explode( ':', $realServer );
+                       $realServer = $hostAndSocket[0];
+                       $socket = $hostAndSocket[1];
                }
 
                $connFlags = 0;
@@ -90,7 +98,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                $mysqli->options( MYSQLI_OPT_CONNECT_TIMEOUT, 3 );
 
                if ( $mysqli->real_connect( $realServer, $this->mUser,
-                       $this->mPassword, $this->mDBname, $port, null, $connFlags )
+                       $this->mPassword, $this->mDBname, $port, $socket, $connFlags )
                ) {
                        return $mysqli;
                }