Fix mysqli support
authorTim Starling <tstarling@wikimedia.org>
Wed, 16 Oct 2013 23:38:11 +0000 (10:38 +1100)
committerReedy <reedy@wikimedia.org>
Thu, 17 Oct 2013 03:11:53 +0000 (03:11 +0000)
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
includes/installer/MysqlInstaller.php

index 274bd0c..1f7a830 100644 (file)
@@ -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,
index 16ec21c..5e420b6 100644 (file)
@@ -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 ) {