2 /***************************************************************
5 * (c) 2004, 2005 Kasper Skaarhoj (kasperYYYY@typo3.com)
6 * (c) 2004-2007 Karsten Dambekalns (karsten@typo3.org)
9 * This script is part of the TYPO3 project. The TYPO3 project is
10 * free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * The GNU General Public License can be found at
16 * http://www.gnu.org/copyleft/gpl.html.
18 * This script is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * This copyright notice MUST APPEAR in all copies of the script!
24 ***************************************************************/
26 * Module 'DBAL Debug' for the 'dbal' extension.
28 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
29 * @author Karsten Dambekalns <karsten@typo3.org>
34 require ($BACK_PATH.'init.php');
35 require ($BACK_PATH.'template.php');
36 $LANG->includeLLFile('EXT:dbal/mod1/locallang.xml');
37 require_once (PATH_t3lib
.'class.t3lib_scbase.php');
38 $BE_USER->modAccess($MCONF,1);
42 * Script class; Backend module for DBAL extension
44 * @author Kasper Skaarhoj <kasper@typo3.com>
45 * @author Karsten Dambekalns <karsten@typo3.org>
49 class tx_dbal_module1
extends t3lib_SCbase
{
52 * Adds items to the ->MOD_MENU array. Used for the function menu selector.
56 function menuConfig() {
57 $this->MOD_MENU
= Array (
59 0 => $GLOBALS['LANG']->getLL('Debug_log'),
60 'info' => $GLOBALS['LANG']->getLL('Cached_info'),
61 'sqlcheck' => $GLOBALS['LANG']->getLL('SQL_check'),
68 * Main function of the module. Write the content to $this->content
73 global $BACK_PATH,$BE_USER;
76 $this->MOD_SETTINGS
= t3lib_BEfunc
::getModuleData($this->MOD_MENU
, t3lib_div
::_GP('SET'), $this->MCONF
['name']);
79 $this->doc
= t3lib_div
::makeInstance('noDoc');
80 $this->doc
->backPath
= $BACK_PATH;
81 $this->doc
->form
='<form action="" method="post">';
82 $this->doc
->docType
= 'xhtml_trans';
85 $this->doc
->JScode
= $this->doc
->wrapScriptTags('
87 function jumpToUrl(URL) { //
88 window.location.href = URL;
93 $this->content
.=$this->doc
->startPage($GLOBALS['LANG']->getLL('title'));
94 $this->content
.=$this->doc
->header($GLOBALS['LANG']->getLL('title'));
95 $this->content
.=$this->doc
->spacer(5);
96 $this->content
.=$this->doc
->section('',$this->doc
->funcMenu('',t3lib_BEfunc
::getFuncMenu(0,'SET[function]',$this->MOD_SETTINGS
['function'],$this->MOD_MENU
['function'])));
99 switch($this->MOD_SETTINGS
['function']) {
101 $this->content
.= $this->doc
->section($GLOBALS['LANG']->getLL('Cached_info'), $this->printCachedInfo());
104 $this->content
.= $this->doc
->section($GLOBALS['LANG']->getLL('SQL_check'), $this->printSqlCheck());
107 $this->content
.= $this->doc
->section($GLOBALS['LANG']->getLL('Debug_log'), $this->printLogMgm());
112 if ($BE_USER->mayMakeShortcut()) {
113 $this->content
.=$this->doc
->spacer(20).$this->doc
->section('',$this->doc
->makeShortcutIcon('id',implode(',',array_keys($this->MOD_MENU
)),$this->MCONF
['name']));
116 $this->content
.=$this->doc
->spacer(10);
120 * Prints out the module HTML
122 * @return string HTML output
124 function printContent() {
127 $this->content
.=$this->doc
->middle();
128 $this->content
.=$this->doc
->endPage();
133 * Displays a form to check DBAL SQL methods and parse raw SQL.
135 * @return string HTML output
137 function printSqlCheck() {
138 $input = t3lib_div
::_GP('tx_dbal');
141 <form name="sql_check" action="index.php" method="post" enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'">
142 <script type="text/javascript">
144 function updateQryForm(s) {
145 document.getElementById(\'tx-dbal-result\').style.display = \'none\';
148 document.getElementById(\'tx-dbal-qryupdate\').style.display = \'none\';
149 document.getElementById(\'tx-dbal-qryfields\').style.display = \'table-row\';
150 document.getElementById(\'tx-dbal-qryinsertvalues\').style.display = \'none\';
151 document.getElementById(\'tx-dbal-qryupdatevalues\').style.display = \'none\';
152 document.getElementById(\'tx-dbal-qryfrom\').style.display = \'table-row\';
153 document.getElementById(\'tx-dbal-qryinto\').style.display = \'none\';
154 document.getElementById(\'tx-dbal-qrywhere\').style.display = \'table-row\';
155 document.getElementById(\'tx-dbal-qrygroup\').style.display = \'table-row\';
156 document.getElementById(\'tx-dbal-qryorder\').style.display = \'table-row\';
157 document.getElementById(\'tx-dbal-qrylimit\').style.display = \'table-row\';
160 document.getElementById(\'tx-dbal-qryupdate\').style.display = \'none\';
161 document.getElementById(\'tx-dbal-qryfields\').style.display = \'none\';
162 document.getElementById(\'tx-dbal-qryinsertvalues\').style.display = \'table-row\';
163 document.getElementById(\'tx-dbal-qryupdatevalues\').style.display = \'none\';
164 document.getElementById(\'tx-dbal-qryfrom\').style.display = \'none\';
165 document.getElementById(\'tx-dbal-qryinto\').style.display = \'table-row\';
166 document.getElementById(\'tx-dbal-qrywhere\').style.display = \'table-row\';
167 document.getElementById(\'tx-dbal-qrygroup\').style.display = \'table-row\';
168 document.getElementById(\'tx-dbal-qryorder\').style.display = \'table-row\';
169 document.getElementById(\'tx-dbal-qrylimit\').style.display = \'table-row\';
172 document.getElementById(\'tx-dbal-qryupdate\').style.display = \'table-row\';
173 document.getElementById(\'tx-dbal-qryfields\').style.display = \'none\';
174 document.getElementById(\'tx-dbal-qryinsertvalues\').style.display = \'none\';
175 document.getElementById(\'tx-dbal-qryupdatevalues\').style.display = \'table-row\';
176 document.getElementById(\'tx-dbal-qryfrom\').style.display = \'none\';
177 document.getElementById(\'tx-dbal-qryinto\').style.display = \'none\';
178 document.getElementById(\'tx-dbal-qryupdate\').style.display = \'table-row\';
179 document.getElementById(\'tx-dbal-qrywhere\').style.display = \'table-row\';
180 document.getElementById(\'tx-dbal-qrygroup\').style.display = \'none\';
181 document.getElementById(\'tx-dbal-qryorder\').style.display = \'none\';
182 document.getElementById(\'tx-dbal-qrylimit\').style.display = \'none\';
185 document.getElementById(\'tx-dbal-qryupdate\').style.display = \'none\';
186 document.getElementById(\'tx-dbal-qryfields\').style.display = \'none\';
187 document.getElementById(\'tx-dbal-qryinsertvalues\').style.display = \'none\';
188 document.getElementById(\'tx-dbal-qryupdatevalues\').style.display = \'none\';
189 document.getElementById(\'tx-dbal-qryfrom\').style.display = \'table-row\';
190 document.getElementById(\'tx-dbal-qryinto\').style.display = \'none\';
191 document.getElementById(\'tx-dbal-qrywhere\').style.display = \'table-row\';
192 document.getElementById(\'tx-dbal-qrygroup\').style.display = \'none\';
193 document.getElementById(\'tx-dbal-qryorder\').style.display = \'none\';
194 document.getElementById(\'tx-dbal-qrylimit\').style.display = \'none\';
201 <tr class="tableheader bgColor5"><th colspan="2">Easy SQL check</th></tr>
203 <select name="tx_dbal[QUERY]"size="1" onchange="updateQryForm(this.options[this.selectedIndex].value)">
204 <option value="SELECT" '.($input['QUERY']=='SELECT'?
'selected="selected"' : '').'>SELECT</option>
205 <option value="INSERT" '.($input['QUERY']=='INSERT'?
'selected="selected"' : '').'>INSERT</option>
206 <option value="UPDATE" '.($input['QUERY']=='UPDATE'?
'selected="selected"' : '').'>UPDATE</option>
207 <option value="DELETE" '.($input['QUERY']=='DELETE' ?
'selected="selected"' : '').'>DELETE</option>
210 <tr id="tx-dbal-qryupdate" style="display:none;"><td></td><td><input name="tx_dbal[UPDATE]" value="'.$input['UPDATE'].'" type="text" size="30" maxsize="100" /></td></tr>
211 <tr id="tx-dbal-qryfields"><td></td><td><input name="tx_dbal[FIELDS]" value="'.$input['FIELDS'].'" type="text" size="30" maxsize="100" /></td></tr>
212 <tr id="tx-dbal-qryinsertvalues" style="display:none;"><td></td><td><textarea name="tx_dbal[INSERTVALUES]" cols="30" rows="4">'.$input['INSERTVALUES'].'</textarea></td></tr>
213 <tr id="tx-dbal-qryupdatevalues" style="display:none;"><th>SET</th><td><textarea name="tx_dbal[UPDATEVALUES]" cols="30" rows="4">'.$input['UPDATEVALUES'].'</textarea></td></tr>
214 <tr id="tx-dbal-qryfrom"><th>FROM</th><td><input name="tx_dbal[FROM]" value="'.$input['FROM'].'" type="text" size="30" maxsize="100" /></td></tr>
215 <tr id="tx-dbal-qryinto" style="display:none;"><th>INTO</th><td><input name="tx_dbal[INTO]" value="'.$input['INTO'].'" type="text" size="30" maxsize="100" /></td></tr>
216 <tr id="tx-dbal-qrywhere"><th>WHERE</th><td><input name="tx_dbal[WHERE]" value="'.$input['WHERE'].'" type="text" size="30" maxsize="100" /></td></tr>
217 <tr id="tx-dbal-qrygroup"><th>GROUP BY</th><td><input name="tx_dbal[GROUP]" value="'.$input['GROUP'].'" type="text" size="30" maxsize="100" /></td></tr>
218 <tr id="tx-dbal-qryorder"><th>ORDER BY</th><td><input name="tx_dbal[ORDER]" value="'.$input['ORDER'].'" type="text" size="30" maxsize="100" /></td></tr>
219 <tr id="tx-dbal-qrylimit"><th>LIMIT</th><td><input name="tx_dbal[LIMIT]" value="'.$input['LIMIT'].'" type="text" size="30" maxsize="100" /></td></tr>
220 <tr><td></td><td style="text-align:right;"><input type="submit" value="CHECK" /></td></tr>
221 <script type="text/javascript">
223 updateQryForm(\''.$input['QUERY'].'\');
228 $out .= '<tr id="tx-dbal-result" class="bgColor4"><th>Result:</th><td>';
229 switch($input['QUERY']) {
231 $qry = $GLOBALS['TYPO3_DB']->SELECTquery($input['FIELDS'],$input['FROM'],$input['WHERE'],$input['GROUP'],$input['ORDER'],$input['LIMIT']);
234 $qry = $GLOBALS['TYPO3_DB']->INSERTquery($input['INTO'],$this->createFieldsValuesArray($input['INSERTVALUES']));
237 $qry = $GLOBALS['TYPO3_DB']->UPDATEquery($input['UPDATE'],$input['WHERE'],$this->createFieldsValuesArray($input['UPDATEVALUES']));
240 $qry = $GLOBALS['TYPO3_DB']->DELETEquery($input['FROM'],$input['WHERE']);
243 $out .= '<pre>'.htmlspecialchars($qry).'</pre></td></tr>';
246 <tr class="tableheader bgColor5"><th colspan="2">RAW SQL check</th></tr>
247 <tr><td colspan="2" style="text-align:right;"><textarea name="tx_dbal[RAWSQL]" cols="60" rows="5">'.$input['RAWSQL'].'</textarea><br /><input type="submit" value="CHECK" /></td></tr>';
248 if(!empty($input['RAWSQL'])) {
249 $out .= '<tr class="bgColor4">';
250 $parseResult = $GLOBALS['TYPO3_DB']->SQLparser
->parseSQL($input['RAWSQL']);
251 if (is_array($parseResult)) {
252 $newQuery = $GLOBALS['TYPO3_DB']->SQLparser
->compileSQL($parseResult);
253 $testResult = $GLOBALS['TYPO3_DB']->SQLparser
->debug_parseSQLpartCompare($input['RAWSQL'], $newQuery);
254 if (!is_array($testResult)) {
255 $out .= '<td colspan="2">'.$newQuery;
257 $out .= '<td colspan="2">'.htmlspecialchars($testResult[0]).'</td></tr>
258 <tr><th>Error:</th><td style="border:2px solid #f00;">Input query did not match the parsed and recompiled query exactly (not observing whitespace):<br />'.htmlspecialchars($testResult[1]);
261 $out .= '<th>Result:</th><td style="border:2px solid #f00;">'.$parseResult;
266 $out .='</table></form>';
271 * Parses a very simple text format into an array.
273 * Each line is seen as a key/value pair that is exploded at =. This is used
274 * in the simple SQL check to input values for INSERT and UPDATE statements.
276 * @param string $in String to parse into key/value array.
277 * @return array Array created from the input string.
279 function createFieldsValuesArray($in) {
281 $in = explode(chr(10),$in);
282 foreach ($in as $v) {
283 $fv = explode('=',$v);
284 $ret[$fv[0]] = $fv[1];
291 * Prints out the cached information about the database.
293 * The DBAL caches a lot of information, e.g. about auto increment fields,
294 * field types and primary keys. This method formats all this into a HTML
295 * table to display in the BE.
297 * @return string HTML output
299 function printCachedInfo() {
301 if((string)t3lib_div
::_GP('cmd') == 'clear') {
302 $GLOBALS['TYPO3_DB']->clearCachedFieldInfo();
303 $GLOBALS['TYPO3_DB']->cacheFieldInfo();
306 $out = '<a name="autoincrement"></a><h2>auto_increment</h2>';
307 $out .= '<table border="1" cellspacing="0"><tbody><tr><th>Table</th><th>Field</th></tr>';
308 ksort($GLOBALS['TYPO3_DB']->cache_autoIncFields
);
309 foreach($GLOBALS['TYPO3_DB']->cache_autoIncFields
as $table => $field) {
311 $out .= '<td>'.$table.'</td>';
312 $out .= '<td>'.$field.'</td>';
315 $out .= '</tbody></table>';
317 $out .= $this->doc
->spacer(5);
318 $out .= '<a name="primarykeys"></a><h2>Primary keys</h2>';
319 $out .= '<table border="1" cellspacing="0"><tbody><tr><th>Table</th><th>Field(s)</th></tr>';
320 ksort($GLOBALS['TYPO3_DB']->cache_primaryKeys
);
321 foreach($GLOBALS['TYPO3_DB']->cache_primaryKeys
as $table => $field) {
323 $out .= '<td>'.$table.'</td>';
324 $out .= '<td>'.$field.'</td>';
327 $out .= '</tbody></table>';
329 $out .= $this->doc
->spacer(5);
330 $out .= '<a name="fieldtypes"></a><h2>Field types</h2>';
331 $out .= '<table border="1" cellspacing="0"><tbody><tr><th colspan="5">Table</th></tr><tr><th>Field</th><th>Type</th><th><a href="#metatypes">Metatype</a></th><th>NOT NULL</th><th>Default</th></th></tr>';
332 ksort($GLOBALS['TYPO3_DB']->cache_fieldType
);
333 foreach($GLOBALS['TYPO3_DB']->cache_fieldType
as $table => $fields) {
334 $out .= '<th colspan="5">'.$table.'</th>';
335 foreach($fields as $field => $data) {
337 $out .= '<td>'.$field.'</td>';
338 $out .= '<td>'.$data['type'].'</td>';
339 $out .= '<td>'.$data['metaType'].'</td>';
340 $out .= '<td>'.($data['notnull']?
'NOT NULL':'').'</td>';
341 $out .= '<td>'.$data['default'].'</td>';
345 $out .= '</tbody></table>';
347 $out .= $this->doc
->spacer(5);
348 $out .= '<a name="metatypes"></a><h2>Metatype explanation</h2>';
350 C: Varchar, capped to 255 characters.
351 X: Larger varchar, capped to 4000 characters (to be compatible with Oracle).
352 XL: For Oracle, returns CLOB, otherwise the largest varchar size.
354 C2: Multibyte varchar
355 X2: Multibyte varchar (largest size)
357 B: BLOB (binary large object)
359 D: Date (some databases do not support this, and we return a datetime type)
360 T: Datetime or Timestamp
361 L: Integer field suitable for storing booleans (0 or 1)
362 I: Integer (mapped to I4)
367 F: Floating point number
368 N: Numeric or decimal number</pre>';
370 $menu = '<a href="index.php?cmd=clear">CLEAR DATA</a><hr />';
371 $menu .= '<a href="#autoincrement">auto_increment</a> | <a href="#primarykeys">Primary keys</a> | <a href="#fieldtypes">Field types</a> | <a href="#metatypes">Metatype explanation</a><hr />';
377 * Printing the debug-log from the DBAL extension
379 * To enabled debugging, you will have to enabled it in the configuration!
381 * @return string HTML content
383 function printLogMgm() {
385 // Disable debugging in any case...
386 $GLOBALS['TYPO3_DB']->debug
= FALSE;
389 $cmd = (string)t3lib_div
::_GP('cmd');
392 $res = $GLOBALS['TYPO3_DB']->exec_DELETEquery('tx_dbal_debuglog','');
393 $res = $GLOBALS['TYPO3_DB']->exec_DELETEquery('tx_dbal_debuglog_where','');
394 $outStr = 'Log FLUSHED!';
397 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('table_join,exec_time,query,script','tx_dbal_debuglog','table_join!=\'\'', 'table_join,script,exec_time,query');
399 // Init vars in which to pick up the query result:
400 $tableIndex = array();
404 <td>Execution time</td>
410 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
411 $tableArray = $GLOBALS['TYPO3_DB']->SQLparser
->parseFromTables($row['table_join']);
413 // Create table name index:
414 foreach($tableArray as $a) {
415 foreach($tableArray as $b) {
416 if ($b['table']!=$a['table']) {
417 $tableIndex[$a['table']][$b['table']]=1;
425 <td>'.htmlspecialchars($row['exec_time']).'</td>
426 <td>'.htmlspecialchars($row['table_join']).'</td>
427 <td>'.htmlspecialchars($row['script']).'</td>
428 <td>'.htmlspecialchars($row['query']).'</td>
432 // Printing direct joins:
433 $outStr.= '<h4>Direct joins:</h4>'.t3lib_div
::view_array($tableIndex);
436 // Printing total dependencies:
437 foreach($tableIndex as $priTable => $a) {
438 foreach($tableIndex as $tableN => $v) {
439 foreach($v as $tableP => $vv) {
440 if ($tableP == $priTable) {
441 $tableIndex[$priTable] = array_merge($v, $a);
446 $outStr.= '<h4>Total dependencies:</h4>'.t3lib_div
::view_array($tableIndex);
448 // Printing data rows:
450 <table border="1" cellspacing="0">'.implode('',$tRows).'
455 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('serdata,exec_time,query,script','tx_dbal_debuglog','errorFlag>0','','tstamp DESC');
457 // Init vars in which to pick up the query result:
461 <td>Execution time</td>
467 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
471 <td>'.htmlspecialchars($row['exec_time']).'</td>
472 <td>'.t3lib_div
::view_array(unserialize($row['serdata'])).'</td>
473 <td>'.htmlspecialchars($row['script']).'</td>
474 <td>'.htmlspecialchars($row['query']).'</td>
478 // Printing data rows:
480 <table border="1" cellspacing="0">'.implode('',$tRows).'
484 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('query,serdata','tx_dbal_debuglog','errorFlag&2=2');
486 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
490 <td>'.htmlspecialchars($row['query']).'</td>
494 // Printing data rows:
496 <table border="1" cellspacing="0">'.implode('',$tRows).'
500 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('tstamp,script,tablename,whereclause','tx_dbal_debuglog_where','','','tstamp DESC');
507 <td>WHERE clause</td>
509 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
512 <td>'.t3lib_BEfunc
::datetime($row['tstamp']).'</td>
513 <td>'.htmlspecialchars($row['script']).'</td>
514 <td>'.htmlspecialchars($row['tablename']).'</td>
515 <td>'.str_replace(array('\'\'','""','IS NULL','IS NOT NULL'), array('<span style="background-color:#ff0000;color:#ffffff;padding:2px;font-weight:bold;">\'\'</span>','<span style="background-color:#ff0000;color:#ffffff;padding:2px;font-weight:bold;">""</span>','<span style="background-color:#00ff00;color:#ffffff;padding:2px;font-weight:bold;">IS NULL</span>','<span style="background-color:#00ff00;color:#ffffff;padding:2px;font-weight:bold;">IS NOT NULL</span>'), htmlspecialchars($row['whereclause'])).'</td>
520 <table border="1" cellspacing="0">'.implode('',$tRows).'
525 // Look for request to view specific script exec:
526 $specTime = t3lib_div
::_GP('specTime');
529 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('exec_time,errorFlag,table_join,serdata,query','tx_dbal_debuglog','tstamp='.(int)$specTime);
533 <td>Execution time</td>
539 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
542 <td>'.htmlspecialchars($row['exec_time']).'</td>
543 <td>'.($row['errorFlag'] ?
1 : 0).'</td>
544 <td>'.htmlspecialchars($row['table_join']).'</td>
545 <td>'.t3lib_div
::view_array(unserialize($row['serdata'])).'</td>
546 <td>'.str_replace(array('\'\'','""','IS NULL','IS NOT NULL'), array('<span style="background-color:#ff0000;color:#ffffff;padding:2px;font-weight:bold;">\'\'</span>','<span style="background-color:#ff0000;color:#ffffff;padding:2px;font-weight:bold;">""</span>','<span style="background-color:#00ff00;color:#ffffff;padding:2px;font-weight:bold;">IS NULL</span>','<span style="background-color:#00ff00;color:#ffffff;padding:2px;font-weight:bold;">IS NOT NULL</span>'), htmlspecialchars($row['query'])).'</td>
550 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('tstamp,script, SUM(exec_time) as calc_sum, count(*) AS qrycount, MAX(errorFlag) as error','tx_dbal_debuglog','','tstamp,script','tstamp DESC');
555 <td># of queries</td>
560 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
563 <td>'.t3lib_BEfunc
::datetime($row['tstamp']).'</td>
564 <td>'.htmlspecialchars($row['qrycount']).'</td>
565 <td>'.($row['error'] ?
'<strong style="color:#f00">ERR</strong>' : '').'</td>
566 <td>'.htmlspecialchars($row['calc_sum']).'</td>
567 <td><a href="index.php?specTime='.intval($row['tstamp']).'">'.htmlspecialchars($row['script']).'</a></td>
572 <table border="1" cellspacing="0">'.implode('',$tRows).'
579 <a href="index.php?cmd=flush">FLUSH LOG</a> -
580 <a href="index.php?cmd=joins">JOINS</a> -
581 <a href="index.php?cmd=errors">ERRORS</a> -
582 <a href="index.php?cmd=parsing">PARSING</a> -
583 <a href="index.php">LOG</a> -
584 <a href="index.php?cmd=where">WHERE</a> -
586 <a href="'.htmlspecialchars(t3lib_div
::linkThisScript()).'" target="tx_debuglog">[New window]</a>
589 return $menu.$outStr;
593 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE
]['XCLASS']['ext/dbal/mod1/index.php']) {
594 include_once($TYPO3_CONF_VARS[TYPO3_MODE
]['XCLASS']['ext/dbal/mod1/index.php']);
601 $SOBE = t3lib_div
::makeInstance('tx_dbal_module1');
604 $SOBE->printContent();