Newscoop\Installer\Services\UpgradeService::upgradeDatabase PHP Метод

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

Upgrade database
public upgradeDatabase ( array $versionsArray, boolean $silent = false, boolean $showRolls = false ) : boolean
$versionsArray array
$silent boolean
$showRolls boolean
Результат boolean
    public function upgradeDatabase($versionsArray, $silent = false, $showRolls = false)
    {
        $databaseService = new Services\DatabaseService($this->monolog);
        $lockFileName = __FILE__;
        $lockFile = fopen($lockFileName, "r");
        if ($lockFile === false) {
            return "Unable to create single process lock control!";
        }
        if (!flock($lockFile, LOCK_EX | LOCK_NB)) {
            // do an exclusive lock
            return "The upgrade process is already running.";
        }
        // keeping the last imported version throughout the upgrade process
        $last_db_version = $versionsArray['version'];
        // keeping the last imported roll throughout the upgrade process
        $last_db_roll = $versionsArray['roll'];
        $first = true;
        $errorsCount = 0;
        $temp = 0;
        $skipped = array();
        $sqlVersions = array_map('basename', glob($this->newscoopDir . '/install/Resources/sql/upgrade/[2-9].[0-9]*'));
        usort($sqlVersions, array($databaseService, 'versionCompare'));
        foreach ($sqlVersions as $index => $db_version) {
            if (-1 == $databaseService->versionCompare($db_version, $last_db_version)) {
                continue;
            }
            $last_db_version = $db_version;
            $last_db_roll = '';
            $cur_old_roll = '';
            // the roll of the running version that was imported before the upgrade ($old_roll or '')
            if ($first) {
                $last_db_roll = $versionsArray['roll'];
                $cur_old_roll = $last_db_roll;
                if (!$silent) {
                    $db_ver_roll_info = "{$db_version}";
                    if (!in_array($last_db_roll, array('', '.'))) {
                        $db_ver_roll_info .= ", roll {$last_db_roll}";
                    }
                    $this->logger->addNotice('* Upgrading the database from version ' . $db_ver_roll_info . '...');
                }
                $first = false;
            }
            $output = array();
            $upgrade_base_dir = $this->newscoopDir . "/install/Resources/sql/upgrade/{$db_version}/";
            $rolls = $databaseService->searchDbRolls($upgrade_base_dir, $cur_old_roll);
            // run upgrade scripts
            $sql_scripts = array("tables.sql", "data-required.sql", "data-optional.sql", "tables-post.sql");
            foreach ($rolls as $upgrade_dir_roll => $upgrade_dir_path) {
                $upgrade_dir = $upgrade_dir_path . DIRECTORY_SEPARATOR;
                $last_db_roll = $upgrade_dir_roll;
                if ($showRolls || !$silent) {
                    $this->logger->addNotice('* importing database roll ' . $last_db_version . ' / ' . $last_db_roll);
                }
                foreach ($sql_scripts as $index => $script) {
                    if (!is_file($upgrade_dir . $script)) {
                        continue;
                    }
                    $error_queries = array();
                    $errorsCount = $databaseService->importDB($upgrade_dir . $script, $this->connection, $this->logger);
                    $temp = $temp + $errorsCount;
                    if ($errorsCount) {
                        $this->logger->addError('* ' . $script . ' (' . $db_version . ') errors');
                    }
                }
                $saveResult = $databaseService->saveDatabaseVersion($this->connection, $last_db_version, $last_db_roll);
                if ($saveResult) {
                    $this->logger->addNotice('* version is updated to ' . $last_db_version . '/' . $last_db_roll);
                }
            }
        }
        if (!$silent) {
            $this->logger->addNotice('* importing database is done');
        }
        flock($lockFile, LOCK_UN);
        // release the lock
        $errorsCount = $temp;
        if ($errorsCount) {
            return $databaseService->errorQueries;
        }
        return true;
    }