From a74881be24946a0d0fa0f2b3b0f7b403a4fa89e2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jes=C3=BAs=20Mart=C3=ADnez=20Novo?= Date: Sun, 1 Jun 2014 15:54:48 +0200 Subject: [PATCH] Make MySQLi work with non-standard socket 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 | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/includes/db/DatabaseMysqli.php b/includes/db/DatabaseMysqli.php index 2ce6307918..a03c9aaf62 100644 --- a/includes/db/DatabaseMysqli.php +++ b/includes/db/DatabaseMysqli.php @@ -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; } -- 2.20.1