<?php
/* $Id: sql.php,v 1.10.2.1 2006/03/23 16:58:09 nijel Exp $ */
// vim: expandtab sw=4 ts=4 sts=4:
/* SQL import plugin for phpMyAdmin */
if (isset($plugin_list)) {
$plugin_list['sql'] = array(
'text' => 'strSQL',
'extension' => 'sql',
'options_text' => 'strSQLImportOptions',
);
} else {
/* We do not define function when plugin is just queried for information above */
$buffer = '';
// Defaults for parser
$sql = '';
$start_pos = 0;
$i = 0;
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;
// Do not parse string when we're not at the end and don't have ; inside
if ((strpos($buffer, ';') === FALSE) && !$finished) {
continue;
}
}
// Current length of our buffer
$len = strlen($buffer);
// Grab some SQL queries out of it
while ($i < $len) {
// 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, ';', $i);
if ($p3 === FALSE) {
$p3 = 2147483647;
}
$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;
}
$i = min ($p1, $p2, $p3, $p4, $p5, $p6, $p7);
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;
}
}
// 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
$i = strpos($buffer, $ch == '/' ? '*/' : "\n", $i);
// didn't we hit end of string?
if ($i === FALSE) {
if ($finished) {
$i = $len - 1;
} else {
break;
}
}
// Skip *
if ($ch == '/') {
$i++;
}
// 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;
}
}
// End of SQL
if ($ch == ';' || ($finished && ($i == $len - 1))) {
$tmp_sql = $sql;
if ($start_pos < $len) {
$tmp_sql .= substr($buffer, $start_pos, $i - $start_pos + 1);
}
// Do not try to execute empty SQL
if (!preg_match('/^([\s]*;)*$/', trim($tmp_sql))) {
$sql = $tmp_sql;
PMA_importRunQuery($sql, substr($buffer, 0, $i + 1));
$buffer = substr($buffer, $i + 1);
// Reset parser:
$len = strlen($buffer);
$sql = '';
$i = 0;
$start_pos = 0;
// Any chance we will get a complete query?
if ((strpos($buffer, ';') === 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();
}
?>