From 98aca0588811f3d658bbb8bab1d03c6af7e9c24c Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Thu, 17 Oct 2013 10:38:11 +1100 Subject: [PATCH] Fix mysqli support Exception was thrown if $dbType=mysql, regardless of whether a driver was available. Also, the installer support was broken if the mysql driver was missing. Change-Id: I29df3fc9b3bf5743c1365f757e0cf899d5b96ae9 --- includes/db/Database.php | 22 ++++++++----- includes/installer/MysqlInstaller.php | 47 +++++++++++++-------------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/includes/db/Database.php b/includes/db/Database.php index 274bd0c6bd..1f7a83089a 100644 --- a/includes/db/Database.php +++ b/includes/db/Database.php @@ -744,30 +744,34 @@ abstract class DatabaseBase implements IDatabase, DatabaseType { 'mssql' => array(), ); + $driver = false; $dbType = strtolower( $dbType ); if ( isset( $canonicalDBTypes[$dbType] ) && $canonicalDBTypes[$dbType] ) { - $driver = isset( $p['driver'] ) ? $p['driver'] : null; $possibleDrivers = $canonicalDBTypes[$dbType]; - if ( $driver ) { - if ( in_array( $driver, $possibleDrivers ) ) { - $dbType = $driver; + if ( !empty( $p['driver'] ) ) { + if ( in_array( $p['driver'], $possibleDrivers ) ) { + $driver = $p['driver']; } else { throw new MWException( __METHOD__ . - " cannot construct Database with type '$dbType' and driver '$driver'" ); + " cannot construct Database with type '$dbType' and driver '{$p['driver']}'" ); } } else { foreach ( $possibleDrivers as $posDriver ) { if ( extension_loaded( $posDriver ) ) { - $dbType = $posDriver; + $driver = $posDriver; break; } } - throw new MWException( __METHOD__ . - " no viable database extension found for type '$dbType'" ); } + } else { + $driver = $dbType; + } + if ( $driver === false ) { + throw new MWException( __METHOD__ . + " no viable database extension found for type '$dbType'" ); } - $class = 'Database' . ucfirst( $dbType ); + $class = 'Database' . ucfirst( $driver ); if ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) { return new $class( isset( $p['host'] ) ? $p['host'] : false, diff --git a/includes/installer/MysqlInstaller.php b/includes/installer/MysqlInstaller.php index 16ec21c9ff..5e420b607b 100644 --- a/includes/installer/MysqlInstaller.php +++ b/includes/installer/MysqlInstaller.php @@ -72,7 +72,7 @@ class MysqlInstaller extends DatabaseInstaller { * @return Bool */ public function isCompiled() { - return self::checkExtension( 'mysql' ); + return self::checkExtension( 'mysql' ) || self::checkExtension( 'mysqli' ); } /** @@ -149,14 +149,13 @@ class MysqlInstaller extends DatabaseInstaller { public function openConnection() { $status = Status::newGood(); try { - $db = new DatabaseMysql( - $this->getVar( 'wgDBserver' ), - $this->getVar( '_InstallUser' ), - $this->getVar( '_InstallPassword' ), - false, - 0, - $this->getVar( 'wgDBprefix' ) - ); + $db = DatabaseBase::factory( 'mysql', array( + 'host' => $this->getVar( 'wgDBserver' ), + 'user' => $this->getVar( '_InstallUser' ), + 'password' => $this->getVar( '_InstallPassword' ), + 'dbname' => false, + 'flags' => 0, + 'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) ); $status->value = $db; } catch ( DBConnectionError $e ) { $status->fatal( 'config-connection-error', $e->getMessage() ); @@ -436,14 +435,13 @@ class MysqlInstaller extends DatabaseInstaller { if ( !$create ) { // Test the web account try { - new DatabaseMysql( - $this->getVar( 'wgDBserver' ), - $this->getVar( 'wgDBuser' ), - $this->getVar( 'wgDBpassword' ), - false, - 0, - $this->getVar( 'wgDBprefix' ) - ); + $db = DatabaseBase::factory( 'mysql', array( + 'host' => $this->getVar( 'wgDBserver' ), + 'user' => $this->getVar( 'wgDBuser' ), + 'password' => $this->getVar( 'wgDBpassword' ), + 'dbname' => false, + 'flags' => 0, + 'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) ); } catch ( DBConnectionError $e ) { return Status::newFatal( 'config-connection-error', $e->getMessage() ); } @@ -514,14 +512,13 @@ class MysqlInstaller extends DatabaseInstaller { if ( $this->getVar( '_CreateDBAccount' ) ) { // Before we blindly try to create a user that already has access, try { // first attempt to connect to the database - new DatabaseMysql( - $server, - $dbUser, - $password, - false, - 0, - $this->getVar( 'wgDBprefix' ) - ); + $db = DatabaseBase::factory( 'mysql', array( + 'host' => $server, + 'user' => $dbUser, + 'password' => $password, + 'dbname' => false, + 'flags' => 0, + 'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) ); $grantableNames[] = $this->buildFullUserName( $dbUser, $server ); $tryToCreate = false; } catch ( DBConnectionError $e ) { -- 2.20.1