1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-07-31 14:00:31 +02:00

[ticket/11386] Send list of migrations instead of using load_migrations

Remove dependency of extension manager for migrator.

Keeping load_migrations function for others to use if they desire
but requiring the finder be sent to it in order to use it.

PHPBB3-11386
This commit is contained in:
Nathaniel Guse
2013-03-03 19:54:22 -06:00
parent bee4f8d818
commit e4f7828199
10 changed files with 160 additions and 161 deletions

View File

@@ -29,10 +29,7 @@ class phpbb_db_migrator
protected $db;
/** @var phpbb_db_tools */
protected $db_tools;
/** @var phpbb_extension_manager */
protected $extension_manager;
protected $db_tools
/** @var string */
protected $table_prefix;
@@ -93,16 +90,6 @@ class phpbb_db_migrator
$this->load_migration_state();
}
/**
* Set Extension Manager (required)
*
* Not in constructor to prevent circular reference error
*/
public function set_extension_manager(phpbb_extension_manager $extension_manager)
{
$this->extension_manager = $extension_manager;
}
/**
* Loads all migrations and their application state from the database.
*
@@ -145,98 +132,6 @@ class phpbb_db_migrator
$this->migrations = $class_names;
}
/**
* This function adds all migrations in a specified directory to the migrations table
*
* THIS SHOULD NOT GENERALLY BE USED! THIS IS FOR THE PHPBB INSTALLER.
* THIS WILL THROW ERRORS IF MIGRATIONS ALREADY EXIST IN THE TABLE, DO NOT CALL MORE THAN ONCE!
*
* @param string $path Path to migration data files
* @param bool $recursive Set to true to also load data files from subdirectories
* @return null
*/
public function populate_migrations_from_directory($path, $recursive = true)
{
$existing_migrations = $this->migrations;
$this->migrations = array();
$this->load_migrations($path, true, $recursive);
foreach ($this->migrations as $name)
{
if ($this->migration_state($name) === false)
{
$state = array(
'migration_depends_on' => $name::depends_on(),
'migration_schema_done' => true,
'migration_data_done' => true,
'migration_data_state' => '',
'migration_start_time' => time(),
'migration_end_time' => time(),
);
$this->insert_migration($name, $state);
}
}
$this->migrations = $existing_migrations;
}
/**
* Load migration data files from a directory
*
* Migration data files loaded with this function MUST contain
* ONLY ONE class in them (or an exception will be thrown).
*
* @param string $path Path to migration data files
* @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 (if including multiple directories, check
* with the last call to prevent throwing errors unnecessarily).
* @return array Array of migration names
*/
public function load_migrations($path, $check_fulfillable = true)
{
if (!is_dir($path))
{
throw new phpbb_db_migration_exception('DIRECTORY INVALID', $path);
}
$migrations = array();
$finder = $this->extension_manager->get_finder();
$files = $finder
->extension_directory("/")
->find_from_paths(array('/' => $path));
foreach ($files as $file)
{
$migrations[$file['path'] . $file['filename']] = '';
}
$migrations = $finder->get_classes_from_files($migrations);
foreach ($migrations as $migration)
{
if (!in_array($migration, $this->migrations))
{
$this->migrations[] = $migration;
}
}
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);
}
}
}
return $this->migrations;
}
/**
* Runs a single update step from the next migration to be applied.
*
@@ -754,4 +649,85 @@ class phpbb_db_migrator
{
return new $name($this->config, $this->db, $this->db_tools, $this->phpbb_root_path, $this->php_ext, $this->table_prefix);
}
/**
* This function adds all migrations sent to it to the migrations table
*
* THIS SHOULD NOT GENERALLY BE USED! THIS IS FOR THE PHPBB INSTALLER.
* THIS WILL THROW ERRORS IF MIGRATIONS ALREADY EXIST IN THE TABLE, DO NOT CALL MORE THAN ONCE!
*
* @param array $migrations Array of migrations (names) to add to the migrations table
* @return null
*/
public function populate_migrations($migrations)
{
foreach ($migrations as $name)
{
if ($this->migration_state($name) === false)
{
$state = array(
'migration_depends_on' => $name::depends_on(),
'migration_schema_done' => true,
'migration_data_done' => true,
'migration_data_state' => '',
'migration_start_time' => time(),
'migration_end_time' => time(),
);
$this->insert_migration($name, $state);
}
}
}
/**
* Load migration data files from a directory
*
* @param phpbb_extension_finder $finder
* @param string $path Path to migration data files
* @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 (if including multiple directories, check
* with the last call to prevent throwing errors unnecessarily).
* @return array Array of migration names
*/
public function load_migrations(phpbb_extension_finder $finder, $path, $check_fulfillable = true)
{
if (!is_dir($path))
{
throw new phpbb_db_migration_exception('DIRECTORY INVALID', $path);
}
$migrations = array();
$files = $finder
->extension_directory("/")
->find_from_paths(array('/' => $path));
foreach ($files as $file)
{
$migrations[$file['path'] . $file['filename']] = '';
}
$migrations = $finder->get_classes_from_files($migrations);
foreach ($migrations as $migration)
{
if (!in_array($migration, $this->migrations))
{
$this->migrations[] = $migration;
}
}
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);
}
}
}
return $this->migrations;
}
}

View File

@@ -43,18 +43,20 @@ class phpbb_extension_manager
* @param ContainerInterface $container A container
* @param phpbb_db_driver $db A database connection
* @param phpbb_config $config phpbb_config
* @param phpbb_db_migrator $migrator
* @param string $extension_table The name of the table holding extensions
* @param string $phpbb_root_path Path to the phpbb includes directory.
* @param string $php_ext php file extension
* @param phpbb_cache_driver_interface $cache A cache instance or null
* @param string $cache_name The name of the cache variable, defaults to _ext
*/
public function __construct(ContainerInterface $container, phpbb_db_driver $db, phpbb_config $config, $extension_table, $phpbb_root_path, $php_ext = '.php', phpbb_cache_driver_interface $cache = null, $cache_name = '_ext')
public function __construct(ContainerInterface $container, phpbb_db_driver $db, phpbb_config $config, phpbb_db_migrator $migrator, $extension_table, $phpbb_root_path, $php_ext = '.php', phpbb_cache_driver_interface $cache = null, $cache_name = '_ext')
{
$this->container = $container;
$this->phpbb_root_path = $phpbb_root_path;
$this->db = $db;
$this->config = $config;
$this->migrator = $migrator;
$this->cache = $cache;
$this->php_ext = $php_ext;
$this->extension_table = $extension_table;
@@ -68,14 +70,6 @@ class phpbb_extension_manager
}
}
/**
* Set migrator (get around circular reference)
*/
public function set_migrator(phpbb_db_migrator $migrator)
{
$this->migrator = $migrator;
}
/**
* Loads all extension information from the database
*
@@ -528,13 +522,27 @@ class phpbb_extension_manager
*/
protected function handle_migrations($extension_name, $mode)
{
$migrations_path = $this->phpbb_root_path . $this->get_extension_path($extension_name) . 'migrations/';
if (!file_exists($migrations_path) || !is_dir($migrations_path))
$extensions = array(
$extension_name => $this->phpbb_root_path . $this->get_extension_path($extension_name),
);
$finder = $this->get_finder();
$migrations = array();
$file_list = $finder
->extension_directory('/migrations')
->find_from_paths($extensions);
if (empty($file_list))
{
return true;
}
$migrations = $this->migrator->load_migrations($migrations_path);
foreach ($file_list as $file)
{
$migrations[$file['named_path']] = $file['ext_name'];
}
$migrations = $finder->get_classes_from_files($migrations);
$this->migrator->set_migrations($migrations);
// What is a safe limit of execution time? Half the max execution time should be safe.
$safe_time_limit = (ini_get('max_execution_time') / 2);