Microweber\Utils\Backup::exec_restore PHP Method

exec_restore() public method

public exec_restore ( $params = false )
    public function exec_restore($params = false)
    {
        ignore_user_abort(true);
        ini_set('memory_limit', '512M');
        if (!strstr(INI_SYSTEM_CHECK_DISABLED, 'set_time_limit')) {
            set_time_limit(0);
        }
        $loc = $this->backup_file;
        // Get the provided arg
        if (isset($params['id'])) {
            $id = $params['id'];
        } elseif (isset($_GET['filename'])) {
            $id = $params['filename'];
        } elseif (isset($_GET['file'])) {
            $id = $params['file'];
        } elseif ($loc != false) {
            $id = $loc;
        }
        if ($id == null) {
            return array('error' => 'You have not provided a backup to restore.');
        }
        $here = $this->get_bakup_location();
        $filename = $here . $id;
        $ext = get_file_extension($filename);
        $ext_error = false;
        $sql_file = false;
        if (!is_file($filename)) {
            return array('error' => 'You have not provided a existing backup to restore.');
            die;
        }
        $temp_dir_restore = false;
        switch ($ext) {
            case 'zip':
                $back_log_action = 'Unzipping userfiles';
                $this->log_action($back_log_action);
                $exract_folder = md5(basename($filename));
                $unzip = new \Microweber\Utils\Unzip();
                $target_dir = mw_cache_path() . 'backup_restore' . DS . $exract_folder . DS;
                if (!is_dir($target_dir)) {
                    mkdir_recursive($target_dir);
                }
                $result = $unzip->extract($filename, $target_dir, $preserve_filepath = true);
                $temp_dir_restore = $target_dir;
                $sql_restore = $target_dir . 'mw_sql_restore.sql';
                if (is_file($sql_restore)) {
                    $sql_file = $sql_restore;
                }
                break;
            case 'sql':
                $sql_file = $filename;
                break;
            default:
                $ext_error = true;
                break;
        }
        if ($ext_error == true) {
            return array('error' => 'Invalid file extension. The restore file must be .sql or .zip');
            die;
        }
        if ($sql_file != false) {
            $back_log_action = 'Restoring database';
            $this->log_action($back_log_action);
            $filename = $sql_file;
            $sqlErrorText = '';
            $sqlErrorCode = 0;
            $sqlStmt = '';
            $sqlFile = file_get_contents($filename);
            $sqlArray = explode($this->file_q_sep, $sqlFile);
            if (!isset($sqlArray[1])) {
                $sqlArray = explode("\n", $sqlFile);
            }
            // Process the sql file by statements
            $engine = mw()->database_manager->get_sql_engine();
            foreach ($sqlArray as $stmt) {
                $stmt = str_replace('/* MW_TABLE_SEP */', ' ', $stmt);
                $stmt = str_ireplace($this->prefix_placeholder, get_table_prefix(), $stmt);
                $stmt = str_replace("", '', $stmt);
                //                $stmt = str_replace("\x0D", '', $stmt);
                //                $stmt = str_replace("\x09", '', $stmt);
                ////
                //                $stmt = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\x9F]/u', '', $stmt);
                if ($engine == 'sqlite') {
                    $stmt = str_replace("\\'", "''", $stmt);
                }
                if ($this->debug) {
                    d($stmt);
                }
                if (strlen(trim($stmt)) > 3) {
                    try {
                        @mw()->database_manager->q($stmt, true);
                        // mw()->database_manager->q($stmt);
                    } catch (QueryException $e) {
                        echo 'Caught exception: ' . $e->getMessage() . "\n";
                        $sqlErrorCode = 1;
                    } catch (Exception $e) {
                        echo 'Caught exception: ' . $e->getMessage() . "\n";
                        $sqlErrorCode = 1;
                    }
                }
            }
            // Print message (error or success)
            if ($sqlErrorCode == 0) {
                $back_log_action = 'Database restored!';
                $this->log_action($back_log_action);
                echo "Database restored!\n";
                echo 'Backup used: ' . $filename . "\n";
            } else {
                echo "An error occurred while restoring backup!<br><br>\n";
                echo "Error code: {$sqlErrorCode}<br>\n";
                echo "Error text: {$sqlErrorText}<br>\n";
                echo "Statement:<br/> {$sqlStmt}<br>";
            }
            $back_log_action = 'Database restored!';
            $this->log_action($back_log_action);
            echo "Files restored successfully!<br>\n";
            echo 'Backup used: ' . $filename . "<br>\n";
            if ($temp_dir_restore != false) {
                @unlink($filename);
            }
        }
        if (userfiles_path()) {
            if (!is_dir(userfiles_path())) {
                mkdir_recursive(userfiles_path());
            }
        }
        if (media_base_path()) {
            if (!is_dir(media_base_path())) {
                mkdir_recursive(media_base_path());
            }
        }
        if ($temp_dir_restore != false and is_dir($temp_dir_restore)) {
            echo "Media restored!<br>\n";
            $srcDir = $temp_dir_restore;
            $destDir = userfiles_path();
            $copy = $this->copyr($srcDir, $destDir);
        }
        if (function_exists('mw_post_update')) {
            mw_post_update();
        }
        $back_log_action = 'Cleaning up cache';
        $this->log_action($back_log_action);
        mw()->cache_manager->clear();
        $this->log_action(false);
    }