<?php /* vim: set expandtab sw=4 ts=4 sts=4: */ /** * Analyzes a query and gives user feedback. * * @package PhpMyAdmin */ namespace PhpMyAdmin; use PhpMyAdmin\SqlParser\Lexer; use PhpMyAdmin\SqlParser\Parser; use PhpMyAdmin\SqlParser\UtfString; use PhpMyAdmin\SqlParser\Utils\Error as ParserError; /** * The linter itself. * * @package PhpMyAdmin */ class Linter { /** * Gets the starting position of each line. * * @param string $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 = array(0); for ($i = 0; $i < $len; ++$i) { if ($str[$i] === "\n") { $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 array($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 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 used for tokenizing the query. * * @var Lexer */ $lexer = new Lexer($query); /** * Parsed used for analysing the query. * * @var Parser */ $parser = new Parser($lexer->list); /** * Array containing all errors. * * @var array */ $errors = ParserError::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 = static::getLines($query); // Building the response. foreach ($errors as $idx => $error) { // Starting position of the string that caused the error. list($fromLine, $fromColumn) = static::findLineNumberAndColumn( $lines, $error[3] ); // Ending position of the string that caused the error. list($toLine, $toColumn) = static::findLineNumberAndColumn( $lines, $error[3] + mb_strlen($error[2]) ); // Building the response. $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', ); } // Sending back the answer. return $response; } }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
Config | Folder | 0755 |
|
|
Controllers | Folder | 0755 |
|
|
Database | Folder | 0755 |
|
|
Dbi | Folder | 0755 |
|
|
Di | Folder | 0755 |
|
|
Display | Folder | 0755 |
|
|
Engines | Folder | 0755 |
|
|
Gis | Folder | 0755 |
|
|
Navigation | Folder | 0755 |
|
|
Plugins | Folder | 0755 |
|
|
Properties | Folder | 0755 |
|
|
Rte | Folder | 0755 |
|
|
Server | Folder | 0755 |
|
|
Twig | Folder | 0755 |
|
|
Utils | Folder | 0755 |
|
|
Advisor.php | File | 18.79 KB | 0644 |
|
Bookmark.php | File | 10.37 KB | 0644 |
|
BrowseForeigners.php | File | 10.73 KB | 0644 |
|
CentralColumns.php | File | 53.12 KB | 0644 |
|
Charsets.php | File | 24.92 KB | 0644 |
|
CheckUserPrivileges.php | File | 11.58 KB | 0644 |
|
Config.php | File | 59.69 KB | 0644 |
|
Console.php | File | 3.58 KB | 0644 |
|
Core.php | File | 38.98 KB | 0644 |
|
CreateAddField.php | File | 17.97 KB | 0644 |
|
DatabaseInterface.php | File | 103.86 KB | 0644 |
|
Encoding.php | File | 8.25 KB | 0644 |
|
Error.php | File | 13.05 KB | 0644 |
|
ErrorHandler.php | File | 16.68 KB | 0644 |
|
ErrorReport.php | File | 8.37 KB | 0644 |
|
Export.php | File | 40.32 KB | 0644 |
|
File.php | File | 20.53 KB | 0644 |
|
FileListing.php | File | 2.83 KB | 0644 |
|
Font.php | File | 4.25 KB | 0644 |
|
Footer.php | File | 10.54 KB | 0644 |
|
Header.php | File | 25.81 KB | 0644 |
|
Import.php | File | 55.59 KB | 0644 |
|
Index.php | File | 24.63 KB | 0644 |
|
IndexColumn.php | File | 4.43 KB | 0644 |
|
InsertEdit.php | File | 129.29 KB | 0644 |
|
IpAllowDeny.php | File | 9.21 KB | 0644 |
|
Language.php | File | 4.3 KB | 0644 |
|
LanguageManager.php | File | 23.42 KB | 0644 |
|
Linter.php | File | 5.1 KB | 0644 |
|
ListAbstract.php | File | 3.15 KB | 0644 |
|
ListDatabase.php | File | 4.22 KB | 0644 |
|
Logging.php | File | 2.56 KB | 0644 |
|
Menu.php | File | 22.34 KB | 0644 |
|
Message.php | File | 19.19 KB | 0644 |
|
Mime.php | File | 891 B | 0644 |
|
MultSubmits.php | File | 23.19 KB | 0644 |
|
Normalization.php | File | 39.03 KB | 0644 |
|
OpenDocument.php | File | 8.5 KB | 0644 |
|
Operations.php | File | 79.06 KB | 0644 |
|
OutputBuffering.php | File | 3.63 KB | 0644 |
|
ParseAnalyze.php | File | 2.46 KB | 0644 |
|
Partition.php | File | 7.26 KB | 0644 |
|
Pdf.php | File | 4.07 KB | 0644 |
|
Plugins.php | File | 21.42 KB | 0644 |
|
RecentFavoriteTable.php | File | 12.13 KB | 0644 |
|
Relation.php | File | 78.19 KB | 0644 |
|
RelationCleanup.php | File | 14.7 KB | 0644 |
|
Replication.php | File | 5.37 KB | 0644 |
|
ReplicationGui.php | File | 41.79 KB | 0644 |
|
Response.php | File | 16.31 KB | 0644 |
|
Sanitize.php | File | 14.15 KB | 0644 |
|
SavedSearches.php | File | 11.95 KB | 0644 |
|
Scripts.php | File | 5.33 KB | 0644 |
|
Session.php | File | 7.82 KB | 0644 |
|
Sql.php | File | 88.22 KB | 0644 |
|
SqlQueryForm.php | File | 17.19 KB | 0644 |
|
StorageEngine.php | File | 13.47 KB | 0644 |
|
SubPartition.php | File | 3.53 KB | 0644 |
|
SysInfo.php | File | 1.54 KB | 0644 |
|
SysInfoBase.php | File | 801 B | 0644 |
|
SysInfoLinux.php | File | 1.96 KB | 0644 |
|
SysInfoSunOS.php | File | 1.87 KB | 0644 |
|
SysInfoWINNT.php | File | 3.25 KB | 0644 |
|
SystemDatabase.php | File | 3.84 KB | 0644 |
|
Table.php | File | 92.59 KB | 0644 |
|
Template.php | File | 3.91 KB | 0644 |
|
Theme.php | File | 10.53 KB | 0644 |
|
ThemeManager.php | File | 10.73 KB | 0644 |
|
Tracker.php | File | 29.72 KB | 0644 |
|
Tracking.php | File | 41.99 KB | 0644 |
|
Transformations.php | File | 16.12 KB | 0644 |
|
TwoFactor.php | File | 7.1 KB | 0644 |
|
Types.php | File | 22.75 KB | 0644 |
|
Url.php | File | 8.17 KB | 0644 |
|
UserPassword.php | File | 8.47 KB | 0644 |
|
UserPreferences.php | File | 8.52 KB | 0644 |
|
Util.php | File | 162.99 KB | 0644 |
|
VersionInformation.php | File | 6.34 KB | 0644 |
|
ZipExtension.php | File | 9.98 KB | 0644 |
|