BaikalAdmin\Controller\Install\Database::validateConnection PHP Метод

validateConnection() публичный Метод

public validateConnection ( $oForm, $oMorpho )
    function validateConnection($oForm, $oMorpho)
    {
        if ($oForm->refreshed()) {
            return true;
        }
        $bMySQLEnabled = $oMorpho->element("PROJECT_DB_MYSQL")->value();
        if ($bMySQLEnabled) {
            $sHost = $oMorpho->element("PROJECT_DB_MYSQL_HOST")->value();
            $sDbname = $oMorpho->element("PROJECT_DB_MYSQL_DBNAME")->value();
            $sUsername = $oMorpho->element("PROJECT_DB_MYSQL_USERNAME")->value();
            $sPassword = $oMorpho->element("PROJECT_DB_MYSQL_PASSWORD")->value();
            try {
                $oDb = new \Flake\Core\Database\Mysql($sHost, $sDbname, $sUsername, $sPassword);
                if (($aMissingTables = \Baikal\Core\Tools::isDBStructurallyComplete($oDb)) !== true) {
                    # Checking if all tables are missing
                    $aRequiredTables = \Baikal\Core\Tools::getRequiredTablesList();
                    if (count($aRequiredTables) !== count($aMissingTables)) {
                        $sMessage = "<br /><p><strong>Database is not structurally complete.</strong></p>";
                        $sMessage .= "<p>Missing tables are: <strong>" . implode("</strong>, <strong>", $aMissingTables) . "</strong></p>";
                        $sMessage .= "<p>You will find the SQL definition of Baïkal tables in this file: <strong>Core/Resources/Db/MySQL/db.sql</strong></p>";
                        $sMessage .= "<br /><p>Nothing has been saved. <strong>Please, add these tables to the database before pursuing Baïkal initialization.</strong></p>";
                        $oForm->declareError($oMorpho->element("PROJECT_DB_MYSQL"), $sMessage);
                    } else {
                        # All tables are missing
                        # We add these tables ourselves to the database, to initialize Baïkal
                        $sSqlDefinition = file_get_contents(PROJECT_PATH_CORERESOURCES . "Db/MySQL/db.sql");
                        $oDb->query($sSqlDefinition);
                    }
                }
                return true;
            } catch (\Exception $e) {
                $oForm->declareError($oMorpho->element("PROJECT_DB_MYSQL"), "Baïkal was not able to establish a connexion to the MySQL database as configured.<br />MySQL says: " . $e->getMessage());
                $oForm->declareError($oMorpho->element("PROJECT_DB_MYSQL_HOST"));
                $oForm->declareError($oMorpho->element("PROJECT_DB_MYSQL_DBNAME"));
                $oForm->declareError($oMorpho->element("PROJECT_DB_MYSQL_USERNAME"));
                $oForm->declareError($oMorpho->element("PROJECT_DB_MYSQL_PASSWORD"));
            }
        } else {
            $sFile = $oMorpho->element("PROJECT_SQLITE_FILE")->value();
            try {
                // not sure yet how to better address this
                // yup! this is mental, but even if we don't use eval, effectively these
                // config settings are eval'ed because they are written as raw php files.
                // We'll have to clean this up later.
                $sFile = eval('return ' . $sFile . ';');
                # Asserting DB file is writable
                if (file_exists($sFile) && !is_writable($sFile)) {
                    $sMessage = "DB file is not writable. Please give write permissions on file <span style='font-family: monospace'>" . $sFile . "</span>";
                    $oForm->declareError($oMorpho->element("PROJECT_SQLITE_FILE"), $sMessage);
                    return false;
                }
                # Asserting DB directory is writable
                if (!is_writable(dirname($sFile))) {
                    $sMessage = "The <em>FOLDER</em> containing the DB file is not writable, and it has to.<br />Please give write permissions on folder <span style='font-family: monospace'>" . dirname($sFile) . "</span>";
                    $oForm->declareError($oMorpho->element("PROJECT_SQLITE_FILE"), $sMessage);
                    return false;
                }
                $oDb = new \Flake\Core\Database\Sqlite($sFile);
                if (($aMissingTables = \Baikal\Core\Tools::isDBStructurallyComplete($oDb)) !== true) {
                    # Checking if all tables are missing
                    $aRequiredTables = \Baikal\Core\Tools::getRequiredTablesList();
                    if (count($aRequiredTables) !== count($aMissingTables)) {
                        $sMessage = "<br /><p><strong>Database is not structurally complete.</strong></p>";
                        $sMessage .= "<p>Missing tables are: <strong>" . implode("</strong>, <strong>", $aMissingTables) . "</strong></p>";
                        $sMessage .= "<p>You will find the SQL definition of Baïkal tables in this file: <strong>Core/Resources/Db/SQLite/db.sql</strong></p>";
                        $sMessage .= "<br /><p>Nothing has been saved. <strong>Please, add these tables to the database before pursuing Baïkal initialization.</strong></p>";
                        $oForm->declareError($oMorpho->element("PROJECT_SQLITE_FILE"), $sMessage);
                    } else {
                        # All tables are missing
                        # We add these tables ourselves to the database, to initialize Baïkal
                        $sSqlDefinition = file_get_contents(PROJECT_PATH_CORERESOURCES . "Db/SQLite/db.sql");
                        foreach (explode(';', $sSqlDefinition) as $query) {
                            if (!trim($query)) {
                                continue;
                            }
                            $oDb->query($query);
                        }
                    }
                }
                return true;
            } catch (\Exception $e) {
                $oForm->declareError($oMorpho->element("PROJECT_SQLITE_FILE"), "Baïkal was not able to establish a connexion to the SQLite database as configured.<br />SQLite says: " . $e->getMessage() . (string) $e);
            }
            // SQLite
        }
    }