[import] Speed optimization to be able to import the sakila database

This commit is contained in:
Marc Delisle
2008-07-14 15:28:58 +00:00
parent d637fab135
commit 29d7c3e2f8
2 changed files with 18 additions and 47 deletions

View File

@@ -66,6 +66,7 @@ danbarry
+ [GUI] Color picker (work in progress, now just for original theme) + [GUI] Color picker (work in progress, now just for original theme)
- bug #1970836 [parser] SQL parser is slow, thanks to Christian Schmidt - bug #1970836 [parser] SQL parser is slow, thanks to Christian Schmidt
+ rfe #1692928 [transformation] Option to disable browser transformations + rfe #1692928 [transformation] Option to disable browser transformations
+ [import] Speed optimization to be able to import the sakila database
2.11.8.0 (not yet released) 2.11.8.0 (not yet released)
- patch #1987593 [interface] Table list pagination in navi, - patch #1987593 [interface] Table list pagination in navi,

View File

@@ -48,6 +48,8 @@ $sql = '';
$start_pos = 0; $start_pos = 0;
$i = 0; $i = 0;
$len= 0; $len= 0;
$big_value = 2147483647;
if (isset($_POST['sql_delimiter'])) { if (isset($_POST['sql_delimiter'])) {
$sql_delimiter = $_POST['sql_delimiter']; $sql_delimiter = $_POST['sql_delimiter'];
} else { } else {
@@ -86,72 +88,40 @@ while (!($GLOBALS['finished'] && $i >= $len) && !$error && !$timeout_passed) {
} }
// Current length of our buffer // Current length of our buffer
$len = strlen($buffer); $len = strlen($buffer);
// prepare an uppercase copy of buffer for Windows because at least
// on PHP 5.2.5, stripos() is very slow
if (PMA_IS_WINDOWS) {
$buffer_upper = strtoupper($buffer);
}
// Grab some SQL queries out of it // Grab some SQL queries out of it
while ($i < $len) { while ($i < $len) {
$found_delimiter = false; $found_delimiter = false;
// Find first interesting character, several strpos seem to be faster than simple loop in php: // Find first interesting character
//while (($i < $len) && (strpos('\'";#-/', $buffer[$i]) === FALSE)) $i++; $old_i = $i;
//if ($i == $len) break; // this is about 7 times faster that looking for each sequence i
$oi = $i; // one by one with strpos()
$big_value = 2147483647; if (preg_match('/(\'|"|#|-- |\/\*|`|(?i)DELIMITER)/', $buffer, $matches, PREG_OFFSET_CAPTURE, $i)) {
$first_quote = strpos($buffer, '\'', $i); // in $matches, index 0 contains the match for the complete
if ($first_quote === FALSE) { // expression but we don't use it
$first_quote = $big_value; $first_position = $matches[1][1];
} } else {
$p2 = strpos($buffer, '"', $i); $first_position = $big_value;
if ($p2 === FALSE) {
$p2 = $big_value;
} }
/** /**
* @todo it's a shortcoming to look for a delimiter that might be * @todo we should not look for a delimiter that might be
* inside quotes (or even double-quotes) * inside quotes (or even double-quotes)
*/ */
// the cost of doing this one with preg_match() would be too high
$first_sql_delimiter = strpos($buffer, $sql_delimiter, $i); $first_sql_delimiter = strpos($buffer, $sql_delimiter, $i);
if ($first_sql_delimiter === FALSE) { if ($first_sql_delimiter === FALSE) {
$first_sql_delimiter = $big_value; $first_sql_delimiter = $big_value;
} else { } else {
$found_delimiter = true; $found_delimiter = true;
} }
$p4 = strpos($buffer, '#', $i);
if ($p4 === FALSE) {
$p4 = $big_value;
}
$p5 = strpos($buffer, '--', $i);
if ($p5 === FALSE || $p5 >= ($len - 2) || $buffer[$p5 + 2] > ' ') {
$p5 = $big_value;
}
$p6 = strpos($buffer, '/*', $i);
if ($p6 === FALSE) {
$p6 = $big_value;
}
$p7 = strpos($buffer, '`', $i);
if ($p7 === FALSE) {
$p7 = $big_value;
}
// catch also "delimiter"
// stripos() very slow on Windows (at least on PHP 5.2.5)
if (! PMA_IS_WINDOWS) {
$p8 = stripos($buffer, 'DELIMITER', $i);
} else {
$p8 = strpos($buffer_upper, 'DELIMITER', $i);
}
if ($p8 === FALSE || $p8 >= ($len - 11) || $buffer[$p8 + 9] > ' ') {
$p8 = $big_value;
}
// set $i to the position of the first quote, comment.start or delimiter found // set $i to the position of the first quote, comment.start or delimiter found
$i = min($first_quote, $p2, $first_sql_delimiter, $p4, $p5, $p6, $p7, $p8); $i = min($first_position, $first_sql_delimiter);
unset($first_quote, $p2, $p4, $p5, $p6, $p7, $p8);
if ($i == $big_value) { if ($i == $big_value) {
// none of the above was found in the string // none of the above was found in the string
$i = $oi; $i = $old_i;
if (!$GLOBALS['finished']) { if (!$GLOBALS['finished']) {
break; break;
} }