setName('core:convert-to-utf8mb4'); $this->setDescription('Converts the database to utf8mb4'); $this->addOption('show', null, InputOption::VALUE_NONE, Piwik::translate('Show all commands / queries only.')); $this->addOption('yes', null, InputOption::VALUE_NONE, Piwik::translate('CoreUpdater_ConsoleParameterDescription')); $this->addOption('keep-tracking', null, InputOption::VALUE_NONE, 'Do not disable tracking while conversion is running'); } public function isEnabled() { $dbSettings = new Db\Settings(); $charset = $dbSettings->getUsedCharset(); return $charset !== 'utf8mb4'; } /** * Execute command like: ./console core:convert-to-utf8mb4 --yes */ protected function execute(InputInterface $input, OutputInterface $output) { $yes = $input->getOption('yes'); $keepTracking = $input->getOption('keep-tracking'); $show = $input->getOption('show'); $queries = DbHelper::getUtf8mb4ConversionQueries(); if ($show) { $this->showCommands($queries, $keepTracking, $output); return; } $output->writeln("This command will convert all Matomo database tables to utf8mb4.\n"); if (DbHelper::getDefaultCharset() !== 'utf8mb4') { $this->writeSuccessMessage($output, array('Your database does not support utf8mb4')); return; } if (!$keepTracking) { $output->writeln("Tracking will be disabled during this process.\n"); } $output->writeln('If you want to see what this command is going to do use the --show option.'); if (!$yes) { $yes = $this->askForUpdateConfirmation($input, $output); } if ($yes) { $config = Config::getInstance(); if (!$keepTracking) { $output->writeln("\n" . Piwik::translate('Disabling Matomo Tracking')); $config->Tracker['record_statistics'] = '0'; $config->forceSave(); } $output->writeln("\n" . Piwik::translate('CoreUpdater_ConsoleStartingDbUpgrade')); try { foreach ($queries as $query) { $output->write("\n" . 'Executing ' . $query . '... '); Db::get()->exec($query); $output->write(' done.'); } $output->writeln("\n" . 'Updating used database charset in config.ini.php.'); $config->database['charset'] = 'utf8mb4'; } finally { if (!$keepTracking) { $output->writeln("\n" . Piwik::translate('Enabling Matomo Tracking')); $config->Tracker['record_statistics'] = '1'; } $config->forceSave(); } $this->writeSuccessMessage($output, array('Conversion to utf8mb4 successful.')); } else { $this->writeSuccessMessage($output, array('Database conversion skipped.')); } } protected function showCommands($queries, $keepTracking, OutputInterface $output) { $output->writeln("To manually convert all Matomo database tables to utf8mb4 follow these steps."); if (!$keepTracking) { $output->writeln(''); $output->writeln('** Disable Matomo Tracking with this command: **'); $output->writeln('./console config:set --section=Tracker --key=record_statistics --value=0'); } $output->writeln(''); $output->writeln('** Execute the following database queries: **'); $output->writeln(implode("\n", $queries)); $output->writeln(''); $output->writeln('** Change configured database charset to utf8mb4 with this command: **'); $output->writeln('./console config:set --section=database --key=charset --value=utf8mb4'); if (!$keepTracking) { $output->writeln(''); $output->writeln('** Enable Matomo Tracking again with this command: **'); $output->writeln('./console config:set --section=Tracker --key=record_statistics --value=1'); } } private function askForUpdateConfirmation(InputInterface $input, OutputInterface $output) { $helper = $this->getHelper('question'); $question = new ConfirmationQuestion('Execute updates? (y/N) ', false); return $helper->ask($input, $output, $question); } }