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", ' ', 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 ?> |