20b3370bd1f3ed2c8203f78ff2fe9a87ab8cd89b
[moodle.git] / admin / tool / generator / classes / backend.php
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/>.
17 /**
18  * Backend generic code.
19  *
20  * @package tool_generator
21  * @copyright 2013 The Open University
22  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 defined('MOODLE_INTERNAL') || die();
27 /**
28  * Backend generic code for all tool_generator commands.
29  *
30  * @abstract
31  * @package tool_generator
32  * @copyright 2013 The Open University
33  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
35 abstract class tool_generator_backend {
36     /**
37      * @var int Lowest (smallest) size index
38      */
39     const MIN_SIZE = 0;
40     /**
41      * @var int Highest (largest) size index
42      */
43     const MAX_SIZE = 5;
44     /**
45      * @var int Default size index
46      */
47     const DEFAULT_SIZE = 3;
49     /**
50      * @var bool True if we want a fixed dataset or false to generate random data
51      */
52     protected $fixeddataset;
54     /**
55      * @var bool True if displaying progress
56      */
57     protected $progress;
59     /**
60      * @var int Epoch time at which last dot was displayed
61      */
62     protected $lastdot;
64     /**
65      * @var int Epoch time at which last percentage was displayed
66      */
67     protected $lastpercentage;
69     /**
70      * @var int Epoch time at which current step (current set of dots) started
71      */
72     protected $starttime;
74     /**
75      * @var int Size code (index in the above arrays)
76      */
77     protected $size;
79     /**
80      * Generic generator class
81      *
82      * @param int $size Size as numeric index
83      * @param bool $fixeddataset To use fixed or random data
84      * @param bool $progress True if progress information should be displayed
85      * @throws coding_exception If parameters are invalid
86      */
87     public function __construct($size, $fixeddataset = false, $progress = true) {
89         // Check parameter.
90         if ($size < self::MIN_SIZE || $size > self::MAX_SIZE) {
91             throw new coding_exception('Invalid size');
92         }
94         // Set parameters.
95         $this->size = $size;
96         $this->fixeddataset = $fixeddataset;
97         $this->progress = $progress;
98     }
100     /**
101      * Converts a size name into the numeric constant.
102      *
103      * @param string $sizename Size name e.g. 'L'
104      * @return int Numeric version
105      * @throws coding_exception If the size name is not known
106      */
107     public static function size_for_name($sizename) {
108         for ($size = self::MIN_SIZE; $size <= self::MAX_SIZE; $size++) {
109             if ($sizename == get_string('shortsize_' . $size, 'tool_generator')) {
110                 return $size;
111             }
112         }
113         throw new coding_exception("Unknown size name '$sizename'");
114     }
116     /**
117      * Displays information as part of progress.
118      * @param string $langstring Part of langstring (after progress_)
119      * @param mixed $a Optional lang string parameters
120      * @param bool $leaveopen If true, doesn't close LI tag (ready for dots)
121      */
122     protected function log($langstring, $a = null, $leaveopen = false) {
123         if (!$this->progress) {
124             return;
125         }
126         if (CLI_SCRIPT) {
127             echo '* ';
128         } else {
129             echo html_writer::start_tag('li');
130         }
131         echo get_string('progress_' . $langstring, 'tool_generator', $a);
132         if (!$leaveopen) {
133             if (CLI_SCRIPT) {
134                 echo "\n";
135             } else {
136                 echo html_writer::end_tag('li');
137             }
138         } else {
139             echo ': ';
140             $this->lastdot = time();
141             $this->lastpercentage = $this->lastdot;
142             $this->starttime = microtime(true);
143         }
144     }
146     /**
147      * Outputs dots. There is up to one dot per second. Once a minute, it
148      * displays a percentage.
149      * @param int $number Number of completed items
150      * @param int $total Total number of items to complete
151      */
152     protected function dot($number, $total) {
153         if (!$this->progress) {
154             return;
155         }
156         $now = time();
157         if ($now == $this->lastdot) {
158             return;
159         }
160         $this->lastdot = $now;
161         if (CLI_SCRIPT) {
162             echo '.';
163         } else {
164             echo ' . ';
165         }
166         if ($now - $this->lastpercentage >= 30) {
167             echo round(100.0 * $number / $total, 1) . '%';
168             $this->lastpercentage = $now;
169         }
171         // Update time limit so PHP doesn't time out.
172         if (!CLI_SCRIPT) {
173             set_time_limit(120);
174         }
175     }
177     /**
178      * Ends a log string that was started using log function with $leaveopen.
179      */
180     protected function end_log() {
181         if (!$this->progress) {
182             return;
183         }
184         echo get_string('done', 'tool_generator', round(microtime(true) - $this->starttime, 1));
185         if (CLI_SCRIPT) {
186             echo "\n";
187         } else {
188             echo html_writer::end_tag('li');
189         }
190     }