source: moodle/trunk/fuentes/admin/tool/generator/classes/site_backend.php @ 136

Last change on this file since 136 was 136, checked in by mabarracus, 4 years ago

Ported code to xenial

File size: 6.7 KB
Line 
1<?php
2// This file is part of Moodle - http://moodle.org/
3//
4// Moodle is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// Moodle is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
17/**
18 * tool_generator site backend.
19 *
20 * @package tool_generator
21 * @copyright 2013 David Monllaó
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23 */
24
25defined('MOODLE_INTERNAL') || die();
26
27/**
28 * Backend code for the site generator.
29 *
30 * @package tool_generator
31 * @copyright 2013 David Monllaó
32 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
33 */
34class tool_generator_site_backend extends tool_generator_backend {
35
36    /**
37     * @var string The course's shortname prefix.
38     */
39    const SHORTNAMEPREFIX = 'testcourse_';
40
41    /**
42     * @var bool If the debugging level checking was skipped.
43     */
44    protected $bypasscheck;
45
46    /**
47     * @var array Multidimensional array where the first level is the course size and the second the site size.
48     */
49    protected static $sitecourses = array(
50        array(2, 8, 64, 256, 1024, 4096),
51        array(1, 4, 8, 16, 32, 64),
52        array(0, 0, 1, 4, 8, 16),
53        array(0, 0, 0, 1, 0, 0),
54        array(0, 0, 0, 0, 1, 0),
55        array(0, 0, 0, 0, 0, 1)
56    );
57
58    /**
59     * Constructs object ready to make the site.
60     *
61     * @param int $size Size as numeric index
62     * @param bool $bypasscheck If debugging level checking was skipped.
63     * @param bool $fixeddataset To use fixed or random data
64     * @param int|bool $filesizelimit The max number of bytes for a generated file
65     * @param bool $progress True if progress information should be displayed
66     * @return int Course id
67     */
68    public function __construct($size, $bypasscheck, $fixeddataset = false, $filesizelimit = false, $progress = true) {
69
70        // Set parameters.
71        $this->bypasscheck = $bypasscheck;
72
73        parent::__construct($size, $fixeddataset, $filesizelimit, $progress);
74    }
75
76    /**
77     * Gets a list of size choices supported by this backend.
78     *
79     * @return array List of size (int) => text description for display
80     */
81    public static function get_size_choices() {
82        $options = array();
83        for ($size = self::MIN_SIZE; $size <= self::MAX_SIZE; $size++) {
84            $options[$size] = get_string('sitesize_' . $size, 'tool_generator');
85        }
86        return $options;
87    }
88
89    /**
90     * Runs the entire 'make' process.
91     *
92     * @return int Course id
93     */
94    public function make() {
95        global $DB, $CFG;
96
97        raise_memory_limit(MEMORY_EXTRA);
98
99        if ($this->progress && !CLI_SCRIPT) {
100            echo html_writer::start_tag('ul');
101        }
102
103        $entirestart = microtime(true);
104
105        // Create courses.
106        $prevchdir = getcwd();
107        chdir($CFG->dirroot);
108        $ncourse = self::get_last_testcourse_id();
109        foreach (self::$sitecourses as $coursesize => $ncourses) {
110            for ($i = 1; $i <= $ncourses[$this->size]; $i++) {
111                // Non language-dependant shortname.
112                $ncourse++;
113                $this->run_create_course(self::SHORTNAMEPREFIX . $ncourse, $coursesize);
114            }
115        }
116        chdir($prevchdir);
117
118        // Store last course id to return it (will be the bigger one).
119        $lastcourseid = $DB->get_field('course', 'id', array('shortname' => self::SHORTNAMEPREFIX . $ncourse));
120
121        // Log total time.
122        $this->log('sitecompleted', round(microtime(true) - $entirestart, 1));
123
124        if ($this->progress && !CLI_SCRIPT) {
125            echo html_writer::end_tag('ul');
126        }
127
128        return $lastcourseid;
129    }
130
131    /**
132     * Creates a course with the specified shortname, coursesize and the provided maketestsite options.
133     *
134     * @param string $shortname The course shortname
135     * @param int $coursesize One of the possible course sizes.
136     * @return void
137     */
138    protected function run_create_course($shortname, $coursesize) {
139
140        // We are in $CFG->dirroot.
141        $command = 'php admin/tool/generator/cli/maketestcourse.php';
142
143        $options = array(
144            '--shortname="' . $shortname . '"',
145            '--size="' . get_string('shortsize_' . $coursesize, 'tool_generator') . '"'
146        );
147
148        if (!$this->progress) {
149            $options[] = '--quiet';
150        }
151
152        if ($this->filesizelimit) {
153            $options[] = '--filesizelimit="' . $this->filesizelimit . '"';
154        }
155
156        // Extend options.
157        $optionstoextend = array(
158            'fixeddataset' => 'fixeddataset',
159            'bypasscheck' => 'bypasscheck',
160        );
161
162        // Getting an options string.
163        foreach ($optionstoextend as $attribute => $option) {
164            if (!empty($this->{$attribute})) {
165                $options[] = '--' . $option;
166            }
167        }
168        $options = implode(' ', $options);
169        if ($this->progress) {
170            system($command . ' ' . $options, $exitcode);
171        } else {
172            passthru($command . ' ' . $options, $exitcode);
173        }
174
175        if ($exitcode != 0) {
176            exit($exitcode);
177        }
178    }
179
180    /**
181     * Obtains the last unique sufix (numeric) using the test course prefix.
182     *
183     * @return int The last generated numeric value.
184     */
185    protected static function get_last_testcourse_id() {
186        global $DB;
187
188        $params = array();
189        $params['shortnameprefix'] = $DB->sql_like_escape(self::SHORTNAMEPREFIX) . '%';
190        $like = $DB->sql_like('shortname', ':shortnameprefix');
191
192        if (!$testcourses = $DB->get_records_select('course', $like, $params, '', 'shortname')) {
193            return 0;
194        }
195        // SQL order by is not appropiate here as is ordering strings.
196        $shortnames = array_keys($testcourses);
197        core_collator::asort($shortnames, core_collator::SORT_NATURAL);
198        $shortnames = array_reverse($shortnames);
199
200        // They come ordered by shortname DESC, so non-numeric values will be the first ones.
201        $prefixnchars = strlen(self::SHORTNAMEPREFIX);
202        foreach ($shortnames as $shortname) {
203            $sufix = substr($shortname, $prefixnchars);
204            if (preg_match('/^[\d]+$/', $sufix)) {
205                return $sufix;
206            }
207        }
208        // If all sufixes are not numeric this is the first make test site run.
209        return 0;
210    }
211
212}
Note: See TracBrowser for help on using the repository browser.