diff options
author | Dan Ungureanu <udan1107@gmail.com> | 2015-07-15 18:08:18 +0300 |
---|---|---|
committer | Dan Ungureanu <udan1107@gmail.com> | 2015-07-15 18:08:18 +0300 |
commit | 024d96700d7aa8601687ebbc5a14bfbd103d7d56 (patch) | |
tree | cb349f92e762c0f38c9b2aa329e7ba1e322c3a01 /lint.php | |
parent | 4c24db081295ad034c0a7c52694d7612d9893761 (diff) |
Reorganized code.
Fixed a bug that miscalculated the position of the tokens.
Added tests.
Signed-off-by: Dan Ungureanu <udan1107@gmail.com>
Diffstat (limited to 'lint.php')
-rw-r--r-- | lint.php | 136 |
1 files changed, 10 insertions, 126 deletions
@@ -1,137 +1,21 @@ <?php - -// Loads the SQL lexer and parser, which are used to parse this error to detect -// any errors. -require_once 'libraries/sql-parser/autoload.php'; - +/* vim: set expandtab sw=4 ts=4 sts=4: */ /** - * Gets the starting position of each line. + * Represents the interface between the linter and the query editor. * - * @param string $str String to be analyzed. - * - * @return array + * @package PhpMyAdmin */ -function getLines($str) -{ - $lines = array(0); - for ($i = 0, $len = strlen($str); $i < $len; ++$i) { - if ($str[$i] === "\n") { - $lines[] = $i; - } - } - return $lines; -} + +define('PHPMYADMIN', true); /** - * Computes the number of the line and column given an absolute position. - * - * @param array $lines The starting position of each line. - * @param int $pos The absolute position - * - * @return void + * Loads the SQL lexer and parser, which are used to detect errors. */ -function findLineNumberAndColumn($lines, $pos) -{ - $line = 0; - foreach ($lines as $lineNo => $lineStart) { - if ($lineStart >= $pos) { - break; - } - $line = $lineNo; - } - return array($line, $pos - $lines[$line]); -} +require_once 'libraries/sql-parser/autoload.php'; /** - * Runs the linting process. - * - * @param string $query The query to be checked. - * - * @return void + * Loads the linter. */ -function linter($query) -{ - // Disabling lint for huge queries to save some resources. - if (strlen($query) > 10000) { - echo json_encode( - array( - array( - 'message' => 'The linting is disabled for this query because it exceededs the maxmimum length', - 'fromLine' => 0, - 'fromColumn' => 0, - 'toLine' => 0, - 'toColumn' => 0, - 'severity' => 'warning', - ) - ) - ); - return; - } - - /** - * Lexer used for tokenizing the query. - * - * @var SqlParser\Lexer - */ - $lexer = new SqlParser\Lexer($query); - - /** - * Parsed used for analysing the query. - * - * @var SqlParser\Parser - */ - $parser = new SqlParser\Parser($lexer->list); - - /** - * Array containing all errors. - * - * @var array - */ - $errors = SqlParser\Utils\Error::get(array($lexer, $parser)); - - /** - * The response containing of all errors. - * - * @var array - */ - $response = array(); - - /** - * The starting position for each line. - * - * CodeMirror requires relative position to line, but the parser stores - * only the absolute position of the character in string. - * - * @var array - */ - $lines = getLines($query); - - // Building the response. - foreach ($errors as $idx => $error) { - - // Starting position of the string that caused the error. - list($fromLine, $fromColumn) = findLineNumberAndColumn( - $lines, $error[3] - ); - - // Ending position of the string that caused the error. - list($toLine, $toColumn) = findLineNumberAndColumn( - $lines, $error[3] + strlen($error[2]) - ); - - // Building the response. - $response[] = array( - 'message' => $error[0] . ' (near <code>' . $error[2] . '</code>)', - 'fromLine' => $fromLine, - 'fromColumn' => $fromColumn, - 'toLine' => $toLine, - 'toColumn' => $toColumn, - 'severity' => 'error', - ); - } - - // Sending back the answer. - echo json_encode($response); -} +require_once 'libraries/Linter.class.php'; -linter($_REQUEST['sql_query']); +PMA_Linter::lint($_REQUEST['sql_query']); |