| 1 | efrain | 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 |  * Profiling tool.
 | 
        
           |  |  | 19 |  *
 | 
        
           |  |  | 20 |  * @package    tool_profiling
 | 
        
           |  |  | 21 |  * @copyright  2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
 | 
        
           |  |  | 22 |  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 | 
        
           |  |  | 23 |  */
 | 
        
           |  |  | 24 |   | 
        
           |  |  | 25 | // TODO: Move all the DB stuff to profiling_db_xxxx() function in xhprof_moodle.php
 | 
        
           |  |  | 26 |   | 
        
           |  |  | 27 | // TODO: it is wrong when core lib references ANY plugin lang strings, maybe more login could be moved here (skodak)
 | 
        
           |  |  | 28 |   | 
        
           |  |  | 29 | require_once(__DIR__ . '/../../../config.php');
 | 
        
           |  |  | 30 | require_once($CFG->libdir.'/adminlib.php');
 | 
        
           |  |  | 31 | require_once($CFG->libdir . '/xhprof/xhprof_moodle.php');
 | 
        
           |  |  | 32 |   | 
        
           |  |  | 33 | define('PROFILING_RUNSPERPAGE', 50);
 | 
        
           |  |  | 34 |   | 
        
           |  |  | 35 | // page parameters
 | 
        
           |  |  | 36 | $script   = optional_param('script', null, PARAM_PATH);
 | 
        
           |  |  | 37 | $runid    = optional_param('runid', null, PARAM_ALPHANUM);
 | 
        
           |  |  | 38 | $runid2   = optional_param('runid2', null, PARAM_ALPHANUM);
 | 
        
           |  |  | 39 | $listurl  = optional_param('listurl', null, PARAM_PATH);
 | 
        
           |  |  | 40 | $runreference= optional_param('runreference', 0, PARAM_INT);
 | 
        
           |  |  | 41 | $runcomment  = optional_param('runcomment', null, PARAM_TEXT);
 | 
        
           |  |  | 42 |   | 
        
           |  |  | 43 | $dbfields = 'runid, url, totalexecutiontime, totalcputime, ' .
 | 
        
           |  |  | 44 |             'totalcalls, totalmemory, runreference, runcomment, timecreated';
 | 
        
           |  |  | 45 |   | 
        
           |  |  | 46 | admin_externalpage_setup('toolprofiling');
 | 
        
           |  |  | 47 |   | 
        
           |  |  | 48 | // Always add listurl if available
 | 
        
           |  |  | 49 | if ($listurl) {
 | 
        
           |  |  | 50 |     $listurlnav = new moodle_url('/admin/tool/profiling/index.php', array('listurl' => $listurl));
 | 
        
           |  |  | 51 |     $PAGE->navbar->add($listurl, $listurlnav);
 | 
        
           |  |  | 52 | }
 | 
        
           |  |  | 53 |   | 
        
           |  |  | 54 | // Add a new nav item to make $listurl clickable for the Boost theme.
 | 
        
           | 1441 | ariadna | 55 | if (isset($script) || isset($runid)) {
 | 
        
           |  |  | 56 |     $detailnav = get_string('detailview', 'tool_profiling');
 | 
        
           |  |  | 57 |     $PAGE->navbar->add($detailnav);
 | 
        
           | 1 | efrain | 58 | }
 | 
        
           |  |  | 59 |   | 
        
           |  |  | 60 | // Header
 | 
        
           |  |  | 61 | echo $OUTPUT->header();
 | 
        
           |  |  | 62 |   | 
        
           |  |  | 63 | // We have requested the last available run for one script
 | 
        
           |  |  | 64 | if (isset($script)) {
 | 
        
           |  |  | 65 |     // Get the last available run for the given script
 | 
        
           |  |  | 66 |     $run = $DB->get_record_sql("SELECT $dbfields
 | 
        
           |  |  | 67 |                                  FROM {profiling}
 | 
        
           |  |  | 68 |                                 WHERE url = ?
 | 
        
           |  |  | 69 |                                   AND id = (SELECT MAX(id)
 | 
        
           |  |  | 70 |                                               FROM {profiling}
 | 
        
           |  |  | 71 |                                              WHERE url = ?)",
 | 
        
           |  |  | 72 |                               array($script, $script), IGNORE_MISSING);
 | 
        
           |  |  | 73 |   | 
        
           |  |  | 74 |     // No run found for script, warn and exit
 | 
        
           |  |  | 75 |     if (!$run) {
 | 
        
           |  |  | 76 |         notice(get_string('cannotfindanyrunforurl', 'tool_profiling', $script), 'index.php');
 | 
        
           |  |  | 77 |     }
 | 
        
           |  |  | 78 |   | 
        
           |  |  | 79 |     // Check if there is any previous run marked as reference one
 | 
        
           |  |  | 80 |     $prevreferences = $DB->get_records_select('profiling',
 | 
        
           |  |  | 81 |                                               'url = ? AND runreference = 1 AND timecreated < ?',
 | 
        
           |  |  | 82 |                                               array($run->url, $run->timecreated),
 | 
        
           |  |  | 83 |                                               'timecreated DESC', 'runid, runcomment, timecreated', 0, 10);
 | 
        
           |  |  | 84 |     echo $OUTPUT->box_start('generalbox boxwidthwide boxaligncenter');
 | 
        
           |  |  | 85 |     $header = get_string('lastrunof', 'tool_profiling', $script);
 | 
        
           |  |  | 86 |     echo $OUTPUT->heading($header);
 | 
        
           |  |  | 87 |     $table = profiling_print_run($run, $prevreferences);
 | 
        
           |  |  | 88 |     echo $table;
 | 
        
           |  |  | 89 |     echo $OUTPUT->box_end();
 | 
        
           |  |  | 90 |   | 
        
           |  |  | 91 |   | 
        
           |  |  | 92 | // We have requested the diff between 2 runs
 | 
        
           |  |  | 93 | } else if (isset($runid) && isset($runid2)) {
 | 
        
           |  |  | 94 |     $run1 = $DB->get_record('profiling', array('runid'=>$runid), $dbfields, MUST_EXIST);
 | 
        
           |  |  | 95 |     $run2 = $DB->get_record('profiling', array('runid'=>$runid2), $dbfields, MUST_EXIST);
 | 
        
           |  |  | 96 |     if ($run1->url == $run2->url && $run1->runid != $run2->runid) {
 | 
        
           |  |  | 97 |         if ($run2->timecreated < $run1->timecreated) {
 | 
        
           |  |  | 98 |             $runtemp = $run1;
 | 
        
           |  |  | 99 |             $run1 = $run2;
 | 
        
           |  |  | 100 |             $run2 = $runtemp;
 | 
        
           |  |  | 101 |         }
 | 
        
           |  |  | 102 |         echo $OUTPUT->box_start('generalbox boxwidthwide boxaligncenter');
 | 
        
           |  |  | 103 |         $header = get_string('differencesbetween2runsof', 'tool_profiling', $run1->url);
 | 
        
           |  |  | 104 |         echo $OUTPUT->heading($header);
 | 
        
           |  |  | 105 |         $table = profiling_print_rundiff($run1, $run2);
 | 
        
           |  |  | 106 |         echo $table;
 | 
        
           |  |  | 107 |         echo $OUTPUT->box_end();
 | 
        
           |  |  | 108 |     }
 | 
        
           |  |  | 109 |   | 
        
           |  |  | 110 |   | 
        
           |  |  | 111 | // We have requested one run, invoke it
 | 
        
           |  |  | 112 | } else if (isset($runid)) {
 | 
        
           |  |  | 113 |     // Check if we are trying to update the runreference/runcomment for the run
 | 
        
           |  |  | 114 |     if (isset($runcomment) && confirm_sesskey()) {
 | 
        
           |  |  | 115 |         $id = $DB->get_field('profiling', 'id', array('runid' => $runid), MUST_EXIST);
 | 
        
           |  |  | 116 |         $rec = new stdClass();
 | 
        
           |  |  | 117 |         $rec->id = $id;
 | 
        
           |  |  | 118 |         $rec->runreference = (bool)$runreference;
 | 
        
           |  |  | 119 |         $rec->runcomment   = $runcomment;
 | 
        
           |  |  | 120 |         $DB->update_record('profiling', $rec);
 | 
        
           |  |  | 121 |     }
 | 
        
           |  |  | 122 |     // Get the requested runid
 | 
        
           |  |  | 123 |     $run = $DB->get_record('profiling', array('runid'=>$runid), $dbfields, IGNORE_MISSING);
 | 
        
           |  |  | 124 |   | 
        
           |  |  | 125 |     // No run found for runid, warn and exit
 | 
        
           |  |  | 126 |     if (!$run) {
 | 
        
           |  |  | 127 |         notice(get_string('cannotfindanyrunforrunid', 'tool_profiling', $runid), 'index.php');
 | 
        
           |  |  | 128 |     }
 | 
        
           |  |  | 129 |   | 
        
           |  |  | 130 |     // Check if there is any previous run marked as reference one
 | 
        
           |  |  | 131 |     $prevreferences = $DB->get_records_select('profiling',
 | 
        
           |  |  | 132 |                                               'url = ? AND runreference = 1 AND timecreated < ?',
 | 
        
           |  |  | 133 |                                               array($run->url, $run->timecreated),
 | 
        
           |  |  | 134 |                                               'timecreated DESC', 'runid, runcomment, timecreated', 0, 10);
 | 
        
           |  |  | 135 |     echo $OUTPUT->box_start('generalbox boxwidthwide boxaligncenter');
 | 
        
           |  |  | 136 |     $header = get_string('summaryof', 'tool_profiling', $run->url);
 | 
        
           |  |  | 137 |     echo $OUTPUT->heading($header);
 | 
        
           |  |  | 138 |     $table = profiling_print_run($run, $prevreferences);
 | 
        
           |  |  | 139 |     echo $table;
 | 
        
           |  |  | 140 |     echo $OUTPUT->box_end();
 | 
        
           |  |  | 141 |   | 
        
           |  |  | 142 |   | 
        
           |  |  | 143 | // Default: List one page of runs
 | 
        
           |  |  | 144 | } else {
 | 
        
           |  |  | 145 |   | 
        
           |  |  | 146 |     // The flexitable that will root listings
 | 
        
           |  |  | 147 |     $table = new xhprof_table_sql('profiling-list-table');
 | 
        
           |  |  | 148 |     $baseurl = $CFG->wwwroot . '/'.$CFG->admin.'/tool/profiling/index.php';
 | 
        
           |  |  | 149 |   | 
        
           |  |  | 150 |     // Check if we are listing all or some URL ones
 | 
        
           |  |  | 151 |     $sqlconditions = '';
 | 
        
           |  |  | 152 |     $sqlparams = array();
 | 
        
           |  |  | 153 |     if (!isset($listurl)) {
 | 
        
           |  |  | 154 |         $header = get_string('pluginname', 'tool_profiling');
 | 
        
           |  |  | 155 |         $sqlconditions = '1 = 1';
 | 
        
           |  |  | 156 |         $table->set_listurlmode(false);
 | 
        
           |  |  | 157 |     } else {
 | 
        
           |  |  | 158 |         $header =  get_string('profilingrunsfor', 'tool_profiling', $listurl);
 | 
        
           |  |  | 159 |         $sqlconditions = 'url = :url';
 | 
        
           |  |  | 160 |         $sqlparams['url'] = $listurl;
 | 
        
           |  |  | 161 |         $table->set_listurlmode(true);
 | 
        
           |  |  | 162 |         $baseurl .= '?listurl=' . urlencode($listurl);
 | 
        
           |  |  | 163 |     }
 | 
        
           |  |  | 164 |   | 
        
           |  |  | 165 |     echo $OUTPUT->heading($header);
 | 
        
           |  |  | 166 |   | 
        
           |  |  | 167 |     // Print the controller block with different options.
 | 
        
           |  |  | 168 |     echo profiling_list_controls($listurl);
 | 
        
           |  |  | 169 |   | 
        
           |  |  | 170 |     // TODO: Fix flexitable to validate tsort/thide/tshow/tifirs/tilast/page
 | 
        
           |  |  | 171 |     // TODO: Fix table_sql to allow it to work without WHERE clause
 | 
        
           |  |  | 172 |     // add silly condition (1 = 1) because of table_sql bug
 | 
        
           |  |  | 173 |     $table->set_sql($dbfields, '{profiling}', $sqlconditions, $sqlparams);
 | 
        
           |  |  | 174 |     $table->set_count_sql("SELECT COUNT(*) FROM {profiling} WHERE $sqlconditions", $sqlparams);
 | 
        
           |  |  | 175 |     $columns = array(
 | 
        
           |  |  | 176 |         'url', 'timecreated', 'totalexecutiontime', 'totalcputime',
 | 
        
           |  |  | 177 |         'totalcalls', 'totalmemory', 'runcomment');
 | 
        
           |  |  | 178 |     $headers = array(
 | 
        
           |  |  | 179 |         get_string('url'), get_string('date'), get_string('executiontime', 'tool_profiling'),
 | 
        
           |  |  | 180 |         get_string('cputime', 'tool_profiling'), get_string('calls', 'tool_profiling'),
 | 
        
           |  |  | 181 |         get_string('memory', 'tool_profiling'), get_string('comment', 'tool_profiling'));
 | 
        
           |  |  | 182 |     $table->define_columns($columns);
 | 
        
           |  |  | 183 |     $table->define_headers($headers);
 | 
        
           |  |  | 184 |     $table->sortable(true, 'timecreated', SORT_DESC);
 | 
        
           |  |  | 185 |     $table->define_baseurl($baseurl);
 | 
        
           |  |  | 186 |     $table->column_suppress('url');
 | 
        
           |  |  | 187 |     $table->out(PROFILING_RUNSPERPAGE, true);
 | 
        
           |  |  | 188 | }
 | 
        
           |  |  | 189 |   | 
        
           |  |  | 190 | // Footer.
 | 
        
           |  |  | 191 | echo $OUTPUT->footer();
 | 
        
           |  |  | 192 |   |