* @license GNU General Public License, version 2 (GPL-2.0) * * For full copyright and license information, please see * the docs/CREDITS.txt file. * */ namespace phpbb\console\command\db; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class migrate extends \phpbb\console\command\command { /** @var \phpbb\db\migrator */ protected $migrator; /** @var \phpbb\extension\manager */ protected $extension_manager; /** @var \phpbb\config\config */ protected $config; /** @var \phpbb\cache\service */ protected $cache; /** @var \phpbb\log\log */ protected $log; function __construct(\phpbb\user $user, \phpbb\db\migrator $migrator, \phpbb\extension\manager $extension_manager, \phpbb\config\config $config, \phpbb\cache\service $cache, \phpbb\log\log $log) { $this->migrator = $migrator; $this->extension_manager = $extension_manager; $this->config = $config; $this->cache = $cache; $this->log = $log; parent::__construct($user); $this->user->add_lang(array('common', 'install', 'migrator')); } protected function configure() { $this ->setName('db:migrate') ->setDescription($this->user->lang('CLI_DESCRIPTION_DB_MIGRATE')) ; } protected function execute(InputInterface $input, OutputInterface $output) { $this->migrator->create_migrations_table(); $this->load_migrations(); $orig_version = $this->config['version']; while (!$this->migrator->finished()) { $migration_start_time = microtime(true); try { $this->migrator->update(); } catch (\phpbb\db\migration\exception $e) { $output->writeln('' . $e->getLocalisedMessage($this->user) . ''); $this->finalise_update(); return 1; } $migration_stop_time = microtime(true) - $migration_start_time; $state = array_merge( array( 'migration_schema_done' => false, 'migration_data_done' => false, ), $this->migrator->last_run_migration['state'] ); if (!empty($this->migrator->last_run_migration['effectively_installed'])) { $msg = $this->user->lang('MIGRATION_EFFECTIVELY_INSTALLED', $this->migrator->last_run_migration['name']); $output->writeln("$msg"); } else if ($this->migrator->last_run_migration['task'] == 'process_data_step' && $state['migration_data_done']) { $msg = $this->user->lang('MIGRATION_DATA_DONE', $this->migrator->last_run_migration['name'], $migration_stop_time); $output->writeln("$msg"); } else if ($this->migrator->last_run_migration['task'] == 'process_data_step') { $output->writeln($this->user->lang('MIGRATION_DATA_IN_PROGRESS', $this->migrator->last_run_migration['name'], $migration_stop_time)); } else if ($state['migration_schema_done']) { $msg = $this->user->lang('MIGRATION_SCHEMA_DONE', $this->migrator->last_run_migration['name'], $migration_stop_time); $output->writeln("$msg"); } } if ($orig_version != $this->config['version']) { $this->log->add('admin', ANONYMOUS, '', 'LOG_UPDATE_DATABASE', time(), array($orig_version, $this->config['version'])); } $this->finalise_update(); $output->writeln($this->user->lang['DATABASE_UPDATE_COMPLETE']); } protected function load_migrations() { $migrations = $this->extension_manager ->get_finder() ->core_path('phpbb/db/migration/data/') ->extension_directory('/migration') ->get_classes(); // @deprecated 3.1.0-RC4 (To be removed: 3.2.0) $migrations_deprecated = $this->extension_manager ->get_finder() ->extension_directory('/migrations') ->get_classes(); $migrations = array_merge($migrations, $migrations_deprecated); $this->migrator->set_migrations($migrations); } protected function finalise_update() { $this->cache->purge(); $this->config->increment('assets_version', 1); } }