Commit d4e3567a authored by Jonathan.Wage's avatar Jonathan.Wage

Changes to migration.

parent be5eb98e
...@@ -43,7 +43,72 @@ class Doctrine_Migration ...@@ -43,7 +43,72 @@ class Doctrine_Migration
'added_indexes' => array(), 'added_indexes' => array(),
'removed_indexes' => array()); 'removed_indexes' => array());
static public function setCurrentVersion($number) public $migrationTableName = 'migration_version';
public $migrationClassesDirectory = array();
public $migrationClasses = array();
public function __construct($directory = null)
{
if ($directory != null) {
$this->migrationClassesDirectory = $directory;
$this->loadMigrationClasses();
}
}
protected function loadMigrationClasses()
{
$directory = $this->migrationClassesDirectory;
$classes = get_declared_classes();
if ($directory !== null) {
foreach ((array) $directory as $dir) {
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir),
RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($it as $file) {
$e = explode('.', $file->getFileName());
if (end($e) === 'php' && strpos($file->getFileName(), '.inc') === false) {
require_once $file->getPathName();
$requiredClass = array_diff(get_declared_classes(), $classes);
$requiredClass = end($requiredClass);
$loadedClasses[$requiredClass] = $file->getFileName();
}
}
}
}
$classes = $loadedClasses;
$parent = new ReflectionClass('Doctrine_Migration');
$loadedClasses = array();
foreach ($classes as $name => $fileName) {
$class = new ReflectionClass($name);
while ($class->isSubclassOf($parent)) {
$class = $class->getParentClass();
if ($class === false) {
break;
}
}
if ($class === false) {
continue;
}
$loadedClasses[$name] = $fileName;
}
$this->migrationClasses = $loadedClasses;
return $loadedClasses;
}
public function setCurrentVersion($number)
{ {
$conn = Doctrine_Manager::connection(); $conn = Doctrine_Manager::connection();
...@@ -62,7 +127,7 @@ class Doctrine_Migration ...@@ -62,7 +127,7 @@ class Doctrine_Migration
} }
} }
static public function getCurrentVersion() public function getCurrentVersion()
{ {
$conn = Doctrine_Manager::connection(); $conn = Doctrine_Manager::connection();
...@@ -71,93 +136,50 @@ class Doctrine_Migration ...@@ -71,93 +136,50 @@ class Doctrine_Migration
return isset($result[0]) ? $result[0]:false; return isset($result[0]) ? $result[0]:false;
} }
static public function migration($from, $to) public function migrate($from, $to)
{ {
if ($from === $to || $from === 0) { if ($from === $to) {
throw new Doctrine_Migration_Exception('You specified an invalid migration path. The from and to cannot be the same and from cannot be zero.'); throw new Doctrine_Migration_Exception('You specified an invalid migration path. The from and to cannot be the same.');
} }
$direction = $from > $to ? 'down':'up'; $direction = $from > $to ? 'down':'up';
if ($direction === 'up') { if ($direction === 'up') {
for ($i = $from + 1; $i <= $to; $i++) { for ($i = $from + 1; $i <= $to; $i++) {
self::doDirectionStep($direction, $i); $this->doMigrateStep($direction, $i);
} }
} else { } else {
for ($i = $from; $i > $to; $i--) { for ($i = $from; $i > $to; $i--) {
self::doDirectionStep($direction, $i); $this->doMigrateStep($direction, $i);
} }
} }
self::setCurrentVersion($to); $this->setCurrentVersion($to);
} }
public static function doDirectionStep($direction, $num) protected function getMigrationClass($num)
{ {
$className = 'Migration' . $num; $classes = $this->migrationClasses;
if (class_exists($className)) {
$migrate = new $className();
$migrate->migrate($direction);
} else {
throw new Doctrine_Migration_Exception('Could not find migration class: ' . $className);
}
}
public static function loadMigrationClasses($directory) foreach ($classes as $className => $fileName) {
{ $e = explode('_', $fileName);
$classes = get_declared_classes(); $classMigrationNum = (int) $e[0];
if ($directory !== null) { if ($classMigrationNum === $num) {
foreach ((array) $directory as $dir) { return new $className();
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir),
RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($it as $file) {
$e = explode('.', $file->getFileName());
if (end($e) === 'php' && strpos($file->getFileName(), '.inc') === false) {
require_once $file->getPathName();
}
} }
} }
$classes = array_diff(get_declared_classes(), $classes); throw new Doctrine_Migration_Exception('Could not find migration class for migration step: '.$num);
} }
return self::getLoadedMigrationClasses($classes); public function doMigrateStep($direction, $num)
}
public static function getLoadedMigrationClasses($classes = null)
{ {
if ($classes === null) { $migrate = $this->getMigrationClass($num);
$classes = get_declared_classes(); $migrate->doMigrate($direction);
}
$parent = new ReflectionClass('Doctrine_Migration');
$loadedClasses = array();
foreach ($classes as $name) {
$class = new ReflectionClass($name);
while ($class->isSubclassOf($parent)) {
$class = $class->getParentClass();
if ($class === false) {
break;
}
}
if ($class === false) {
continue;
}
$loadedClasses[] = $name;
}
return $loadedClasses;
} }
public function migrate($direction) public function doMigrate($direction)
{ {
if (method_exists($this, $direction)) { if (method_exists($this, $direction)) {
$this->$direction(); $this->$direction();
......
...@@ -2,18 +2,11 @@ The Doctrine Migration tools allow you to migrate databases and it issues alter ...@@ -2,18 +2,11 @@ The Doctrine Migration tools allow you to migrate databases and it issues alter
++ Writing Migration Classes ++ Writing Migration Classes
Migration classes consist of a simple class that extends from Doctrine_Migration. You can define a public up() and down() method that is meant for doing and undoing changes to a database for that migration step. Migration classes consist of a simple class that extends from Doctrine_Migration. You can define a public up() and down() method that is meant for doing and undoing changes to a database for that migration step. The class name is completely arbitrary, but the name of the file which contains the class must have a prefix containing the number it represents in the migration process. Example: XXX_representative_name.class.php
<code type="php"> <code type="php">
class MigrationTest extends Doctrine_Record // 001_add_table.class.php
{ class AddTable extends Doctrine_Migration
public function setTableDefinition()
{
$this->hasColumn('field1', 'string');
}
}
class Migration2 extends Doctrine_Migration
{ {
public function up() public function up()
{ {
...@@ -26,7 +19,8 @@ class Migration2 extends Doctrine_Migration ...@@ -26,7 +19,8 @@ class Migration2 extends Doctrine_Migration
} }
} }
class Migration3 extends Doctrine_Migration // 002_add_column.class.php
class AddColumn extends Doctrine_Migration
{ {
public function up() public function up()
{ {
...@@ -39,7 +33,8 @@ class Migration3 extends Doctrine_Migration ...@@ -39,7 +33,8 @@ class Migration3 extends Doctrine_Migration
} }
} }
class Migration4 extends Doctrine_Migration // 003_change_column.class.php
class ChangeColumn extends Doctrine_Migration
{ {
public function up() public function up()
{ {
...@@ -74,7 +69,8 @@ public function removeIndex($tableName, $indexName) ...@@ -74,7 +69,8 @@ public function removeIndex($tableName, $indexName)
You can alter table directly in your up() and down() methods like you normally would by creating new model instances and calling save() or creating queries and deleting data. You can alter table directly in your up() and down() methods like you normally would by creating new model instances and calling save() or creating queries and deleting data.
<code type="php"> <code type="php">
class Migration1 extends Doctrine_Migration // XXX_add_user.class.php
class AddUser extends Doctrine_Migration
{ {
public function up() public function up()
{ {
...@@ -97,16 +93,15 @@ class Migration1 extends Doctrine_Migration ...@@ -97,16 +93,15 @@ class Migration1 extends Doctrine_Migration
++ Performing Migrations ++ Performing Migrations
<code type="php"> <code type="php">
// Upgrade one at a time $migration = new Doctrine_Migration('migration_classes');
Doctrine_Migration::migration(1, 2); $migration->migrate(0, 1);
Doctrine_Migration::migration(2, 3); $migration->migrate(1, 2);
Doctrine_Migration::migration(3, 4); $migration->migrate(2, 3);
// Then revert back to version 1 // Then revert back to version 1
Doctrine_Migration::migration(4, 1); $migration->migrate(3, 2);
$migration->migrate(2, 1);
// One big upgrade $migration->migrate(1, 0);
Doctrine_Migration::migration(1, 4);
echo Doctrine_Migration::getCurrentVersion(); // should echo 4 echo $migration->getCurrentVersion(); // should echo 0
</code> </code>
\ No newline at end of file
<?php
class MigrationTest extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('field1', 'string');
}
}
\ No newline at end of file
...@@ -35,61 +35,15 @@ class Doctrine_Migration_TestCase extends Doctrine_UnitTestCase ...@@ -35,61 +35,15 @@ class Doctrine_Migration_TestCase extends Doctrine_UnitTestCase
public function testMigration() public function testMigration()
{ {
// Upgrade one at a time // Upgrade one at a time
Doctrine_Migration::migration(1, 2); $migration = new Doctrine_Migration('migration_classes');
Doctrine_Migration::migration(2, 3); $migration->migrate(0, 1);
Doctrine_Migration::migration(3, 4); $migration->migrate(1, 2);
// Then revert back to version 1 // Then revert back to version 1
Doctrine_Migration::migration(4, 1); $migration->migrate(2, 1);
$migration->migrate(1, 0);
// Check to make sure the current version is 1 // Check to make sure the current version is 0
$this->assertEqual(Doctrine_Migration::getCurrentVersion(), 1); $this->assertEqual($migration->getCurrentVersion(), 0);
}
}
class MigrationTest extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('field1', 'string');
}
}
class Migration2 extends Doctrine_Migration
{
public function up()
{
$this->createTable('migration_test', array('field1' => array('type' => 'string')));
}
public function down()
{
$this->dropTable('migration_test');
}
}
class Migration3 extends Doctrine_Migration
{
public function up()
{
$this->addColumn('migration_test', 'field1', 'string');
}
public function down()
{
$this->renameColumn('migration_test', 'field1', 'field2');
}
}
class Migration4 extends Doctrine_Migration
{
public function up()
{
$this->changeColumn('migration_test', 'field1', 'integer');
}
public function down()
{
$this->changeColumn('migration_test', 'field1', 'string');
} }
} }
\ No newline at end of file
<?php
class AddTable extends Doctrine_Migration
{
public function up()
{
$this->createTable('migration_test', array('field1' => array('type' => 'string')));
}
public function down()
{
$this->dropTable('migration_test');
}
}
\ No newline at end of file
<?php
class ChangeColumn extends Doctrine_Migration
{
public function up()
{
$this->changeColumn('migration_test', 'field1', 'integer');
}
public function down()
{
$this->changeColumn('migration_test', 'field1', 'string');
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment