diff options
Diffstat (limited to 'phpBB/phpbb')
| -rw-r--r-- | phpBB/phpbb/console/command/db/console_migrator_output_handler.php | 69 | ||||
| -rw-r--r-- | phpBB/phpbb/console/command/db/migrate.php | 40 | ||||
| -rw-r--r-- | phpBB/phpbb/db/html_migrator_output_handler.php | 48 | ||||
| -rw-r--r-- | phpBB/phpbb/db/log_wrapper_migrator_output_handler.php | 95 | ||||
| -rw-r--r-- | phpBB/phpbb/db/migrator.php | 51 | ||||
| -rw-r--r-- | phpBB/phpbb/db/migrator_output_handler_interface.php | 31 | ||||
| -rw-r--r-- | phpBB/phpbb/db/null_migrator_output_handler.php | 24 | 
7 files changed, 325 insertions, 33 deletions
diff --git a/phpBB/phpbb/console/command/db/console_migrator_output_handler.php b/phpBB/phpbb/console/command/db/console_migrator_output_handler.php new file mode 100644 index 0000000000..b9741a3838 --- /dev/null +++ b/phpBB/phpbb/console/command/db/console_migrator_output_handler.php @@ -0,0 +1,69 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @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 phpbb\user; +use phpbb\db\migrator_output_handler_interface; +use Symfony\Component\Console\Output\OutputInterface; + +class console_migrator_output_handler implements migrator_output_handler_interface +{ +	/** +	 * User object. +	 * +	 * @var user +	 */ +	private $user; + +	/** +	 * Console output object. +	 * +	 * @var OutputInterface +	 */ +	private $output; + +	/** +	 * Constructor +	 * +	 * @param user				$user	User object +	 * @param OutputInterface	$output	Console output object +	 */ +	public function __construct(user $user, OutputInterface $output) +	{ +		$this->user = $user; +		$this->output = $output; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function write($message, $verbosity) +	{ +		if ($verbosity <= $this->output->getVerbosity()) +		{ +			$translated_message = call_user_func_array(array($this->user, 'lang'), $message); + +			if ($verbosity === migrator_output_handler_interface::VERBOSITY_NORMAL) +			{ +				$translated_message = '<info>' . $translated_message . '</info>'; +			} +			else if ($verbosity === migrator_output_handler_interface::VERBOSITY_VERBOSE) +			{ +				$translated_message = '<comment>' . $translated_message . '</comment>'; +			} + +			$this->output->writeln($translated_message); +		} +	} +} diff --git a/phpBB/phpbb/console/command/db/migrate.php b/phpBB/phpbb/console/command/db/migrate.php index c760cde5b5..87c2a057d1 100644 --- a/phpBB/phpbb/console/command/db/migrate.php +++ b/phpBB/phpbb/console/command/db/migrate.php @@ -32,13 +32,17 @@ class migrate extends \phpbb\console\command\command  	/** @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) +	/** @var string phpBB root path */ +	protected $phpbb_root_path; + +	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, $phpbb_root_path)  	{  		$this->migrator = $migrator;  		$this->extension_manager = $extension_manager;  		$this->config = $config;  		$this->cache = $cache;  		$this->log = $log; +		$this->phpbb_root_path = $phpbb_root_path;  		parent::__construct($user);  		$this->user->add_lang(array('common', 'install', 'migrator'));  	} @@ -53,6 +57,8 @@ class migrate extends \phpbb\console\command\command  	protected function execute(InputInterface $input, OutputInterface $output)  	{ +		$this->migrator->set_output_handler(new \phpbb\db\log_wrapper_migrator_output_handler($this->user, new console_migrator_output_handler($this->user, $output), $this->phpbb_root_path . 'store/migrations_' . time() . '.log')); +  		$this->migrator->create_migrations_table();  		$this->cache->purge(); @@ -61,8 +67,6 @@ class migrate extends \phpbb\console\command\command  		$orig_version = $this->config['version'];  		while (!$this->migrator->finished())  		{ -			$migration_start_time = microtime(true); -  			try  			{  				$this->migrator->update(); @@ -73,36 +77,6 @@ class migrate extends \phpbb\console\command\command  				$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("<comment>$msg</comment>"); -			} -			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("<info>$msg</info>"); -			} -			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("<info>$msg</info>"); -			}  		}  		if ($orig_version != $this->config['version']) diff --git a/phpBB/phpbb/db/html_migrator_output_handler.php b/phpBB/phpbb/db/html_migrator_output_handler.php new file mode 100644 index 0000000000..e37c667463 --- /dev/null +++ b/phpBB/phpbb/db/html_migrator_output_handler.php @@ -0,0 +1,48 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @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\db; + +use phpbb\user; + +class html_migrator_output_handler implements migrator_output_handler_interface +{ +	/** +	 * User object. +	 * +	 * @var user +	 */ +	private $user; + +	/** +	 * Constructor +	 * +	 * @param user $user	User object +	 */ +	public function __construct(user $user) +	{ +		$this->user = $user; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function write($message, $verbosity) +	{ +		if ($verbosity <= migrator_output_handler_interface::VERBOSITY_VERBOSE) +		{ +			$final_message = call_user_func_array(array($this->user, 'lang'), $message); +			echo $final_message . "<br />\n"; +		} +	} +} diff --git a/phpBB/phpbb/db/log_wrapper_migrator_output_handler.php b/phpBB/phpbb/db/log_wrapper_migrator_output_handler.php new file mode 100644 index 0000000000..94c293dc45 --- /dev/null +++ b/phpBB/phpbb/db/log_wrapper_migrator_output_handler.php @@ -0,0 +1,95 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @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\db; + +use phpbb\user; + +class log_wrapper_migrator_output_handler implements migrator_output_handler_interface +{ +	/** +	 * User object. +	 * +	 * @var user +	 */ +	protected $user; + +	/** +	 * A migrator output handler +	 * +	 * @var migrator_output_handler_interface +	 */ +	protected $migrator; + +	/** +	 * Log file handle +	 * @var resource +	 */ +	protected $file_handle = false; + +	/** +	 * Constructor +	 * +	 * @param user $user	User object +	 * @param migrator_output_handler_interface $migrator Migrator output handler +	 * @param string $log_file	File to log to +	 */ +	public function __construct(user $user, migrator_output_handler_interface $migrator, $log_file) +	{ +		$this->user = $user; +		$this->migrator = $migrator; +		$this->file_open($log_file); +	} + +	/** +	 * Open file for logging +	 * +	 * @param string $file File to open +	 */ +	protected function file_open($file) +	{ +		if (phpbb_is_writable(dirname($file))) +		{ +			$this->file_handle = fopen($file, 'w'); +		} +		else +		{ +			throw new \RuntimeException('Unable to write to migrator log file'); +		} +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function write($message, $verbosity) +	{ +		$this->migrator->write($message, $verbosity); + +		if ($this->file_handle !== false) +		{ +			$translated_message = call_user_func_array(array($this->user, 'lang'), $message) . "\n"; + +			if ($verbosity <= migrator_output_handler_interface::VERBOSITY_NORMAL) +			{ +				$translated_message = '[INFO] ' . $translated_message; +			} +			else +			{ +				$translated_message = '[DEBUG] ' . $translated_message; +			} + +			fwrite($this->file_handle, $translated_message); +			fflush($this->file_handle); +		} +	} +} diff --git a/phpBB/phpbb/db/migrator.php b/phpBB/phpbb/db/migrator.php index 44bea3c5d2..621a808a03 100644 --- a/phpBB/phpbb/db/migrator.php +++ b/phpBB/phpbb/db/migrator.php @@ -68,6 +68,13 @@ class migrator  	public $last_run_migration = false;  	/** +	 * The output handler. A null handler is configured by default. +	 * +	 * @var migrator_output_handler +	 */ +	public $output_handler; + +	/**  	* Constructor of the database migrator  	*/  	public function __construct(\phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools $db_tools, $migrations_table, $phpbb_root_path, $php_ext, $table_prefix, $tools, \phpbb\db\migration\helper $helper) @@ -84,6 +91,8 @@ class migrator  		$this->table_prefix = $table_prefix; +		$this->output_handler = new null_migrator_output_handler(); +  		foreach ($tools as $tool)  		{  			$this->tools[$tool->get_name()] = $tool; @@ -95,6 +104,16 @@ class migrator  	}  	/** +	 * Set the output handler. +	 * +	 * @param migrator_output_handler $handler The output handler +	 */ +	public function set_output_handler(migrator_output_handler_interface $handler) +	{ +		$this->output_handler = $handler; +	} + +	/**  	* Loads all migrations and their application state from the database.  	*  	* @return null @@ -161,6 +180,10 @@ class migrator  					return;  				}  			} +			else +			{ +				$this->output_handler->write(array('MIGRATION_EFFECTIVELY_INSTALLED', $name), migrator_output_handler_interface::VERBOSITY_DEBUG); +			}  		}  	} @@ -175,6 +198,7 @@ class migrator  	{  		if (!class_exists($name))  		{ +			$this->output_handler->write(array('MIGRATION_NOT_VALID', $name), migrator_output_handler_interface::VERBOSITY_DEBUG);  			return false;  		} @@ -191,6 +215,11 @@ class migrator  				'migration_end_time'	=> 0,  			); +		if (!empty($state['migration_depends_on'])) +		{ +			$this->output_handler->write(array('MIGRATION_APPLY_DEPENDENCIES', $name), migrator_output_handler_interface::VERBOSITY_DEBUG); +		} +  		foreach ($state['migration_depends_on'] as $depend)  		{  			if ($this->unfulfillable($depend) !== false) @@ -227,6 +256,8 @@ class migrator  				);  				$this->last_run_migration['effectively_installed'] = true; + +				$this->output_handler->write(array('MIGRATION_EFFECTIVELY_INSTALLED', $name), migrator_output_handler_interface::VERBOSITY_VERBOSE);  			}  			else  			{ @@ -238,23 +269,43 @@ class migrator  		if (!$state['migration_schema_done'])  		{ +			$this->output_handler->write(array('MIGRATION_SCHEMA_RUNNING', $name), migrator_output_handler_interface::VERBOSITY_VERBOSE); +  			$this->last_run_migration['task'] = 'process_schema_step'; +			$elapsed_time = microtime(true);  			$steps = $this->helper->get_schema_steps($migration->update_schema());  			$result = $this->process_data_step($steps, $state['migration_data_state']); +			$elapsed_time = microtime(true) - $elapsed_time;  			$state['migration_data_state'] = ($result === true) ? '' : $result;  			$state['migration_schema_done'] = ($result === true); + +			$this->output_handler->write(array('MIGRATION_SCHEMA_DONE', $name, $elapsed_time), migrator_output_handler_interface::VERBOSITY_NORMAL);  		}  		else if (!$state['migration_data_done'])  		{  			try  			{ +				$this->output_handler->write(array('MIGRATION_DATA_RUNNING', $name), migrator_output_handler_interface::VERBOSITY_VERBOSE); +  				$this->last_run_migration['task'] = 'process_data_step'; + +				$elapsed_time = microtime(true);  				$result = $this->process_data_step($migration->update_data(), $state['migration_data_state']); +				$elapsed_time = microtime(true) - $elapsed_time;  				$state['migration_data_state'] = ($result === true) ? '' : $result;  				$state['migration_data_done'] = ($result === true);  				$state['migration_end_time'] = ($result === true) ? time() : 0; + +				if ($state['migration_schema_done']) +				{ +					$this->output_handler->write(array('MIGRATION_DATA_DONE', $name, $elapsed_time), migrator_output_handler_interface::VERBOSITY_NORMAL); +				} +				else +				{ +					$this->output_handler->write(array('MIGRATION_DATA_IN_PROGRESS', $name, $elapsed_time), migrator_output_handler_interface::VERBOSITY_VERY_VERBOSE); +				}  			}  			catch (\phpbb\db\migration\exception $e)  			{ diff --git a/phpBB/phpbb/db/migrator_output_handler_interface.php b/phpBB/phpbb/db/migrator_output_handler_interface.php new file mode 100644 index 0000000000..a923af99f6 --- /dev/null +++ b/phpBB/phpbb/db/migrator_output_handler_interface.php @@ -0,0 +1,31 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @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\db; + +interface migrator_output_handler_interface +{ +	const VERBOSITY_QUIET        = 0; +	const VERBOSITY_NORMAL       = 1; +	const VERBOSITY_VERBOSE      = 2; +	const VERBOSITY_VERY_VERBOSE = 3; +	const VERBOSITY_DEBUG        = 4; + +	/** +	 * Write output using the configured closure. +	 * +	 * @param string|array $message The message to write or an array containing the language key and all of its parameters. +	 * @param int $verbosity The verbosity of the message. +	 */ +	public function write($message, $verbosity); +} diff --git a/phpBB/phpbb/db/null_migrator_output_handler.php b/phpBB/phpbb/db/null_migrator_output_handler.php new file mode 100644 index 0000000000..0e8cfbb049 --- /dev/null +++ b/phpBB/phpbb/db/null_migrator_output_handler.php @@ -0,0 +1,24 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @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\db; + +class null_migrator_output_handler implements migrator_output_handler_interface +{ +	/** +	 * {@inheritdoc} +	 */ +	public function write($message, $verbosity) +	{ +	} +}  | 
