source: moodle/trunk/fuentes/admin/tool/xmldb/actions/XMLDBCheckAction.class.php @ 136

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

Ported code to xenial

File size: 8.5 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 * @package    tool_xmldb
19 * @copyright  2008 onwards Tim Hunt
20 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
21 */
22
23/**
24 * This is a base class for the various actions that interate over all the
25 * tables and check some aspect of their definition.
26 *
27 * @package    tool_xmldb
28 * @copyright  2008 onwards Tim Hunt
29 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
30 */
31abstract class XMLDBCheckAction extends XMLDBAction {
32    /**
33     * @var string This string is displayed with a yes/no choice before the report is run.
34     * You must set this to the name of a lang string in xmldb.php before calling init.
35     */
36    protected $introstr = '';
37
38    /**
39     * Init method, every subclass will have its own
40     */
41    function init() {
42        parent::init();
43
44        // Set own core attributes
45
46        // Set own custom attributes
47
48        // Get needed strings
49        $this->loadStrings(array(
50            $this->introstr => 'tool_xmldb',
51            'ok' => '',
52            'wrong' => 'tool_xmldb',
53            'table' => 'tool_xmldb',
54            'field' => 'tool_xmldb',
55            'searchresults' => 'tool_xmldb',
56            'completelogbelow' => 'tool_xmldb',
57            'yes' => '',
58            'no' => '',
59            'error' => '',
60            'back' => 'tool_xmldb'
61        ));
62    }
63
64    /**
65     * Invoke method, every class will have its own
66     * returns true/false on completion, setting both
67     * errormsg and output as necessary
68     */
69    function invoke() {
70        parent::invoke();
71
72        $result = true;
73
74        // Set own core attributes
75        $this->does_generate = ACTION_GENERATE_HTML;
76
77        // These are always here
78        global $CFG, $XMLDB, $DB, $OUTPUT;
79
80        // And we nedd some ddl suff
81        $dbman = $DB->get_manager();
82
83        // Here we'll acummulate all the wrong fields found
84        $problemsfound = array();
85
86        // Do the job, setting $result as needed
87
88        // Get the confirmed to decide what to do
89        $confirmed = optional_param('confirmed', false, PARAM_BOOL);
90
91        // If  not confirmed, show confirmation box
92        if (!$confirmed) {
93            $o = '<table class="generaltable" border="0" cellpadding="5" cellspacing="0" id="notice">';
94            $o.= '  <tr><td class="generalboxcontent">';
95            $o.= '    <p class="centerpara">' . $this->str[$this->introstr] . '</p>';
96            $o.= '    <table class="boxaligncenter" cellpadding="20"><tr><td>';
97            $o.= '      <div class="singlebutton">';
98            $o.= '        <form action="index.php?action=' . $this->title . '&amp;confirmed=yes&amp;sesskey=' . sesskey() . '" method="post"><fieldset class="invisiblefieldset">';
99            $o.= '          <input type="submit" value="'. $this->str['yes'] .'" /></fieldset></form></div>';
100            $o.= '      </td><td>';
101            $o.= '      <div class="singlebutton">';
102            $o.= '        <form action="index.php?action=main_view" method="post"><fieldset class="invisiblefieldset">';
103            $o.= '          <input type="submit" value="'. $this->str['no'] .'" /></fieldset></form></div>';
104            $o.= '      </td></tr>';
105            $o.= '    </table>';
106            $o.= '  </td></tr>';
107            $o.= '</table>';
108
109            $this->output = $o;
110        } else {
111            // The back to edit table button
112            $b = ' <p class="centerpara buttons">';
113            $b .= '<a href="index.php">[' . $this->str['back'] . ']</a>';
114            $b .= '</p>';
115
116            // Iterate over $XMLDB->dbdirs, loading their XML data to memory
117            if ($XMLDB->dbdirs) {
118                $dbdirs = $XMLDB->dbdirs;
119                $o='<ul>';
120                foreach ($dbdirs as $dbdir) {
121                    // Only if the directory exists
122                    if (!$dbdir->path_exists) {
123                        continue;
124                    }
125                    // Load the XML file
126                    $xmldb_file = new xmldb_file($dbdir->path . '/install.xml');
127
128                    // Only if the file exists
129                    if (!$xmldb_file->fileExists()) {
130                        continue;
131                    }
132                    // Load the XML contents to structure
133                    $loaded = $xmldb_file->loadXMLStructure();
134                    if (!$loaded || !$xmldb_file->isLoaded()) {
135                        echo $OUTPUT->notification('Errors found in XMLDB file: '. $dbdir->path . '/install.xml');
136                        continue;
137                    }
138                    // Arriving here, everything is ok, get the XMLDB structure
139                    $structure = $xmldb_file->getStructure();
140
141                    $o.='    <li>' . str_replace($CFG->dirroot . '/', '', $dbdir->path . '/install.xml');
142                    // Getting tables
143                    if ($xmldb_tables = $structure->getTables()) {
144                        $o.='        <ul>';
145                        // Foreach table, process its fields
146                        foreach ($xmldb_tables as $xmldb_table) {
147                            // Skip table if not exists
148                            if (!$dbman->table_exists($xmldb_table)) {
149                                continue;
150                            }
151                            // Fetch metadata from physical DB. All the columns info.
152                            if (!$metacolumns = $DB->get_columns($xmldb_table->getName())) {
153                                // / Skip table if no metacolumns is available for it
154                                continue;
155                            }
156                            // Table processing starts here
157                            $o.='            <li>' . $xmldb_table->getName();
158                            // Do the specific check.
159                            list($output, $newproblems) = $this->check_table($xmldb_table, $metacolumns);
160                            $o.=$output;
161                            $problemsfound = array_merge($problemsfound, $newproblems);
162                            $o.='    </li>';
163                            // Give the script some more time (resetting to current if exists)
164                            if ($currenttl = @ini_get('max_execution_time')) {
165                                @ini_set('max_execution_time',$currenttl);
166                            }
167                        }
168                        $o.='        </ul>';
169                    }
170                    $o.='    </li>';
171                }
172                $o.='</ul>';
173            }
174
175            // Create a report of the problems found.
176            $r = $this->display_results($problemsfound);
177
178            // Combine the various bits of output.
179            $this->output = $b . $r . $o;
180        }
181
182        // Launch postaction if exists (leave this here!)
183        if ($this->getPostAction() && $result) {
184            return $this->launch($this->getPostAction());
185        }
186
187        // Return ok if arrived here
188        return $result;
189    }
190
191    /**
192     * Do the checks necessary on one particular table.
193     *
194     * @param xmldb_table $xmldb_table the table definition from the install.xml file.
195     * @param array $metacolumns the column information read from the database.
196     * @return array an array with two elements: First, some additional progress output,
197     *      for example a list (<ul>) of the things check each with an one work ok/not ok summary.
198     *      Second, an array giving the details of any problems found. These arrays
199     *      for all tables will be aggregated, and then passed to
200     */
201    abstract protected function check_table(xmldb_table $xmldb_table, array $metacolumns);
202
203    /**
204     * Display a list of the problems found.
205     *
206     * @param array $problems_found an aggregation of all the problems found by
207     *      all the check_table calls.
208     * @return string a display of all the problems found as HTML.
209     */
210    abstract protected function display_results(array $problems_found);
211}
Note: See TracBrowser for help on using the repository browser.