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 */ 31 abstract 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 . '&confirmed=yes&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(), false)) { 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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body