PHP 7.4.33
Preview: Linter.php Size: 4.99 KB
/usr/share/phpmyadmin/libraries/classes/Linter.php
<?php
/**
 * Analyzes a query and gives user feedback.
 */

declare(strict_types=1);

namespace PhpMyAdmin;

use PhpMyAdmin\SqlParser\Lexer;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\UtfString;
use PhpMyAdmin\SqlParser\Utils\Error as ParserError;

use function __;
use function defined;
use function htmlspecialchars;
use function mb_strlen;
use function sprintf;
use function strlen;

/**
 * The linter itself.
 */
class Linter
{
    /**
     * Gets the starting position of each line.
     *
     * @param string|UtfString $str String to be analyzed.
     *
     * @return array
     */
    public static function getLines($str)
    {
        if ((! ($str instanceof UtfString)) && defined('USE_UTF_STRINGS') && USE_UTF_STRINGS) {
            // If the lexer uses UtfString for processing then the position will
            // represent the position of the character and not the position of
            // the byte.
            $str = new UtfString($str);
        }

        // The reason for using the strlen is that the length
        // required is the length in bytes, not characters.
        //
        // Given the following string: `????+`, where `?` represents a
        // multi-byte character (lets assume that every `?` is a 2-byte
        // character) and `+` is a newline, the first value of `$i` is `0`
        // and the last one is `4` (because there are 5 characters). Bytes
        // `$str[0]` and `$str[1]` are the first character, `$str[2]` and
        // `$str[3]` are the second one and `$str[4]` is going to be the
        // first byte of the third character. The fourth and the last one
        // (which is actually a new line) aren't going to be processed at
        // all.
        $len = $str instanceof UtfString ?
            $str->length() : strlen($str);

        $lines = [0];
        for ($i = 0; $i < $len; ++$i) {
            if ($str[$i] !== "\n") {
                continue;
            }

            $lines[] = $i + 1;
        }

        return $lines;
    }

    /**
     * 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 array
     */
    public static function findLineNumberAndColumn(array $lines, $pos)
    {
        $line = 0;
        foreach ($lines as $lineNo => $lineStart) {
            if ($lineStart > $pos) {
                break;
            }

            $line = $lineNo;
        }

        return [
            $line,
            $pos - $lines[$line],
        ];
    }

    /**
     * Runs the linting process.
     *
     * @param string $query The query to be checked.
     *
     * @return array
     */
    public static function lint($query)
    {
        // Disabling lint for huge queries to save some resources.
        if (mb_strlen($query) > 10000) {
            return [
                [
                    'message' => __('Linting is disabled for this query because it exceeds the maximum length.'),
                    'fromLine' => 0,
                    'fromColumn' => 0,
                    'toLine' => 0,
                    'toColumn' => 0,
                    'severity' => 'warning',
                ],
            ];
        }

        /**
         * Lexer used for tokenizing the query.
         */
        $lexer = new Lexer($query);

        /**
         * Parsed used for analysing the query.
         */
        $parser = new Parser($lexer->list);

        /**
         * Array containing all errors.
         */
        $errors = ParserError::get([$lexer, $parser]);

        /**
         * The response containing of all errors.
         *
         * @var array
         */
        $response = [];

        /**
         * 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.
         */
        $lines = static::getLines($query);

        // Building the response.
        foreach ($errors as $error) {
            // Starting position of the string that caused the error.
            [$fromLine, $fromColumn] = static::findLineNumberAndColumn($lines, $error[3]);

            // Ending position of the string that caused the error.
            [$toLine, $toColumn] = static::findLineNumberAndColumn(
                $lines,
                $error[3] + mb_strlen((string) $error[2])
            );

            // Building the response.
            $response[] = [
                'message' => sprintf(
                    __('%1$s (near <code>%2$s</code>)'),
                    htmlspecialchars((string) $error[0]),
                    htmlspecialchars((string) $error[2])
                ),
                'fromLine' => $fromLine,
                'fromColumn' => $fromColumn,
                'toLine' => $toLine,
                'toColumn' => $toColumn,
                'severity' => 'error',
            ];
        }

        // Sending back the answer.
        return $response;
    }
}

Directory Contents

Dirs: 29 × Files: 80
Name Size Perms Modified Actions
Charsets DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Command DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Config DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Crypto DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Database DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Dbal DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Display DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Engines DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Export DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Gis DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Html DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Http DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Image DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Import DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Plugins DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Providers DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Query DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Server DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Setup DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Table DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Twig DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
Utils DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
WebAuthn DIR
- drwxr-xr-x 2023-02-07 16:26:36
Edit Download
12.32 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
9.19 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
10.63 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
1.50 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
6.82 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
11.30 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
19.40 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
41.65 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
3.25 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
28.91 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
15.83 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
71.73 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
2.86 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
8.41 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
13.63 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
18.63 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
8.99 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
45.70 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
11.11 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
19.75 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
2.88 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
1.22 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
5.58 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
8.06 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
18.00 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
20.00 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
48.72 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
14.83 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
4.75 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
89.05 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
17.31 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
9.13 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
4.47 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
22.74 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
4.99 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
1.67 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
4.11 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
2.69 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
20.40 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
18.68 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
918 B lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
41.53 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
8.62 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
35.11 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
4.10 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
2.34 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
4.17 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
21.83 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
2.16 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
11.44 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
4.81 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
21.24 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
4.79 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
13.50 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
6.55 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
11.98 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
11.33 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
3.74 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
8.16 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
64.01 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
6.74 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
15.71 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
3.98 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
90.33 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
4.50 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
7.32 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
7.00 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
30.34 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
36.11 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
16.31 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
7.49 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
25.85 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
10.61 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
1.74 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
6.86 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
10.49 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
86.45 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
556 B lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
7.30 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
10.33 KB lrwxr-xr-x 2023-02-07 16:26:36
Edit Download
If ZipArchive is unavailable, a .tar will be created (no compression).