123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- <?php
- namespace PhpMyAdmin;
- use PhpMyAdmin\SqlParser\Lexer;
- use PhpMyAdmin\SqlParser\Parser;
- use PhpMyAdmin\SqlParser\UtfString;
- use PhpMyAdmin\SqlParser\Utils\Error as ParserError;
- class Linter
- {
-
- public static function getLines($str)
- {
- if ((!($str instanceof UtfString))
- && (defined('USE_UTF_STRINGS')) && (USE_UTF_STRINGS)
- ) {
-
-
-
- $str = new UtfString($str);
- }
-
-
-
-
-
-
-
-
-
-
-
-
- $len = ($str instanceof UtfString) ?
- $str->length() : strlen($str);
- $lines = array(0);
- for ($i = 0; $i < $len; ++$i) {
- if ($str[$i] === "\n") {
- $lines[] = $i + 1;
- }
- }
- return $lines;
- }
-
- public static function findLineNumberAndColumn(array $lines, $pos)
- {
- $line = 0;
- foreach ($lines as $lineNo => $lineStart) {
- if ($lineStart > $pos) {
- break;
- }
- $line = $lineNo;
- }
- return array($line, $pos - $lines[$line]);
- }
-
- public static function lint($query)
- {
-
- if (mb_strlen($query) > 10000) {
- return array(
- array(
- 'message' => __(
- 'Linting is disabled for this query because it exceeds the '
- . 'maximum length.'
- ),
- 'fromLine' => 0,
- 'fromColumn' => 0,
- 'toLine' => 0,
- 'toColumn' => 0,
- 'severity' => 'warning',
- )
- );
- }
-
- $lexer = new Lexer($query);
-
- $parser = new Parser($lexer->list);
-
- $errors = ParserError::get(array($lexer, $parser));
-
- $response = array();
-
- $lines = static::getLines($query);
-
- foreach ($errors as $idx => $error) {
-
- list($fromLine, $fromColumn) = static::findLineNumberAndColumn(
- $lines, $error[3]
- );
-
- list($toLine, $toColumn) = static::findLineNumberAndColumn(
- $lines, $error[3] + mb_strlen($error[2])
- );
-
- $response[] = array(
- 'message' => sprintf(
- __('%1$s (near <code>%2$s</code>)'),
- htmlspecialchars($error[0]), htmlspecialchars($error[2])
- ),
- 'fromLine' => $fromLine,
- 'fromColumn' => $fromColumn,
- 'toLine' => $toLine,
- 'toColumn' => $toColumn,
- 'severity' => 'error',
- );
- }
-
- return $response;
- }
- }
|