mirror of
https://github.com/Oreolek/kohana-migrations.git
synced 2024-05-04 18:18:16 +03:00
Moving the util methods to the model (refs #11)
This commit is contained in:
parent
48df2fe47e
commit
307181ccc4
|
@ -1,8 +1,8 @@
|
|||
<?php defined('SYSPATH') or die('No direct script access.');
|
||||
|
||||
/**
|
||||
* The migration manager is responsible for locating migration files, syncing
|
||||
* them with the migrations table in the database and selecting any migrations
|
||||
* The migration manager is responsible for locating migration files, syncing
|
||||
* them with the migrations table in the database and selecting any migrations
|
||||
* that need to be executed in order to reach a target version
|
||||
*
|
||||
* @author Matt Button <matthew@sigswitch.com>
|
||||
|
@ -58,7 +58,7 @@ class Minion_Migration_Manager {
|
|||
|
||||
/**
|
||||
* Set the database connection to be used
|
||||
*
|
||||
*
|
||||
* @param Kohana_Database Database connection
|
||||
* @return Minion_Migration_Manager
|
||||
*/
|
||||
|
@ -96,7 +96,7 @@ class Minion_Migration_Manager {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns a set of queries that would've been executed had dry run not been
|
||||
* Returns a set of queries that would've been executed had dry run not been
|
||||
* enabled. If dry run was not enabled, this returns an empty array
|
||||
*
|
||||
* @return array SQL Queries
|
||||
|
@ -141,20 +141,20 @@ class Minion_Migration_Manager {
|
|||
return;
|
||||
}
|
||||
|
||||
$filename = Minion_Migration_Util::get_filename_from_migration($migration);
|
||||
$filename = $this->_model->get_filename_from_migration($migration);
|
||||
|
||||
if ( ! ($file = Kohana::find_file('migrations', $filename, FALSE)))
|
||||
{
|
||||
throw new Kohana_Exception(
|
||||
'Cannot load migration :migration (:file)',
|
||||
'Cannot load migration :migration (:file)',
|
||||
array(
|
||||
':migration' => $migration['id'],
|
||||
':migration' => $migration['id'],
|
||||
':file' => $filename
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
$class = Minion_Migration_Util::get_class_from_migration($migration);
|
||||
$class = $this->_model->get_class_from_migration($migration);
|
||||
|
||||
include_once $file;
|
||||
|
||||
|
@ -162,7 +162,7 @@ class Minion_Migration_Manager {
|
|||
|
||||
$db = $this->_get_db_instance($instance->get_database_connection());
|
||||
|
||||
try
|
||||
try
|
||||
{
|
||||
$instance->$method($db);
|
||||
}
|
||||
|
@ -204,7 +204,7 @@ class Minion_Migration_Manager {
|
|||
// If this migration has since been deleted
|
||||
if (isset($installed[$migration]) AND ! isset($available[$migration]))
|
||||
{
|
||||
// We should only delete a record of this migration if it does
|
||||
// We should only delete a record of this migration if it does
|
||||
// not exist in the "real world"
|
||||
if ($installed[$migration]['applied'] === '0')
|
||||
{
|
||||
|
@ -216,7 +216,7 @@ class Minion_Migration_Manager {
|
|||
{
|
||||
$this->_model->add_migration($available[$migration]);
|
||||
}
|
||||
// Somebody changed the description of the migration, make sure we
|
||||
// Somebody changed the description of the migration, make sure we
|
||||
// update it in the db as we use this to build the filename!
|
||||
elseif ($installed[$migration]['description'] !== $available[$migration]['description'])
|
||||
{
|
||||
|
|
|
@ -1,124 +0,0 @@
|
|||
<?php defined('SYSPATH') or die('No direct script access.');
|
||||
|
||||
|
||||
/**
|
||||
* Provides a set of utility functions for managing migrations
|
||||
*
|
||||
* @author Matt Button <matthew@sigswitch.com>
|
||||
*/
|
||||
class Minion_Migration_Util {
|
||||
|
||||
/**
|
||||
* Parses a set of files generated by Kohana::find_files and compiles it
|
||||
* down into an array of migrations
|
||||
*
|
||||
* @param array Available files
|
||||
* @return array Available Migrations
|
||||
*/
|
||||
public static function compile_migrations_from_files(array $files)
|
||||
{
|
||||
$migrations = array();
|
||||
|
||||
foreach ($files as $file => $path)
|
||||
{
|
||||
// If this is a directory we're dealing with
|
||||
if (is_array($path))
|
||||
{
|
||||
$migrations += Minion_Migration_Util::compile_migrations_from_files($path);
|
||||
}
|
||||
else
|
||||
{
|
||||
$migration = Minion_Migration_Util::get_migration_from_filename($file);
|
||||
|
||||
$migrations[$migration['group'].':'.$migration['timestamp']] = $migration;
|
||||
}
|
||||
}
|
||||
|
||||
return $migrations;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts information about a migration from its filename.
|
||||
*
|
||||
* Returns an array like:
|
||||
*
|
||||
* array(
|
||||
* 'group' => 'mygroup',
|
||||
* 'timestamp' => '1293214439',
|
||||
* 'description' => 'initial-setup',
|
||||
* 'id' => 'mygroup:1293214439'
|
||||
* );
|
||||
*
|
||||
* @param string The migration's filename
|
||||
* @return array Array of components about the migration
|
||||
*/
|
||||
public static function get_migration_from_filename($file)
|
||||
{
|
||||
$migration = array();
|
||||
|
||||
// Get rid of the file's "migrations/" prefix, the file extension and then
|
||||
// the filename itself. The "group" is essentially a slash delimited
|
||||
// path from the migrations folder to the migration file
|
||||
$migration['group'] = dirname(substr($file, 11, -strlen(EXT)));
|
||||
|
||||
if(strpos(basename($file), "_"))
|
||||
{
|
||||
list($migration['timestamp'], $migration['description'])
|
||||
= explode('_', basename($file, EXT), 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
$migration['timestamp'] = basename($file, EXT);
|
||||
$migration['description'] = "";
|
||||
}
|
||||
$migration['id'] = $migration['group'].':'.$migration['timestamp'];
|
||||
|
||||
return $migration;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a migration file from its timestamp, description and group
|
||||
*
|
||||
* @param integer|array The migration's ID or an array of timestamp, description
|
||||
* @param string The migration group
|
||||
* @return string Path to the migration file
|
||||
*/
|
||||
public static function get_filename_from_migration(array $migration)
|
||||
{
|
||||
$group = $migration['group'];
|
||||
|
||||
if(!empty($migration['description']))
|
||||
{
|
||||
$migration = $migration['timestamp'].'_'.$migration['description'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$migration = $migration['timestamp'];
|
||||
}
|
||||
|
||||
$group = ( ! empty($group)) ? (rtrim($group, '/').'/') : '';
|
||||
|
||||
return $group.$migration.EXT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows you to work out the class name from either an array of migration
|
||||
* info, or from a migration id
|
||||
*
|
||||
* @param string|array The migration's ID or array of migration data
|
||||
* @return string The migration class name
|
||||
*/
|
||||
public static function get_class_from_migration($migration)
|
||||
{
|
||||
if (is_string($migration))
|
||||
{
|
||||
$migration = str_replace(array(':', '/'), ' ', $migration);
|
||||
}
|
||||
else
|
||||
{
|
||||
$migration = str_replace('/', ' ', $migration['group']).'_'.$migration['timestamp'];
|
||||
}
|
||||
|
||||
return 'Migration_'.str_replace(array(' ', '-'), '_', ucwords($migration));
|
||||
}
|
||||
}
|
|
@ -18,7 +18,7 @@ class Model_Minion_Migration extends Model
|
|||
protected $_table = 'minion_migrations';
|
||||
|
||||
/**
|
||||
* Constructs the model, taking a Database connection as the first and only
|
||||
* Constructs the model, taking a Database connection as the first and only
|
||||
* parameter
|
||||
*
|
||||
* @param Kohana_Database Database connection to use
|
||||
|
@ -37,11 +37,125 @@ class Model_Minion_Migration extends Model
|
|||
{
|
||||
$files = Kohana::list_files('migrations');
|
||||
|
||||
return Minion_Migration_Util::compile_migrations_from_files($files);
|
||||
return $this->compile_migrations_from_files($files);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks to see if the minion migrations table exists and attempts to
|
||||
* Parses a set of files generated by Kohana::find_files and compiles it
|
||||
* down into an array of migrations
|
||||
*
|
||||
* @param array Available files
|
||||
* @return array Available Migrations
|
||||
*/
|
||||
public function compile_migrations_from_files(array $files)
|
||||
{
|
||||
$migrations = array();
|
||||
|
||||
foreach ($files as $file => $path)
|
||||
{
|
||||
// If this is a directory we're dealing with
|
||||
if (is_array($path))
|
||||
{
|
||||
$migrations += $this->compile_migrations_from_files($path);
|
||||
}
|
||||
else
|
||||
{
|
||||
$migration = $this->get_migration_from_filename($file);
|
||||
|
||||
$migrations[$migration['group'].':'.$migration['timestamp']] = $migration;
|
||||
}
|
||||
}
|
||||
|
||||
return $migrations;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts information about a migration from its filename.
|
||||
*
|
||||
* Returns an array like:
|
||||
*
|
||||
* array(
|
||||
* 'group' => 'mygroup',
|
||||
* 'timestamp' => '1293214439',
|
||||
* 'description' => 'initial-setup',
|
||||
* 'id' => 'mygroup:1293214439'
|
||||
* );
|
||||
*
|
||||
* @param string The migration's filename
|
||||
* @return array Array of components about the migration
|
||||
*/
|
||||
public function get_migration_from_filename($file)
|
||||
{
|
||||
$migration = array();
|
||||
|
||||
// Get rid of the file's "migrations/" prefix, the file extension and then
|
||||
// the filename itself. The "group" is essentially a slash delimited
|
||||
// path from the migrations folder to the migration file
|
||||
$migration['group'] = dirname(substr($file, 11, -strlen(EXT)));
|
||||
|
||||
if(strpos(basename($file), "_"))
|
||||
{
|
||||
list($migration['timestamp'], $migration['description'])
|
||||
= explode('_', basename($file, EXT), 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
$migration['timestamp'] = basename($file, EXT);
|
||||
$migration['description'] = "";
|
||||
}
|
||||
$migration['id'] = $migration['group'].':'.$migration['timestamp'];
|
||||
|
||||
return $migration;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a migration file from its timestamp, description and group
|
||||
*
|
||||
* @param integer|array The migration's ID or an array of timestamp, description
|
||||
* @param string The migration group
|
||||
* @return string Path to the migration file
|
||||
*/
|
||||
public function get_filename_from_migration(array $migration)
|
||||
{
|
||||
$group = $migration['group'];
|
||||
|
||||
if(!empty($migration['description']))
|
||||
{
|
||||
$migration = $migration['timestamp'].'_'.$migration['description'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$migration = $migration['timestamp'];
|
||||
}
|
||||
|
||||
$group = ( ! empty($group)) ? (rtrim($group, '/').'/') : '';
|
||||
|
||||
return $group.$migration.EXT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows you to work out the class name from either an array of migration
|
||||
* info, or from a migration id
|
||||
*
|
||||
* @param string|array The migration's ID or array of migration data
|
||||
* @return string The migration class name
|
||||
*/
|
||||
public function get_class_from_migration($migration)
|
||||
{
|
||||
if (is_string($migration))
|
||||
{
|
||||
$migration = str_replace(array(':', '/'), ' ', $migration);
|
||||
}
|
||||
else
|
||||
{
|
||||
$migration = str_replace('/', ' ', $migration['group']).'_'.$migration['timestamp'];
|
||||
}
|
||||
|
||||
return 'Migration_'.str_replace(array(' ', '-'), '_', ucwords($migration));
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks to see if the minion migrations table exists and attempts to
|
||||
* create it if it doesn't
|
||||
*
|
||||
* @return boolean
|
||||
|
@ -101,8 +215,8 @@ class Model_Minion_Migration extends Model
|
|||
}
|
||||
|
||||
/**
|
||||
* Creates a new select query which includes all fields in the migrations
|
||||
* table plus a `id` field which is a combination of the timestamp and the
|
||||
* Creates a new select query which includes all fields in the migrations
|
||||
* table plus a `id` field which is a combination of the timestamp and the
|
||||
* description
|
||||
*
|
||||
* @return Database_Query_Builder_Select
|
||||
|
@ -188,7 +302,7 @@ class Model_Minion_Migration extends Model
|
|||
public function update_migration(array $current, array $new)
|
||||
{
|
||||
$set = array();
|
||||
|
||||
|
||||
foreach ($new as $key => $value)
|
||||
{
|
||||
if ($key !== 'id' AND $current[$key] !== $value)
|
||||
|
@ -242,7 +356,7 @@ class Model_Minion_Migration extends Model
|
|||
/**
|
||||
* Fetches the latest version for all installed groups
|
||||
*
|
||||
* If a group does not have any applied migrations then no result will be
|
||||
* If a group does not have any applied migrations then no result will be
|
||||
* returned for it
|
||||
*
|
||||
* @return Kohana_Database_Result
|
||||
|
@ -265,7 +379,7 @@ class Model_Minion_Migration extends Model
|
|||
/**
|
||||
* Fetches a list of groups
|
||||
*
|
||||
* @return array
|
||||
* @return array
|
||||
*/
|
||||
public function fetch_groups($group_as_key = FALSE)
|
||||
{
|
||||
|
@ -277,7 +391,7 @@ class Model_Minion_Migration extends Model
|
|||
}
|
||||
|
||||
/**
|
||||
* Fetch a list of migrations that need to be applied in order to reach the
|
||||
* Fetch a list of migrations that need to be applied in order to reach the
|
||||
* required version
|
||||
*
|
||||
* @param string The groups to get migrations for
|
||||
|
@ -334,7 +448,7 @@ class Model_Minion_Migration extends Model
|
|||
$query->where('timestamp', '>=', $target);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// Absolute timestamp
|
||||
else
|
||||
|
@ -353,7 +467,7 @@ class Model_Minion_Migration extends Model
|
|||
$query->where('timestamp', '>', $target);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// If we're migrating up
|
||||
if ($up)
|
||||
{
|
||||
|
@ -408,7 +522,7 @@ class Model_Minion_Migration extends Model
|
|||
$timestamp = $group_applied ? $statuses[$group]['timestamp'] : NULL;
|
||||
$amount = substr($target, 1);
|
||||
$up = $target[0] === '+';
|
||||
|
||||
|
||||
if ($up)
|
||||
{
|
||||
if ($group_applied)
|
||||
|
@ -421,7 +535,7 @@ class Model_Minion_Migration extends Model
|
|||
if ( ! $group_applied)
|
||||
{
|
||||
throw new Kohana_Exception(
|
||||
"Cannot migrate group :group down as none of its migrations have been applied",
|
||||
"Cannot migrate group :group down as none of its migrations have been applied",
|
||||
array(':group' => $group)
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue