> */ private $keywordListClasses = [ 'db2' => DB2Keywords::class, 'mysql' => MySQLKeywords::class, 'mysql57' => MySQL57Keywords::class, 'mysql80' => MySQL80Keywords::class, 'mariadb102' => MariaDb102Keywords::class, 'oracle' => OracleKeywords::class, 'pgsql' => PostgreSQL94Keywords::class, 'pgsql100' => PostgreSQL100Keywords::class, 'sqlite' => SQLiteKeywords::class, 'sqlserver' => SQLServer2012Keywords::class, ]; /** @var ConnectionProvider */ private $connectionProvider; public function __construct(ConnectionProvider $connectionProvider) { parent::__construct(); $this->connectionProvider = $connectionProvider; } /** * If you want to add or replace a keywords list use this command. * * @param string $name * @param class-string $class * * @return void */ public function setKeywordListClass($name, $class) { $this->keywordListClasses[$name] = $class; } /** @return void */ protected function configure() { $this ->setName('dbal:reserved-words') ->setDescription('Checks if the current database contains identifiers that are reserved.') ->setDefinition([ new InputOption('connection', null, InputOption::VALUE_REQUIRED, 'The named database connection'), new InputOption( 'list', 'l', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Keyword-List name.' ), ]) ->setHelp(<<%command.full_name% If you want to check against specific dialects you can pass them to the command: %command.full_name% -l mysql -l pgsql The following keyword lists are currently shipped with Doctrine: * mysql * mysql57 * mysql80 * mariadb102 * pgsql * pgsql100 * sqlite * oracle * sqlserver * sqlserver2012 * db2 (Not checked by default) EOT ); } /** * {@inheritdoc} * * @throws Exception */ protected function execute(InputInterface $input, OutputInterface $output) { $conn = $this->getConnection($input); $keywordLists = $input->getOption('list'); if (is_string($keywordLists)) { $keywordLists = [$keywordLists]; } elseif (! is_array($keywordLists)) { $keywordLists = []; } if (count($keywordLists) === 0) { $keywordLists = array_keys($this->keywordListClasses); } $keywords = []; foreach ($keywordLists as $keywordList) { if (! isset($this->keywordListClasses[$keywordList])) { throw new InvalidArgumentException( "There exists no keyword list with name '" . $keywordList . "'. " . 'Known lists: ' . implode(', ', array_keys($this->keywordListClasses)) ); } $class = $this->keywordListClasses[$keywordList]; $keywords[] = new $class(); } $output->write( 'Checking keyword violations for ' . implode(', ', $keywordLists) . '...', true ); $schema = $conn->getSchemaManager()->createSchema(); $visitor = new ReservedKeywordsValidator($keywords); $schema->visit($visitor); $violations = $visitor->getViolations(); if (count($violations) !== 0) { $output->write( 'There are ' . count($violations) . ' reserved keyword violations' . ' in your database schema:', true ); foreach ($violations as $violation) { $output->write(' - ' . $violation, true); } return 1; } $output->write('No reserved keywords violations have been found!', true); return 0; } private function getConnection(InputInterface $input): Connection { $connectionName = $input->getOption('connection'); assert(is_string($connectionName) || $connectionName === null); if ($connectionName !== null) { return $this->connectionProvider->getConnection($connectionName); } return $this->connectionProvider->getDefaultConnection(); } }