Make MysqlInstaller check if DB exists in a cleaner way
authorAaron Schulz <aschulz@wikimedia.org>
Sat, 25 Aug 2018 05:49:15 +0000 (22:49 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Sat, 25 Aug 2018 05:49:15 +0000 (22:49 -0700)
Query the information schema rather than seeing if selectDB() returns false.
This makes the installer able to handle an exception based failure mode.

Change-Id: I7912b9d3b8501fbc92cb731547ae10fa2b0176db

includes/installer/MysqlInstaller.php

index 45f932a..1b0780b 100644 (file)
@@ -485,18 +485,32 @@ class MysqlInstaller extends DatabaseInstaller {
                /** @var Database $conn */
                $conn = $status->value;
                $dbName = $this->getVar( 'wgDBname' );
-               if ( !$conn->selectDB( $dbName ) ) {
+               if ( !$this->databaseExists( $dbName ) ) {
                        $conn->query(
                                "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ) . "CHARACTER SET utf8",
                                __METHOD__
                        );
-                       $conn->selectDB( $dbName );
                }
+               $conn->selectDB( $dbName );
                $this->setupSchemaVars();
 
                return $status;
        }
 
+       /**
+        * Try to see if a given database exists
+        * @param string $dbName Database name to check
+        * @return bool
+        */
+       private function databaseExists( $dbName ) {
+               $encDatabase = $this->db->addQuotes( $dbName );
+
+               return $this->db->query(
+                       "SELECT 1 FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = $encDatabase",
+                       __METHOD__
+               )->numRows() > 0;
+       }
+
        /**
         * @return Status
         */