return also works for includes ... so don't mess with intends
This commit is contained in:
@@ -25,240 +25,242 @@ if (isset($plugin_list)) {
|
||||
array('type' => 'select', 'name' => 'compatibility', 'text' => 'strSQLCompatibility', 'values' => $values, 'doc' => array('manual_MySQL_Database_Administration', 'Server_SQL_mode'))
|
||||
);
|
||||
}
|
||||
} else {
|
||||
/* We do not define function when plugin is just queried for information above */
|
||||
$buffer = '';
|
||||
// Defaults for parser
|
||||
$sql = '';
|
||||
$start_pos = 0;
|
||||
$i = 0;
|
||||
$len= 0;
|
||||
if (isset($_POST['sql_delimiter'])) {
|
||||
$sql_delimiter = $_POST['sql_delimiter'];
|
||||
} else {
|
||||
$sql_delimiter = ';';
|
||||
}
|
||||
|
||||
// Handle compatibility option
|
||||
if (isset($_REQUEST['sql_compatibility'])) {
|
||||
PMA_DBI_try_query('SET SQL_MODE="' . $_REQUEST['sql_compatibility'] . '"');
|
||||
/* We do not define function when plugin is just queried for information above */
|
||||
return;
|
||||
}
|
||||
|
||||
$buffer = '';
|
||||
// Defaults for parser
|
||||
$sql = '';
|
||||
$start_pos = 0;
|
||||
$i = 0;
|
||||
$len= 0;
|
||||
if (isset($_POST['sql_delimiter'])) {
|
||||
$sql_delimiter = $_POST['sql_delimiter'];
|
||||
} else {
|
||||
$sql_delimiter = ';';
|
||||
}
|
||||
|
||||
// Handle compatibility option
|
||||
if (isset($_REQUEST['sql_compatibility'])) {
|
||||
PMA_DBI_try_query('SET SQL_MODE="' . $_REQUEST['sql_compatibility'] . '"');
|
||||
}
|
||||
while (!($finished && $i >= $len) && !$error && !$timeout_passed) {
|
||||
$data = PMA_importGetNextChunk();
|
||||
if ($data === FALSE) {
|
||||
// subtract data we didn't handle yet and stop processing
|
||||
$offset -= strlen($buffer);
|
||||
break;
|
||||
} elseif ($data === TRUE) {
|
||||
// Handle rest of buffer
|
||||
} else {
|
||||
// Append new data to buffer
|
||||
$buffer .= $data;
|
||||
// free memory
|
||||
unset($data);
|
||||
// Do not parse string when we're not at the end and don't have ; inside
|
||||
if ((strpos($buffer, $sql_delimiter, $i) === FALSE) && !$finished) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
while (!($finished && $i >= $len) && !$error && !$timeout_passed) {
|
||||
$data = PMA_importGetNextChunk();
|
||||
if ($data === FALSE) {
|
||||
// subtract data we didn't handle yet and stop processing
|
||||
$offset -= strlen($buffer);
|
||||
break;
|
||||
} elseif ($data === TRUE) {
|
||||
// Handle rest of buffer
|
||||
// Current length of our buffer
|
||||
$len = strlen($buffer);
|
||||
// Grab some SQL queries out of it
|
||||
while ($i < $len) {
|
||||
$found_delimiter = false;
|
||||
// Find first interesting character, several strpos seem to be faster than simple loop in php:
|
||||
//while (($i < $len) && (strpos('\'";#-/', $buffer[$i]) === FALSE)) $i++;
|
||||
//if ($i == $len) break;
|
||||
$oi = $i;
|
||||
$p1 = strpos($buffer, '\'', $i);
|
||||
if ($p1 === FALSE) {
|
||||
$p1 = 2147483647;
|
||||
}
|
||||
$p2 = strpos($buffer, '"', $i);
|
||||
if ($p2 === FALSE) {
|
||||
$p2 = 2147483647;
|
||||
}
|
||||
$p3 = strpos($buffer, $sql_delimiter, $i);
|
||||
if ($p3 === FALSE) {
|
||||
$p3 = 2147483647;
|
||||
} else {
|
||||
// Append new data to buffer
|
||||
$buffer .= $data;
|
||||
// free memory
|
||||
unset($data);
|
||||
// Do not parse string when we're not at the end and don't have ; inside
|
||||
if ((strpos($buffer, $sql_delimiter, $i) === FALSE) && !$finished) {
|
||||
$found_delimiter = true;
|
||||
}
|
||||
$p4 = strpos($buffer, '#', $i);
|
||||
if ($p4 === FALSE) {
|
||||
$p4 = 2147483647;
|
||||
}
|
||||
$p5 = strpos($buffer, '--', $i);
|
||||
if ($p5 === FALSE || $p5 >= ($len - 2) || $buffer[$p5 + 2] > ' ') {
|
||||
$p5 = 2147483647;
|
||||
}
|
||||
$p6 = strpos($buffer, '/*', $i);
|
||||
if ($p6 === FALSE) {
|
||||
$p6 = 2147483647;
|
||||
}
|
||||
$p7 = strpos($buffer, '`', $i);
|
||||
if ($p7 === FALSE) {
|
||||
$p7 = 2147483647;
|
||||
}
|
||||
$p8 = strpos($buffer, 'DELIMITER', $i);
|
||||
if ($p8 === FALSE || $p8 >= ($len - 11) || $buffer[$p8 + 9] > ' ') {
|
||||
$p8 = 2147483647;
|
||||
}
|
||||
$i = min ($p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8);
|
||||
unset($p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8);
|
||||
if ($i == 2147483647) {
|
||||
$i = $oi;
|
||||
if (!$finished) {
|
||||
break;
|
||||
}
|
||||
// at the end there might be some whitespace...
|
||||
if (trim($buffer) == '') {
|
||||
$buffer = '';
|
||||
$len = 0;
|
||||
break;
|
||||
}
|
||||
// We hit end of query, go there!
|
||||
$i = strlen($buffer) - 1;
|
||||
}
|
||||
|
||||
// Grab current character
|
||||
$ch = $buffer[$i];
|
||||
|
||||
// Quotes
|
||||
if (strpos('\'"`', $ch) !== FALSE) {
|
||||
$quote = $ch;
|
||||
$endq = FALSE;
|
||||
while (!$endq) {
|
||||
// Find next quote
|
||||
$pos = strpos($buffer, $quote, $i + 1);
|
||||
// No quote? Too short string
|
||||
if ($pos === FALSE) {
|
||||
// We hit end of string => unclosed quote, but we handle it as end of query
|
||||
if ($finished) {
|
||||
$endq = TRUE;
|
||||
$i = $len - 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Was not the quote escaped?
|
||||
$j = $pos - 1;
|
||||
while ($buffer[$j] == '\\') $j--;
|
||||
// Even count means it was not escaped
|
||||
$endq = (((($pos - 1) - $j) % 2) == 0);
|
||||
// Skip the string
|
||||
$i = $pos;
|
||||
}
|
||||
if (!$endq) {
|
||||
break;
|
||||
}
|
||||
$i++;
|
||||
// Aren't we at the end?
|
||||
if ($finished && $i == $len) {
|
||||
$i--;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Current length of our buffer
|
||||
$len = strlen($buffer);
|
||||
// Grab some SQL queries out of it
|
||||
while ($i < $len) {
|
||||
$found_delimiter = false;
|
||||
// Find first interesting character, several strpos seem to be faster than simple loop in php:
|
||||
//while (($i < $len) && (strpos('\'";#-/', $buffer[$i]) === FALSE)) $i++;
|
||||
//if ($i == $len) break;
|
||||
$oi = $i;
|
||||
$p1 = strpos($buffer, '\'', $i);
|
||||
if ($p1 === FALSE) {
|
||||
$p1 = 2147483647;
|
||||
}
|
||||
$p2 = strpos($buffer, '"', $i);
|
||||
if ($p2 === FALSE) {
|
||||
$p2 = 2147483647;
|
||||
}
|
||||
$p3 = strpos($buffer, $sql_delimiter, $i);
|
||||
if ($p3 === FALSE) {
|
||||
$p3 = 2147483647;
|
||||
} else {
|
||||
$found_delimiter = true;
|
||||
}
|
||||
$p4 = strpos($buffer, '#', $i);
|
||||
if ($p4 === FALSE) {
|
||||
$p4 = 2147483647;
|
||||
}
|
||||
$p5 = strpos($buffer, '--', $i);
|
||||
if ($p5 === FALSE || $p5 >= ($len - 2) || $buffer[$p5 + 2] > ' ') {
|
||||
$p5 = 2147483647;
|
||||
}
|
||||
$p6 = strpos($buffer, '/*', $i);
|
||||
if ($p6 === FALSE) {
|
||||
$p6 = 2147483647;
|
||||
}
|
||||
$p7 = strpos($buffer, '`', $i);
|
||||
if ($p7 === FALSE) {
|
||||
$p7 = 2147483647;
|
||||
}
|
||||
$p8 = strpos($buffer, 'DELIMITER', $i);
|
||||
if ($p8 === FALSE || $p8 >= ($len - 11) || $buffer[$p8 + 9] > ' ') {
|
||||
$p8 = 2147483647;
|
||||
}
|
||||
$i = min ($p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8);
|
||||
unset($p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8);
|
||||
if ($i == 2147483647) {
|
||||
$i = $oi;
|
||||
if (!$finished) {
|
||||
break;
|
||||
}
|
||||
// at the end there might be some whitespace...
|
||||
if (trim($buffer) == '') {
|
||||
$buffer = '';
|
||||
$len = 0;
|
||||
break;
|
||||
}
|
||||
// We hit end of query, go there!
|
||||
$i = strlen($buffer) - 1;
|
||||
}
|
||||
|
||||
// Grab current character
|
||||
$ch = $buffer[$i];
|
||||
// Not enough data to decide
|
||||
if ((($i == ($len - 1) && ($ch == '-' || $ch == '/'))
|
||||
|| ($i == ($len - 2) && (($ch == '-' && $buffer[$i + 1] == '-')
|
||||
|| ($ch == '/' && $buffer[$i + 1] == '*')))) && !$finished) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Quotes
|
||||
if (strpos('\'"`', $ch) !== FALSE) {
|
||||
$quote = $ch;
|
||||
$endq = FALSE;
|
||||
while (!$endq) {
|
||||
// Find next quote
|
||||
$pos = strpos($buffer, $quote, $i + 1);
|
||||
// No quote? Too short string
|
||||
if ($pos === FALSE) {
|
||||
// We hit end of string => unclosed quote, but we handle it as end of query
|
||||
if ($finished) {
|
||||
$endq = TRUE;
|
||||
$i = $len - 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Was not the quote escaped?
|
||||
$j = $pos - 1;
|
||||
while ($buffer[$j] == '\\') $j--;
|
||||
// Even count means it was not escaped
|
||||
$endq = (((($pos - 1) - $j) % 2) == 0);
|
||||
// Skip the string
|
||||
$i = $pos;
|
||||
}
|
||||
if (!$endq) {
|
||||
break;
|
||||
}
|
||||
$i++;
|
||||
// Aren't we at the end?
|
||||
if ($finished && $i == $len) {
|
||||
$i--;
|
||||
// Comments
|
||||
if ($ch == '#'
|
||||
|| ($i < ($len - 1) && $ch == '-' && $buffer[$i + 1] == '-' && (($i < ($len - 2) && $buffer[$i + 2] <= ' ') || ($i == ($len - 1) && $finished)))
|
||||
|| ($i < ($len - 1) && $ch == '/' && $buffer[$i + 1] == '*')
|
||||
) {
|
||||
// Copy current string to SQL
|
||||
if ($start_pos != $i) {
|
||||
$sql .= substr($buffer, $start_pos, $i - $start_pos);
|
||||
}
|
||||
// Skip the rest
|
||||
$j = $i;
|
||||
$i = strpos($buffer, $ch == '/' ? '*/' : "\n", $i);
|
||||
// didn't we hit end of string?
|
||||
if ($i === FALSE) {
|
||||
if ($finished) {
|
||||
$i = $len - 1;
|
||||
} else {
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Not enough data to decide
|
||||
if ((($i == ($len - 1) && ($ch == '-' || $ch == '/'))
|
||||
|| ($i == ($len - 2) && (($ch == '-' && $buffer[$i + 1] == '-')
|
||||
|| ($ch == '/' && $buffer[$i + 1] == '*')))) && !$finished) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Comments
|
||||
if ($ch == '#'
|
||||
|| ($i < ($len - 1) && $ch == '-' && $buffer[$i + 1] == '-' && (($i < ($len - 2) && $buffer[$i + 2] <= ' ') || ($i == ($len - 1) && $finished)))
|
||||
|| ($i < ($len - 1) && $ch == '/' && $buffer[$i + 1] == '*')
|
||||
) {
|
||||
// Copy current string to SQL
|
||||
if ($start_pos != $i) {
|
||||
$sql .= substr($buffer, $start_pos, $i - $start_pos);
|
||||
}
|
||||
// Skip the rest
|
||||
$j = $i;
|
||||
$i = strpos($buffer, $ch == '/' ? '*/' : "\n", $i);
|
||||
// didn't we hit end of string?
|
||||
if ($i === FALSE) {
|
||||
if ($finished) {
|
||||
$i = $len - 1;
|
||||
// Skip *
|
||||
if ($ch == '/') {
|
||||
// Check for MySQL conditional comments and include them as-is
|
||||
if ($buffer[$j + 2] == '!') {
|
||||
$comment = substr($buffer, $j + 3, $i - $j - 3);
|
||||
if (preg_match('/^[0-9]{5}/', $comment, $version)) {
|
||||
if ($version[0] <= PMA_MYSQL_INT_VERSION) {
|
||||
$sql .= substr($comment, 5);
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
$sql .= $comment;
|
||||
}
|
||||
}
|
||||
// Skip *
|
||||
if ($ch == '/') {
|
||||
// Check for MySQL conditional comments and include them as-is
|
||||
if ($buffer[$j + 2] == '!') {
|
||||
$comment = substr($buffer, $j + 3, $i - $j - 3);
|
||||
if (preg_match('/^[0-9]{5}/', $comment, $version)) {
|
||||
if ($version[0] <= PMA_MYSQL_INT_VERSION) {
|
||||
$sql .= substr($comment, 5);
|
||||
}
|
||||
} else {
|
||||
$sql .= $comment;
|
||||
}
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
// Skip last char
|
||||
$i++;
|
||||
// Next query part will start here
|
||||
}
|
||||
// Skip last char
|
||||
$i++;
|
||||
// Next query part will start here
|
||||
$start_pos = $i;
|
||||
// Aren't we at the end?
|
||||
if ($i == $len) {
|
||||
$i--;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Change delimiter, if redefined, and skip it (don't send to server!)
|
||||
if ((substr($buffer, $i, 9) == "DELIMITER") && ($buffer[$i + 9] <= ' ') && ($i<$len-11) && (!(strpos($buffer,"\n",$i+11)===FALSE) )) {
|
||||
$new_line_pos = strpos($buffer, "\n", $i + 10);
|
||||
$sql_delimiter = substr($buffer, $i+10, $new_line_pos - $i -10);
|
||||
$i= $new_line_pos + 1;
|
||||
// Next query part will start here
|
||||
$start_pos = $i;
|
||||
continue;
|
||||
}
|
||||
|
||||
// End of SQL
|
||||
if ($found_delimiter || ($finished && ($i == $len - 1))) {
|
||||
$tmp_sql = $sql;
|
||||
if ($start_pos < $len) {
|
||||
$length_to_grab = $i - $start_pos;
|
||||
if (!$found_delimiter) {
|
||||
$length_to_grab++;
|
||||
}
|
||||
$tmp_sql .= substr($buffer, $start_pos, $length_to_grab);
|
||||
unset($length_to_grab);
|
||||
}
|
||||
// Do not try to execute empty SQL
|
||||
if (!preg_match('/^([\s]*;)*$/', trim($tmp_sql))) {
|
||||
$sql = $tmp_sql;
|
||||
PMA_importRunQuery($sql, substr($buffer, 0, $i + strlen($sql_delimiter)));
|
||||
$buffer = substr($buffer, $i + strlen($sql_delimiter));
|
||||
// Reset parser:
|
||||
$len = strlen($buffer);
|
||||
$sql = '';
|
||||
$i = 0;
|
||||
$start_pos = 0;
|
||||
// Any chance we will get a complete query?
|
||||
//if ((strpos($buffer, ';') === FALSE) && !$finished) {
|
||||
if ((strpos($buffer, $sql_delimiter) === FALSE) && !$finished) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
$i++;
|
||||
$start_pos = $i;
|
||||
// Aren't we at the end?
|
||||
if ($i == $len) {
|
||||
$i--;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Change delimiter, if redefined, and skip it (don't send to server!)
|
||||
if ((substr($buffer, $i, 9) == "DELIMITER") && ($buffer[$i + 9] <= ' ') && ($i<$len-11) && (!(strpos($buffer,"\n",$i+11)===FALSE) )) {
|
||||
$new_line_pos = strpos($buffer, "\n", $i + 10);
|
||||
$sql_delimiter = substr($buffer, $i+10, $new_line_pos - $i -10);
|
||||
$i= $new_line_pos + 1;
|
||||
// Next query part will start here
|
||||
$start_pos = $i;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// End of SQL
|
||||
if ($found_delimiter || ($finished && ($i == $len - 1))) {
|
||||
$tmp_sql = $sql;
|
||||
if ($start_pos < $len) {
|
||||
$length_to_grab = $i - $start_pos;
|
||||
if (!$found_delimiter) {
|
||||
$length_to_grab++;
|
||||
}
|
||||
$tmp_sql .= substr($buffer, $start_pos, $length_to_grab);
|
||||
unset($length_to_grab);
|
||||
}
|
||||
// Do not try to execute empty SQL
|
||||
if (!preg_match('/^([\s]*;)*$/', trim($tmp_sql))) {
|
||||
$sql = $tmp_sql;
|
||||
PMA_importRunQuery($sql, substr($buffer, 0, $i + strlen($sql_delimiter)));
|
||||
$buffer = substr($buffer, $i + strlen($sql_delimiter));
|
||||
// Reset parser:
|
||||
$len = strlen($buffer);
|
||||
$sql = '';
|
||||
$i = 0;
|
||||
$start_pos = 0;
|
||||
// Any chance we will get a complete query?
|
||||
//if ((strpos($buffer, ';') === FALSE) && !$finished) {
|
||||
if ((strpos($buffer, $sql_delimiter) === FALSE) && !$finished) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
$i++;
|
||||
$start_pos = $i;
|
||||
}
|
||||
}
|
||||
|
||||
} // End of parser loop
|
||||
} // End of import loop
|
||||
// Commit any possible data in buffers
|
||||
PMA_importRunQuery('', substr($buffer, 0, $len));
|
||||
PMA_importRunQuery();
|
||||
}
|
||||
} // End of parser loop
|
||||
} // End of import loop
|
||||
// Commit any possible data in buffers
|
||||
PMA_importRunQuery('', substr($buffer, 0, $len));
|
||||
PMA_importRunQuery();
|
||||
?>
|
||||
|
Reference in New Issue
Block a user