annotate forum/Sources/ViewQuery.php @ 87:df86d318892b website

Link to SampleType doc
author Chris Cannam
date Mon, 10 Feb 2014 18:11:48 +0000
parents e3e11437ecea
children
rev   line source
Chris@76 1 <?php
Chris@76 2
Chris@76 3 /**
Chris@76 4 * Simple Machines Forum (SMF)
Chris@76 5 *
Chris@76 6 * @package SMF
Chris@76 7 * @author Simple Machines http://www.simplemachines.org
Chris@76 8 * @copyright 2011 Simple Machines
Chris@76 9 * @license http://www.simplemachines.org/about/smf/license.php BSD
Chris@76 10 *
Chris@76 11 * @version 2.0
Chris@76 12 */
Chris@76 13
Chris@76 14 if (!defined('SMF'))
Chris@76 15 die('Hacking attempt...');
Chris@76 16
Chris@76 17 /* This file is concerned with viewing queries, and is used for debugging.
Chris@76 18 It contains only one function:
Chris@76 19
Chris@76 20 void ViewQuery()
Chris@76 21 - toggles the session variable 'view_queries'.
Chris@76 22 - views a list of queries and analyzes them.
Chris@76 23 - requires the admin_forum permission.
Chris@76 24 - is accessed via ?action=viewquery.
Chris@76 25 - strings in this function have not been internationalized.
Chris@76 26 */
Chris@76 27
Chris@76 28 // See the queries....
Chris@76 29 function ViewQuery()
Chris@76 30 {
Chris@76 31 global $scripturl, $user_info, $settings, $context, $db_connection, $modSettings, $boarddir, $smcFunc, $txt, $db_show_debug;
Chris@76 32
Chris@76 33 // We should have debug mode enabled, as well as something to display!
Chris@76 34 if (!isset($db_show_debug) || $db_show_debug !== true || !isset($_SESSION['debug']))
Chris@76 35 fatal_lang_error('no_access', false);
Chris@76 36
Chris@76 37 // Don't allow except for administrators.
Chris@76 38 isAllowedTo('admin_forum');
Chris@76 39
Chris@76 40 // If we're just hiding/showing, do it now.
Chris@76 41 if (isset($_REQUEST['sa']) && $_REQUEST['sa'] == 'hide')
Chris@76 42 {
Chris@76 43 $_SESSION['view_queries'] = $_SESSION['view_queries'] == 1 ? 0 : 1;
Chris@76 44
Chris@76 45 if (strpos($_SESSION['old_url'], 'action=viewquery') !== false)
Chris@76 46 redirectexit();
Chris@76 47 else
Chris@76 48 redirectexit($_SESSION['old_url']);
Chris@76 49 }
Chris@76 50
Chris@76 51 call_integration_hook('integrate_egg_nog');
Chris@76 52
Chris@76 53 $query_id = isset($_REQUEST['qq']) ? (int) $_REQUEST['qq'] - 1 : -1;
Chris@76 54
Chris@76 55 echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Chris@76 56 <html xmlns="http://www.w3.org/1999/xhtml"', $context['right_to_left'] ? ' dir="rtl"' : '', '>
Chris@76 57 <head>
Chris@76 58 <title>', $context['forum_name_html_safe'], '</title>
Chris@76 59 <link rel="stylesheet" type="text/css" href="', $settings['theme_url'], '/css/index.css" />
Chris@76 60 <style type="text/css">
Chris@76 61 body
Chris@76 62 {
Chris@76 63 margin: 1ex;
Chris@76 64 }
Chris@76 65 body, td, th, .normaltext
Chris@76 66 {
Chris@76 67 font-size: x-small;
Chris@76 68 }
Chris@76 69 .smalltext
Chris@76 70 {
Chris@76 71 font-size: xx-small;
Chris@76 72 }
Chris@76 73 </style>
Chris@76 74 </head>
Chris@76 75 <body id="help_popup">
Chris@76 76 <div class="tborder windowbg description">';
Chris@76 77
Chris@76 78 foreach ($_SESSION['debug'] as $q => $query_data)
Chris@76 79 {
Chris@76 80 // Fix the indentation....
Chris@76 81 $query_data['q'] = ltrim(str_replace("\r", '', $query_data['q']), "\n");
Chris@76 82 $query = explode("\n", $query_data['q']);
Chris@76 83 $min_indent = 0;
Chris@76 84 foreach ($query as $line)
Chris@76 85 {
Chris@76 86 preg_match('/^(\t*)/', $line, $temp);
Chris@76 87 if (strlen($temp[0]) < $min_indent || $min_indent == 0)
Chris@76 88 $min_indent = strlen($temp[0]);
Chris@76 89 }
Chris@76 90 foreach ($query as $l => $dummy)
Chris@76 91 $query[$l] = substr($dummy, $min_indent);
Chris@76 92 $query_data['q'] = implode("\n", $query);
Chris@76 93
Chris@76 94 // Make the filenames look a bit better.
Chris@76 95 if (isset($query_data['f']))
Chris@76 96 $query_data['f'] = preg_replace('~^' . preg_quote($boarddir, '~') . '~', '...', $query_data['f']);
Chris@76 97
Chris@76 98 $is_select_query = substr(trim($query_data['q']), 0, 6) == 'SELECT';
Chris@76 99 if ($is_select_query)
Chris@76 100 $select = $query_data['q'];
Chris@76 101 elseif (preg_match('~^INSERT(?: IGNORE)? INTO \w+(?:\s+\([^)]+\))?\s+(SELECT .+)$~s', trim($query_data['q']), $matches) != 0)
Chris@76 102 {
Chris@76 103 $is_select_query = true;
Chris@76 104 $select = $matches[1];
Chris@76 105 }
Chris@76 106 elseif (preg_match('~^CREATE TEMPORARY TABLE .+?(SELECT .+)$~s', trim($query_data['q']), $matches) != 0)
Chris@76 107 {
Chris@76 108 $is_select_query = true;
Chris@76 109 $select = $matches[1];
Chris@76 110 }
Chris@76 111 // Temporary tables created in earlier queries are not explainable.
Chris@76 112 if ($is_select_query)
Chris@76 113 {
Chris@76 114 foreach (array('log_topics_unread', 'topics_posted_in', 'tmp_log_search_topics', 'tmp_log_search_messages') as $tmp)
Chris@76 115 if (strpos($select, $tmp) !== false)
Chris@76 116 {
Chris@76 117 $is_select_query = false;
Chris@76 118 break;
Chris@76 119 }
Chris@76 120 }
Chris@76 121
Chris@76 122 echo '
Chris@76 123 <div id="qq', $q, '" style="margin-bottom: 2ex;">
Chris@76 124 <a', $is_select_query ? ' href="' . $scripturl . '?action=viewquery;qq=' . ($q + 1) . '#qq' . $q . '"' : '', ' style="font-weight: bold; text-decoration: none;">
Chris@76 125 ', nl2br(str_replace("\t", '&nbsp;&nbsp;&nbsp;', htmlspecialchars($query_data['q']))), '
Chris@76 126 </a><br />';
Chris@76 127
Chris@76 128 if (!empty($query_data['f']) && !empty($query_data['l']))
Chris@76 129 echo sprintf($txt['debug_query_in_line'], $query_data['f'], $query_data['l']);
Chris@76 130
Chris@76 131 if (isset($query_data['s'], $query_data['t']) && isset($txt['debug_query_which_took_at']))
Chris@76 132 echo sprintf($txt['debug_query_which_took_at'], round($query_data['t'], 8), round($query_data['s'], 8));
Chris@76 133 else
Chris@76 134 echo sprintf($txt['debug_query_which_took'], round($query_data['t'], 8));
Chris@76 135
Chris@76 136 echo '
Chris@76 137 </div>';
Chris@76 138
Chris@76 139 // Explain the query.
Chris@76 140 if ($query_id == $q && $is_select_query)
Chris@76 141 {
Chris@76 142 $result = $smcFunc['db_query']('', '
Chris@76 143 EXPLAIN ' . $select,
Chris@76 144 array(
Chris@76 145 )
Chris@76 146 );
Chris@76 147 if ($result === false)
Chris@76 148 {
Chris@76 149 echo '
Chris@76 150 <table border="1" cellpadding="4" cellspacing="0" style="empty-cells: show; font-family: serif; margin-bottom: 2ex;">
Chris@76 151 <tr><td>', $smcFunc['db_error']($db_connection), '</td></tr>
Chris@76 152 </table>';
Chris@76 153 continue;
Chris@76 154 }
Chris@76 155
Chris@76 156 echo '
Chris@76 157 <table border="1" rules="all" cellpadding="4" cellspacing="0" style="empty-cells: show; font-family: serif; margin-bottom: 2ex;">';
Chris@76 158
Chris@76 159 $row = $smcFunc['db_fetch_assoc']($result);
Chris@76 160
Chris@76 161 echo '
Chris@76 162 <tr>
Chris@76 163 <th>' . implode('</th>
Chris@76 164 <th>', array_keys($row)) . '</th>
Chris@76 165 </tr>';
Chris@76 166
Chris@76 167 $smcFunc['db_data_seek']($result, 0);
Chris@76 168 while ($row = $smcFunc['db_fetch_assoc']($result))
Chris@76 169 {
Chris@76 170 echo '
Chris@76 171 <tr>
Chris@76 172 <td>' . implode('</td>
Chris@76 173 <td>', $row) . '</td>
Chris@76 174 </tr>';
Chris@76 175 }
Chris@76 176 $smcFunc['db_free_result']($result);
Chris@76 177
Chris@76 178 echo '
Chris@76 179 </table>';
Chris@76 180 }
Chris@76 181 }
Chris@76 182
Chris@76 183 echo '
Chris@76 184 </div>
Chris@76 185 </body>
Chris@76 186 </html>';
Chris@76 187
Chris@76 188 obExit(false);
Chris@76 189 }
Chris@76 190
Chris@76 191 ?>