c37ab3670e4e716d2889f98c47ff088302c2624e
[moodle.git] / admin / tool / xmldb / actions / check_defaults / check_defaults.class.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  * @package    tool_xmldb
19  * @copyright  2003 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
20  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
21  */
23 defined('MOODLE_INTERNAL') || die();
25 /**
26  * This class will check all the default values existing in the DB
27  * match those specified in the xml specs
28  * and providing one SQL script to fix all them.
29  *
30  * @package    tool_xmldb
31  * @copyright  2003 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
32  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
33  */
34 class check_defaults extends XMLDBCheckAction {
36     /**
37      * Init method, every subclass will have its own
38      */
39     public function init() {
40         $this->introstr = 'confirmcheckdefaults';
41         parent::init();
43         // Set own core attributes.
45         // Set own custom attributes.
47         // Get needed strings.
48         $this->loadStrings(array(
49             'wrongdefaults' => 'tool_xmldb',
50             'nowrongdefaultsfound' => 'tool_xmldb',
51             'yeswrongdefaultsfound' => 'tool_xmldb',
52             'expected' => 'tool_xmldb',
53             'actual' => 'tool_xmldb',
54         ));
55     }
57     protected function check_table(xmldb_table $xmldbtable, array $metacolumns) {
58         $o = '';
59         $wrongfields = array();
61         // Get and process XMLDB fields.
62         if ($xmldbfields = $xmldbtable->getFields()) {
63             $o .= '        <ul>';
64             foreach ($xmldbfields as $xmldbfield) {
66                 // Get the default value for the field.
67                 $xmldbdefault = $xmldbfield->getDefault();
69                 // Char fields with not null currently have default '' when actually installed.
70                 if ($xmldbdefault === null && $xmldbfield->getType() === XMLDB_TYPE_CHAR &&
71                         $xmldbfield->getNotNull()) {
72                     $xmldbdefault = '';
73                 }
74                 if ($xmldbdefault !== null) {
75                     $xmldbdefault = (string)$xmldbdefault;
76                 }
78                 // If the metadata for that column doesn't exist or 'id' field found, skip.
79                 if (!isset($metacolumns[$xmldbfield->getName()]) or $xmldbfield->getName() == 'id') {
80                     continue;
81                 }
83                 // To variable for better handling.
84                 $metacolumn = $metacolumns[$xmldbfield->getName()];
86                 // Going to check this field in DB.
87                 $o .= '            <li>' . $this->str['field'] . ': ' . $xmldbfield->getName() . ' ';
89                 // Get the value of the physical default (or blank if there isn't one).
90                 if ($metacolumn->has_default == 1) {
91                     $physicaldefault = $metacolumn->default_value;
92                 } else {
93                     $physicaldefault = null;
94                 }
96                 // There *is* a default and it's wrong.
97                 if ($physicaldefault !== $xmldbdefault) {
98                     $xmldbtext = self::display_default($xmldbdefault);
99                     $physicaltext = self::display_default($physicaldefault);
100                     $info = "({$this->str['expected']} {$xmldbtext}, {$this->str['actual']} {$physicaltext})";
101                     $o .= '<font color="red">' . $this->str['wrong'] . " $info</font>";
102                     // Add the wrong field to the list.
103                     $obj = new stdClass();
104                     $obj->table = $xmldbtable;
105                     $obj->field = $xmldbfield;
106                     $obj->physicaldefault = $physicaldefault;
107                     $obj->xmldbdefault = $xmldbdefault;
108                     $wrongfields[] = $obj;
109                 } else {
110                     $o .= '<font color="green">' . $this->str['ok'] . '</font>';
111                 }
112                 $o .= '</li>';
113             }
114             $o .= '        </ul>';
115         }
117         return array($o, $wrongfields);
118     }
120     /**
121      * Converts a default value suitable for display.
122      *
123      * @param string|null $defaultvalue Default value
124      * @return string Displayed version
125      */
126     protected static function display_default($defaultvalue) {
127         if ($defaultvalue === null) {
128             return '-';
129         } else {
130             return "'" . s($defaultvalue) . "'";
131         }
132     }
134     protected function display_results(array $wrongfields) {
135         global $DB;
136         $dbman = $DB->get_manager();
138         $s = '';
139         $r = '<table class="generaltable boxaligncenter boxwidthwide" border="0" cellpadding="5" cellspacing="0" id="results">';
140         $r .= '  <tr><td class="generalboxcontent">';
141         $r .= '    <h2 class="main">' . $this->str['searchresults'] . '</h2>';
142         $r .= '    <p class="centerpara">' . $this->str['wrongdefaults'] . ': ' . count($wrongfields) . '</p>';
143         $r .= '  </td></tr>';
144         $r .= '  <tr><td class="generalboxcontent">';
146         // If we have found wrong defaults inform about them.
147         if (count($wrongfields)) {
148             $r .= '    <p class="centerpara">' . $this->str['yeswrongdefaultsfound'] . '</p>';
149             $r .= '        <ul>';
150             foreach ($wrongfields as $obj) {
151                 $xmldbtable = $obj->table;
152                 $xmldbfield = $obj->field;
153                 $physicaltext = self::display_default($obj->physicaldefault);
154                 $xmldbtext = self::display_default($obj->xmldbdefault);
156                 // Get the alter table command.
157                 $sqlarr = $dbman->generator->getAlterFieldSQL($xmldbtable, $xmldbfield);
159                 $r .= '            <li>' . $this->str['table'] . ': ' . $xmldbtable->getName() . '. ' .
160                         $this->str['field'] . ': ' . $xmldbfield->getName() . ', ' .
161                         $this->str['expected'] . ' ' . $xmldbtext . ' ' .
162                         $this->str['actual'] . ' ' . $physicaltext . '</li>';
163                 // Add to output if we have sentences.
164                 if ($sqlarr) {
165                     $sqlarr = $dbman->generator->getEndedStatements($sqlarr);
166                     $s .= '<code>' . str_replace("\n", '<br />', implode('<br />', $sqlarr)) . '</code><br />';
167                 }
168             }
169             $r .= '        </ul>';
170             // Add the SQL statements (all together).
171             $r .= '<hr />' . $s;
172         } else {
173             $r .= '    <p class="centerpara">' . $this->str['nowrongdefaultsfound'] . '</p>';
174         }
175         $r .= '  </td></tr>';
176         $r .= '  <tr><td class="generalboxcontent">';
177         // Add the complete log message.
178         $r .= '    <p class="centerpara">' . $this->str['completelogbelow'] . '</p>';
179         $r .= '  </td></tr>';
180         $r .= '</table>';
182         return $r;
183     }