$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 void */ public static function lint($query) { // Disabling lint for huge queries to save some resources. if (/*overload*/mb_strlen($query) > 10000) { echo json_encode( 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', ) ) ); 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 = 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] + /*overload*/mb_strlen($error[2]) ); // Building the response. $response[] = array( 'message' => $error[0] . ' (near ' . $error[2] . ')', 'fromLine' => $fromLine, 'fromColumn' => $fromColumn, 'toLine' => $toLine, 'toColumn' => $toColumn, 'severity' => 'error', ); } // Sending back the answer. echo json_encode($response); } }