From 46a9fe93d797bf7d56fd9b1e204f3c0459270122 Mon Sep 17 00:00:00 2001 From: Tristan Darricau Date: Sun, 14 Sep 2014 00:32:34 +0200 Subject: [PATCH] [ticket/13064] Validate the migrations provided to migrator::set_migrations() PHPBB3-13064 --- phpBB/phpbb/db/migrator.php | 19 ++++++++++++++++++- tests/dbal/migrator_test.php | 10 +++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/phpBB/phpbb/db/migrator.php b/phpBB/phpbb/db/migrator.php index 44bea3c5d2..43393a8935 100644 --- a/phpBB/phpbb/db/migrator.php +++ b/phpBB/phpbb/db/migrator.php @@ -129,11 +129,28 @@ class migrator * Sets the list of available migration class names to the given array. * * @param array $class_names An array of migration class names + * @param bool $check_fulfillable If TRUE (default), we will check + * if all of the migrations are fulfillable after loading them. + * If FALSE, we will not check. You SHOULD check at least once + * to prevent errors. * @return null + * @throws \phpbb\db\migration\exception */ - public function set_migrations($class_names) + public function set_migrations($class_names, $check_fulfillable = true) { $this->migrations = $class_names; + + if ($check_fulfillable) + { + foreach ($this->migrations as $name) + { + $unfulfillable = $this->unfulfillable($name); + if ($unfulfillable !== false) + { + throw new \phpbb\db\migration\exception('MIGRATION_NOT_FULFILLABLE', $name, $unfulfillable); + } + } + } } /** diff --git a/tests/dbal/migrator_test.php b/tests/dbal/migrator_test.php index 10a9444d63..05e60a510b 100644 --- a/tests/dbal/migrator_test.php +++ b/tests/dbal/migrator_test.php @@ -118,9 +118,17 @@ class phpbb_dbal_migrator_test extends phpbb_database_test_case $this->db_tools->sql_column_remove('phpbb_config', 'extra_column'); } - public function test_unfulfillable() + /** + * @expectedException \phpbb\db\migration\exception + */ + public function test_unfulfillable_exception() { $this->migrator->set_migrations(array('phpbb_dbal_migration_unfulfillable', 'phpbb_dbal_migration_dummy')); + } + + public function test_unfulfillable() + { + $this->migrator->set_migrations(array('phpbb_dbal_migration_unfulfillable', 'phpbb_dbal_migration_dummy'), false); while (!$this->migrator->finished()) {