From 69d40ec2da8f3ba6088cf20d4cf49fa26111bf50 Mon Sep 17 00:00:00 2001 From: gamonoid Date: Tue, 19 Sep 2017 00:03:57 +0200 Subject: [PATCH] Fix migration manager issues | check classes before running migration --- build.xml | 1 - robo/RoboFile.php | 2 + server.includes.inc.php | 4 +- src/Classes/Migration/MigrationManager.php | 98 +++++++++++-------- .../MigrationManagerIntegration.php | 46 +++++++++ 5 files changed, 106 insertions(+), 45 deletions(-) create mode 100644 test/integration/MigrationManagerIntegration.php diff --git a/build.xml b/build.xml index ff4819f3..0810f055 100644 --- a/build.xml +++ b/build.xml @@ -51,7 +51,6 @@ - diff --git a/robo/RoboFile.php b/robo/RoboFile.php index 8ad9f8ed..7b28e671 100644 --- a/robo/RoboFile.php +++ b/robo/RoboFile.php @@ -26,6 +26,7 @@ class RoboFile extends \Robo\Tasks $this->includeCientConfig($client); $this->say("DB Migrating " . $action . " for ". $client); $migrationManager = new \Classes\Migration\MigrationManager(); + $migrationManager->setMigrationPath(APP_BASE_PATH .'/migrations/'); $res = $migrationManager->runMigration($action); $this->say("DB Migrating Result : " . print_r($res, true)); } @@ -34,6 +35,7 @@ class RoboFile extends \Robo\Tasks $this->includeCientConfig($client); $this->say("Run all pending migrations " . " for ". $client); $migrationManager = new \Classes\Migration\MigrationManager(); + $migrationManager->setMigrationPath(APP_BASE_PATH .'/migrations/'); $migrationManager->queueMigrations(); $migrations = $migrationManager->getPendingMigrations(); foreach ($migrations as $migration) { diff --git a/server.includes.inc.php b/server.includes.inc.php index 5d598d19..7fc3d787 100644 --- a/server.includes.inc.php +++ b/server.includes.inc.php @@ -48,7 +48,9 @@ $notificationManager = new \Classes\NotificationManager(); \Classes\BaseService::getInstance()->setNotificationManager($notificationManager); \Classes\BaseService::getInstance()->setSettingsManager($settingsManager); \Classes\BaseService::getInstance()->setCustomFieldManager(new \Classes\CustomFieldManager()); -\Classes\BaseService::getInstance()->setMigrationManager(new \Classes\Migration\MigrationManager()); +$migrationManager = new \Classes\Migration\MigrationManager(); +$migrationManager->setMigrationPath(APP_BASE_PATH .'/migrations/'); +\Classes\BaseService::getInstance()->setMigrationManager($migrationManager); $notificationManager->setBaseService($baseService); diff --git a/src/Classes/Migration/MigrationManager.php b/src/Classes/Migration/MigrationManager.php index bb726348..bbf5f318 100644 --- a/src/Classes/Migration/MigrationManager.php +++ b/src/Classes/Migration/MigrationManager.php @@ -14,18 +14,13 @@ use Utils\LogManager; class MigrationManager { - private $migration_path; + private $migrationPath; protected $db = null; - public function __construct() + public function setMigrationPath($migrationPath) { - $this->migration_path = APP_BASE_PATH .'/migrations/'; - } - - public function setMigrationPath($migration_path) - { - $this->migration_path = $migration_path; + $this->migrationPath = $migrationPath; } public function getMigrationById($id) @@ -63,10 +58,10 @@ class MigrationManager { $migrations = array(); - $ams = scandir($this->migration_path); + $ams = scandir($this->migrationPath); foreach ($ams as $am) { - if (is_file($this->migration_path . $am)) { - $migrations[$am] = $this->migration_path . $am; + if (is_file($this->migrationPath . $am) && $am !== '.' && $am !== '..' && !empty($am)) { + $migrations[$am] = $this->migrationPath . $am; } } @@ -84,19 +79,28 @@ class MigrationManager if ($file == 'list.php') { continue; } - $migration = new Migration(); - $migration->file = $file; - $parts = explode("_", $file); - $migration->version = intval($parts[1]); - $migration->created = date("Y-m-d H:i:s"); - $migration->updated = date("Y-m-d H:i:s"); - $migration->status = 'Pending'; - $migration->Save(); + $this->createMigration($file); } } } } + public function createMigration($file) + { + if (file_exists($this->migrationPath . $file)) { + $migration = new Migration(); + $migration->file = $file; + $parts = explode("_", $file); + $migration->version = intval($parts[1]); + $migration->created = date("Y-m-d H:i:s"); + $migration->updated = date("Y-m-d H:i:s"); + $migration->status = 'Pending'; + $migration->Save(); + return true; + } + return false; + } + public function runPendingMigrations() { $migrations = $this->getPendingMigrations(); @@ -134,6 +138,27 @@ class MigrationManager return false; } + /** + * @param string $migrationFileName + * @return AbstractMigration + */ + + public function getMigrationObject($migrationFileName) + { + $path = $this->migrationPath . $migrationFileName; + $migrationName = str_replace('.php', '', $migrationFileName); + $migrationName = '\\Classes\\Migration\\'.$migrationName; + + if (!class_exists($migrationName)) { + include $path; + } + if (!class_exists($migrationName)) { + return false; + } + /* @var AbstractMigration $migClass */ + return new $migrationName($migrationFileName); + } + /** * @param Migration $migration * @return bool @@ -144,20 +169,14 @@ class MigrationManager return false; } - $path = $this->migration_path . $migration->file; - if (!file_exists($path)) { + /* @var AbstractMigration $migObject */ + $migObject = $this->getMigrationObject($migration->file); + if (!$migObject) { return false; } - $migrationName = str_replace('.php', '', $migration->file); - if (!class_exists('\\Classes\\Migration\\'.$migrationName)) { - include $path; - } - /* @var AbstractMigration $migClass */ - $migrationName = '\\Classes\\Migration\\'.$migrationName; - $migClass = new $migrationName($migration->file); - $res = $migClass->up(); + $res = $migObject->up(); if (!$res) { - $migration->last_error = $migClass->getLastError(); + $migration->last_error = $migObject->getLastError(); $migration->status = "UpError"; $migration->updated = date("Y-m-d H:i:s"); $migration->Save(); @@ -179,21 +198,14 @@ class MigrationManager return false; } - $path = $this->migration_path . $migration->file; - if (!file_exists($path)) { + /* @var AbstractMigration $migObject */ + $migObject = $this->getMigrationObject($migration->file); + if (!$migObject) { return false; } - - $migrationName = str_replace('.php', '', $migration->file); - if (!class_exists($migrationName)) { - include $path; - } - /* @var AbstractMigration $migClass */ - $migrationName = '\\Classes\\Migration\\'.$migrationName; - $migClass = new $migrationName($migration->file); - $res = $migClass->down(); + $res = $migObject->down(); if (!$res) { - $migration->last_error = $migClass->getLastError(); + $migration->last_error = $migObject->getLastError(); $migration->status = "DownError"; $migration->updated = date("Y-m-d H:i:s"); $migration->Save(); @@ -211,7 +223,7 @@ class MigrationManager $migration = new Migration(); $migration->Load("1 = 1 order by id desc limit 1"); - include $this->migration_path . "list.php"; + include $this->migrationPath . "list.php"; /* @var array $migrationList */ if (count($migrationList) > 0 && (empty($migration->id) || $migrationList[0].".php" != $migration->file)) { LogManager::getInstance()->info("ensureMigrations - execute migrations"); diff --git a/test/integration/MigrationManagerIntegration.php b/test/integration/MigrationManagerIntegration.php new file mode 100644 index 00000000..aec393e7 --- /dev/null +++ b/test/integration/MigrationManagerIntegration.php @@ -0,0 +1,46 @@ +migrationManager = new MigrationManager(); + for ($i = 0; $i < 5; $i++) { + $migration = new Migration(); + $migration->file = 'migration'.$i; + $migration->version = '190000'; + $migration->created = date("Y-m-d H:i:s", intval(time()) - 10 * $i); + $migration->updated = date("Y-m-d H:i:s", intval(time()) - 10 * $i); + $migration->status = 'Pending'; + $migration->Save(); + } + + } + + protected function tearDown(){ + parent::tearDown(); + $migration = new Migration(); + $migration->DB()->execute("delete from Migrations"); + } + + public function testGetCurrentMigrations() { + $migrations = $this->migrationManager->getCurrentMigrations(); + self::assertEquals(5, count($migrations)); + } + + +}