<?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 ; insideif ((strpos($buffer, ';') === FALSE) && !$finished) {continue;}}// Current length of our buffer$len = strlen($buffer);// Grab some SQL queries out of itwhile ($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];// Quotesif (!(strpos('\'"`', $ch) === FALSE)) {$quote = $ch;$endq = FALSE;while (!$endq) {// Find next quote$pos = strpos($buffer, $quote, $i + 1);// No quote? Too short stringif ($pos === FALSE) {// We hit end of string => unclosed quote, but we handle it as end of queryif ($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 decideif ((($i == ($len - 1) && ($ch == '-' || $ch == '/'))|| ($i == ($len - 2) && (($ch == '-' && $buffer[$i + 1] == '-') || ($ch == '/' && $buffer[$i + 1] == '*')))) && !$finished) {break;}// Commentsif ($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 SQLif ($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 SQLif ($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 SQLif (!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 buffersPMA_importRunQuery('', substr($buffer, 0, $len));PMA_importRunQuery();}?>