libraries/sqlparser.lib.php3:

- Cleaned up CSS creation functions
- Formatting fixes
libraries/sqlparser.data.php3:
- Added 'ANALYSE' reserved word (note spelling)
header.inc.php3:
- Added CSS for SQL Parser
libraries/common.lib.php3:
- Change of PMA_format_sql to use new SQL Parser
This commit is contained in:
Robin Johnson
2002-07-25 05:02:54 +00:00
parent 91731e157d
commit f932ee45ed
5 changed files with 133 additions and 156 deletions

View File

@@ -9,16 +9,26 @@ $Source$
* new lang: slovenian, thanks to Kositer Uros (urosh) * new lang: slovenian, thanks to Kositer Uros (urosh)
2002-07-24 Robin Johnson <robbat2@users.sourceforge.net> 2002-07-24 Robin Johnson <robbat2@users.sourceforge.net>
* libraries/string.lib.php3: optimizations (thanks Lo<4C>c) * libraries/string.lib.php3:
* libraries/sqlparser.lib.php3: SQL Parser merging (in progress) - optimizations/PHP3 fixes (thanks Lo<4C>c)
* libraries/sqlparser.lib.php3:
- Merged
- Spacing around if statements - Spacing around if statements
- Added require statements for parser - Added require statements for parser
- Moved to global constants for size of keyword arrays - Moved to global constants for size of keyword arrays
- Added CSS creation rules - Added CSS creation rules
* libraries/sqlparser.data.php3: Merged - Cleaned up CSS creation functions
- Formatting fixes
* libraries/sqlparser.data.php3:
- Merged
- Added 'ANALYSE' reserved word (note spelling)
* config.inc.php3: * config.inc.php3:
- Added SQL Parser variables - Added SQL Parser variables
- Remove old SQL Parser variables - Remove old SQL Parser variables
* header.inc.php3:
- Added CSS for SQL Parser
* libraries/common.lib.php3:
- Change of PMA_format_sql to use new SQL Parser
2002-07-24 Lo<4C>c Chapeaux <lolo@phpheaven.net> 2002-07-24 Lo<4C>c Chapeaux <lolo@phpheaven.net>
* libraries/string.lib.php3: Function documentation * libraries/string.lib.php3: Function documentation

View File

@@ -112,6 +112,26 @@ table.tabs {
border-left: none; border-left: none;
border-bottom: 1px solid #666; border-bottom: 1px solid #666;
} }
.syntax { font-family: sans-serif; font-size: small; }
.syntax_comment { }
.syntax_digit { }
.syntax_digit_hex { }
.syntax_digit_integer { }
.syntax_digit_float { }
.syntax_punct { }
.syntax_alpha { text-transform: lowercase; }
.syntax_alpha_columnType { text-transform: uppercase; }
.syntax_alpha_columnAttrib { text-transform: uppercase; }
.syntax_alpha_reservedWord { text-transform: uppercase; font-weight: bold; }
.syntax_alpha_functionName { text-transform: uppercase; }
.syntax_alpha_identifier { }
.syntax_alpha_variable { }
.syntax_quote { }
.syntax_quote_backtick { }
<?php
echo PMA_SQP_BuildCssData();
?>
//--> //-->
</style> </style>

View File

@@ -165,6 +165,16 @@ h1 {font-family: sans-serif; font-size: large; font-weight: bold}
*/ */
include('./libraries/defines.lib.php3'); include('./libraries/defines.lib.php3');
/**
* String handling
*/
include('./libraries/string.lib.php3');
/**
* SQL Parser data and code
*/
include('./libraries/sqlparser.data.php3');
include('./libraries/sqlparser.lib.php3');
// If zlib output compression is set in the php configuration file, no // If zlib output compression is set in the php configuration file, no
// output buffering should be run // output buffering should be run
@@ -230,7 +240,7 @@ h1 {font-family: sans-serif; font-size: large; font-weight: bold}
/** /**
* format sql strings * format sql strings
* *
* @param string sql * @param struct pre-parsed SQL structure
* *
* @return string the formatted sql * @return string the formatted sql
* *
@@ -239,128 +249,38 @@ h1 {font-family: sans-serif; font-size: large; font-weight: bold}
* *
* @access public * @access public
* *
* @author Mike Beck <mikebeck@users.sourceforge.net> * @author Robin Johnson <robbat2@users.sourceforge.net>
*/ */
function PMA_format_sql ($sql) { function PMA_format_sql ($ParsedSQL)
global $cfg, $mult; {
global $cfg;
// lem9: bypass this function for now // Check that we actually have a valid set of parsed data
return $sql; // well, not quite
if(!is_array($ParsedSQL)) {
$sfuncs = '^' . implode('$|^', $cfg['Functions']) . '$'; // We don,t so just return the input directly
$skeyw = '^' . implode('$|^', $cfg['keywords']) . '$'; // This is intended to be used for when the SQL Parser is turned off
$scoltype = '^' . implode('$|^', $cfg['ColumnTypes']) . '$'; return $ParsedSQL;
$add = '^' . implode('$|^', $cfg['additional']) . '$';
// First of all lets remove all newlines - we'll add our own later
$sql = str_replace("\n", ' ', $sql);
// There should always be blanks around = and after , ()
// fixme - i would like to replace ';' with '; ' but then i need
// to know how to do that without getting ; within strings as well
$sql = str_replace('=', ' = ', $sql);
$sql = str_replace(',', ', ', $sql);
$sql = str_replace(')', ' ) ', $sql);
$sql = str_replace('(', ' ( ', $sql);
// Now split everything by the blanks
$sql_parts = explode(' ', $sql);
// Start a loop over the parts check each word and put them back into
// $sql
unset($sql);
$s_nr = 0;
while (list($num, $word) = each($sql_parts)) {
// We might have added to many blanks when checking for = and,
// which might lead to empty members in the array
if (strlen($word) == 0) {
continue;
}
$is_string = FALSE;
// Anything inside quots might be more than one word
// so as we splitted by the blanks we have to try to get those
// parts back together
if ((substr($word, 0, 1) == '\'' || substr($word, 0, 1) == '"')
&& !isset($temp)) {
// start of a string
$temp = $word;
$is_string = TRUE;
} else {
if (isset($temp)) {
// We are continuing a string
$temp .= $word;
$is_string = TRUE;
}
} // end if... else...
if (substr($word, strlen($word) - 1, 1) == '\''
|| substr($word, strlen($word) - 1, 1) == '"') {
// End of a String
$word = '<font color="' . $cfg['colorStrings'] . '">' . htmlspecialchars($temp) . '</font>';
unset($temp);
// Debug echo "fertig " . $word . '<br />';
$is_string = FALSE;
} // end if
if (!isset($is_string) || $is_string == FALSE) {
// No String
if (eregi($sfuncs, $word)) {
$word = '<font color="' . $cfg['colorFunctions'].'">' . htmlspecialchars($word) . '</font>';
} else if (eregi($skeyw, $word)) {
$word = '<font color="' . $cfg['colorKeywords'].'">' . htmlspecialchars($word) . '</font>';
if (!isset($mult) || $mult != TRUE) {
$word = "\n" . $word;
}
} else if (eregi($scoltype, $word)) {
$word = '<font color="' . $cfg['colorColType'].'">' . htmlspecialchars($word) . '</font>';
} else if (eregi($add, $word)) {
$word = '<font color="' . $cfg['colorAdd'].'">' . htmlspecialchars($word) . '</font>';
} else if ($word == '(') {
if (isset($brack_o)) {
$skey = count($brack_o);
} else {
$skey = 0;
}
$brack_o[$skey] = $s_nr;
} else if ($word == ')') {
if (isset($brack_o)) {
unset($brack_o[count($brack_o) - 1]);
if (count($brack_o) == 0) {
unset($brack_o);
}
} else {
$brack_c[] = $s_nr;
}
} else if ($word == ';') {
$word = ';' . "\n";
}
} }
if (!isset($temp) || strlen($temp) == 0) { $formattedSQL = '';
$sql_p[$s_nr] = $word;
$s_nr++;
}
} // end while
if (isset($brack_o)) { switch($cfg['SQP']['fmtType']) {
while (list($num, $elem) = each($brack_o)) { case 'none':
$sql_p[$elem] = '<font color="red">' . $sql_p[$elem] . '</font>'; $formattedSQL = PMA_SQP_FormatNone($ParsedSQL);
echo '<br /><font color="red">' . $GLOBALS['strMissingBracket'] . '</font><br />'; break;
} case 'html':
$formattedSQL = PMA_SQP_FormatHTML($ParsedSQL);
break;
case 'text':
$formattedSQL = PMA_SQP_FormatText($ParsedSQL);
break;
default:
break;
} }
if (isset($brack_c)) { return $formattedSQL;
while (list($num, $elem) = each($brack_c)) {
$sql_p[$elem] = '<font color="red">' . $sql_p[$elem] . '</font>';
echo '<br /><font color="red">' . $GLOBALS['strMissingBracket'] . '</font><br />';
}
}
$sql = implode(' ', $_sql_p);
$sql = ereg_replace("((\015\012)|(\015)|(\012))+", '<br />', $sql);
$sql = ereg_replace('<br />[ ]*<br />', '<br />', $sql);
return $sql;
} // end of the "PMA_format_sql()" function } // end of the "PMA_format_sql()" function
@@ -394,13 +314,13 @@ h1 {font-family: sans-serif; font-size: large; font-weight: bold}
$the_query = $GLOBALS['sql_query']; $the_query = $GLOBALS['sql_query'];
} }
$ParsedSQL = PMA_SQP_Parse($the_query);
echo '<p><b>'. $GLOBALS['strError'] . '</b></p>' . "\n"; echo '<p><b>'. $GLOBALS['strError'] . '</b></p>' . "\n";
// if the config password is wrong, or the MySQL server does not // if the config password is wrong, or the MySQL server does not
// respond, do not show the query that would reveal the // respond, do not show the query that would reveal the
// username/password // username/password
if (!empty($the_query) && !strstr($the_query, 'connect')) { if (!empty($the_query) && !strstr($the_query, 'connect')) {
$query_base = htmlspecialchars($the_query);
$query_base = ereg_replace("((\015\012)|(\015)|(\012)){3,}", "\n\n", $query_base);
echo '<p>' . "\n"; echo '<p>' . "\n";
echo ' ' . $GLOBALS['strSQLQuery'] . '&nbsp;:&nbsp;' . "\n"; echo ' ' . $GLOBALS['strSQLQuery'] . '&nbsp;:&nbsp;' . "\n";
if ($is_modify_link) { if ($is_modify_link) {
@@ -410,7 +330,7 @@ h1 {font-family: sans-serif; font-size: large; font-weight: bold}
} // end if } // end if
echo '</p>' . "\n" echo '</p>' . "\n"
. '<p>' . "\n" . '<p>' . "\n"
. ' ' . ($cfg['UseSyntaxColoring'] ? PMA_format_sql($query_base) : $query_base) . "\n" . ' ' . PMA_format_sql($ParsedSQL) . "\n"
. '</p>' . "\n"; . '</p>' . "\n";
} // end if } // end if
if (!empty($error_message)) { if (!empty($error_message)) {
@@ -1192,9 +1112,9 @@ if (typeof(document.getElementById) != 'undefined'
$sqlnr = 1; $sqlnr = 1;
if (!empty($GLOBALS['show_as_php'])) { if (!empty($GLOBALS['show_as_php'])) {
$new_line = '&quot;;<br />' . "\n" . ' $sql .= &quot;'; $new_line = '&quot;;<br />' . "\n" . ' $sql .= &quot;';
} else if ($cfg['UseSyntaxColoring'] == FALSE) { } /* else if ($cfg['UseSyntaxColoring'] == FALSE) {
$new_line = '<br />' . "\n"; $new_line = '<br />' . "\n";
} } */
if (isset($new_line)) { if (isset($new_line)) {
$query_base = htmlspecialchars($GLOBALS['sql_query']); $query_base = htmlspecialchars($GLOBALS['sql_query']);
$query_base = ereg_replace("((\015\012)|(\015)|(\012))+", $new_line, $query_base); $query_base = ereg_replace("((\015\012)|(\015)|(\012))+", $new_line, $query_base);
@@ -1203,8 +1123,10 @@ if (typeof(document.getElementById) != 'undefined'
} }
if (!empty($GLOBALS['show_as_php'])) { if (!empty($GLOBALS['show_as_php'])) {
$query_base = '$sql = &quot;' . $query_base; $query_base = '$sql = &quot;' . $query_base;
} else if ($cfg['UseSyntaxColoring']) { // } else d$if ($cfg['UseSyntaxColoring']) {
$query_base = PMA_format_sql($query_base); } else {
$ParsedSQL = PMA_SQP_Parse($query_base);
$query_base = PMA_format_sql($ParsedSQL);
} }
// Prepares links that may be displayed to edit/explain the query // Prepares links that may be displayed to edit/explain the query
@@ -1258,11 +1180,7 @@ if (typeof(document.getElementById) != 'undefined'
// If a 'LIMIT' clause has been programatically added to the query // If a 'LIMIT' clause has been programatically added to the query
// displays it // displays it
if (!empty($GLOBALS['sql_limit_to_append'])) { if (!empty($GLOBALS['sql_limit_to_append'])) {
if($cfg['UseSyntaxColoring']) { echo PMA_format_sql(PMA_SQP_Parse($GLOBALS['sql_limit_to_append']));
echo PMA_format_sql($GLOBALS['sql_limit_to_append']);
} else {
echo $GLOBALS['sql_limit_to_append'];
}
} }
if (!empty($GLOBALS['show_as_php'])) { if (!empty($GLOBALS['show_as_php'])) {
echo '&quot;;'; echo '&quot;;';

View File

@@ -183,6 +183,7 @@ if (!defined('PMA_SQP_DATA_INCLUDED')) {
'AGGREGATE', 'AGGREGATE',
'ALL', 'ALL',
'ALTER', 'ALTER',
'ANALYSE',
'ANALYZE', 'ANALYZE',
'AND', 'AND',
'AS', 'AS',

View File

@@ -32,8 +32,16 @@
if (!defined('PMA_SQP_LIB_INCLUDED')) { if (!defined('PMA_SQP_LIB_INCLUDED')) {
define('PMA_SQP_LIB_INCLUDED', 1); define('PMA_SQP_LIB_INCLUDED', 1);
require('./libraries/string.lib.php3');
require('./libraries/sqlparser.data.php3'); /**
* Include the string libarry as we use it heavily
*/
include('./libraries/string.lib.php3');
/**
* Include data for the SQL Parser
*/
include('./libraries/sqlparser.data.php3');
if (!defined('DEBUGTIMING')) { if (!defined('DEBUGTIMING')) {
function PMA_SQP_ArrayAdd(&$arr,$type,$data, &$arrsize) function PMA_SQP_ArrayAdd(&$arr,$type,$data, &$arrsize)
@@ -54,10 +62,20 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
function PMA_SQP_Parse($sql) function PMA_SQP_Parse($sql)
{ {
global $cfg;
// if the SQL parser is disabled
// just return the original query string
if($cfg['SQP']['enable'] == FALSE) {
echo 'FALSE';
return $sql;
}
$len = strlen($sql); $len = strlen($sql);
if ($len == 0) { if ($len == 0) {
return array(); return array();
} }
$sql_array = array(); $sql_array = array();
$sql_array['raw'] = $sql; $sql_array['raw'] = $sql;
$count1 = 0; $count1 = 0;
@@ -369,6 +387,7 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
if ($arraysize > 0) { if ($arraysize > 0) {
$t_next = $sql_array[0]['type']; $t_next = $sql_array[0]['type'];
$t_prev = NULL; $t_prev = NULL;
$t_cur = NULL;
} }
for($i = 0; $i < $arraysize; $i++) { for($i = 0; $i < $arraysize; $i++) {
@@ -520,6 +539,7 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
'INTO', 'INTO',
'KEY', 'KEY',
'PRIMARY', 'PRIMARY',
'PROCEDURE',
'REFERENCES', 'REFERENCES',
'UNIQUE' 'UNIQUE'
); );
@@ -658,6 +678,8 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
case 'DROP': case 'DROP':
case 'UPDATE': case 'UPDATE':
case 'TRUNCATE': case 'TRUNCATE':
case 'ANALYZE':
case 'ANALYSE':
$space_punct_listsep = '<br />'; $space_punct_listsep = '<br />';
$space_alpha_reservedWord = ' '; $space_alpha_reservedWord = ' ';
break; break;
@@ -694,6 +716,14 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
$after .= ' '; $after .= ' ';
} }
break; break;
case 'quote_backtick':
if ($typearr[3] != 'punct_qualifier') {
$after .= ' ';
}
if ($typearr[1] != 'punct_qualifier') {
$before .= ' ';
}
break;
default: default:
break; break;
} }
@@ -716,32 +746,30 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
function PMA_SQP_BuildCssData() function PMA_SQP_BuildCssData()
{ {
global $cfg; global $cfg;
$css_string = <<<EOD $css_string = '';
.syntax { font-family: sans-serif; font-size: small; } foreach($cfg['SQP']['fmtColor'] as $key => $col) {
.syntax_comment { }
.syntax_digit { }
.syntax_digit_hex { }
.syntax_digit_integer { }
.syntax_digit_float { }
.syntax_punct { }
.syntax_alpha { text-transform: lowercase; }
.syntax_alpha_columnType { text-transform: uppercase; }
.syntax_alpha_columnAttrib { text-transform: uppercase; }
.syntax_alpha_reservedWord { text-transform: uppercase; font-weight: bold; }
.syntax_alpha_functionName { text-transform: uppercase; }
.syntax_alpha_identifier { }
.syntax_alpha_variable { }
.syntax_quote { }
.syntax_quote_backtick { }
EOD;
foreach($cfg['SQP']['fmt']['color'] as $key => $col) {
$css_string .= PMA_SQP_BuildCssRule('syntax_'.$key, 'color', $col); $css_string .= PMA_SQP_BuildCssRule('syntax_'.$key, 'color', $col);
} }
for($i = 0; $i < 8; $i++) { for($i = 0; $i < 8; $i++) {
$css_string .= PMA_SQP_BuildCssRule('syntax_indent'.$i, 'margin-left', ($i * $cfg['SQP']['fmt']['indent']).$cfg['SQP']['fmt']['indentunits']); $css_string .= PMA_SQP_BuildCssRule('syntax_indent'.$i, 'margin-left', ($i * $cfg['SQP']['fmtInd']).$cfg['SQP']['fmtIndUnit']);
} }
return $css_string; return $css_string;
} }
function PMA_SQP_FormatNone($arr)
{
$formattedSQL = htmlspecialchars($arr['raw']);
$formattedSQL = ereg_replace("((\015\012)|(\015)|(\012)){3,}", "\n\n", $formattedSQL);
return $formattedSQL;
}
function PMA_SQP_FormatText($arr)
{
/**
* TODO WRITE THIS!
*/
return PMA_SQP_FormatNone($arr);
}
} // $__PMA_SQP_LIB__ } // $__PMA_SQP_LIB__