Пример #1
0
 /**
  * Perform a migration of this module.
  *
  * Make sure you rollback any changes if your migration fails!
  *
  * By default, the migrate routine just runs the migrations in Doctrine for your models, based on the version of
  * this module and the version registered in the database.
  * If that's all you need for your migrations, you don't need to override this function.
  * All models in the directory of your module will be migrated.
  *
  * You do not need to override this class if you are not adding additional functionality to it.
  *
  * @return array | NULL Array of failures, or NULL if everything is OK
  */
 public function migrate($identifier)
 {
     $package = Package_Catalog::getPackageByIdentifier($identifier);
     if (!empty($package['models'])) {
         $loadedModels = Doctrine::loadModels($package['directory'] . '/models', Doctrine::MODEL_LOADING_CONSERVATIVE);
     }
     if (empty($loadedModels)) {
         return;
     }
     $installed = Package_Catalog::getInstalledPackage($package['packageName']);
     if (Package_Dependency::compareVersion($package['version'], $installed['version'])) {
         kohana::log('debug', 'Attempting to upgrade package ' . $installed['packageName'] . ' version ' . $installed['version'] . ' to ' . $package['version']);
         foreach ($loadedModels as $modelName) {
             if (get_parent_class($modelName) != 'Bluebox_Record' and get_parent_class($modelName) != 'Doctrine_Record') {
                 continue;
             }
             $migrationDirectory = $package['directory'] . '/migrations/' . $modelName;
             kohana::log('debug', 'Looking for migrations in `' . $migrationDirectory . '`');
             if (is_dir($migrationDirectory)) {
                 try {
                     $migration = new Bluebox_Migration($migrationDirectory, NULL, strtolower($modelName));
                     kohana::log('debug', 'Running migration on ' . $modelName . ' from model version ' . $migration->getCurrentVersion() . ' to ' . $migration->getLatestVersion());
                     $migration->migrate();
                     $msg = inflector::humanizeModelName($modelName);
                     $msg .= ' database table upgraded to model version # ' . $migration->getCurrentVersion();
                     Package_Message::set($msg, 'info', $identifier);
                 } catch (Exception $e) {
                     kohana::log('alert', 'Alerts during migration, this can USUALLY be ignored: ' . $e->getMessage());
                     // TODO: This isnt a great idea, but migrations are so noisy with needless failures... PITA
                     $migration->setCurrentVersion($migration->getLatestVersion());
                     foreach ($migration->getErrors() as $error) {
                         if (strstr($error->getMessage(), 'Already at version')) {
                             $msg = inflector::humanizeModelName($modelName);
                             $msg .= ' database table ' . inflector::lcfirst($error->getMessage());
                             Package_Message::set($msg, 'info', $identifier);
                         } else {
                             Package_Message::set($error->getMessage(), 'alert', $identifier);
                         }
                     }
                 }
             } else {
                 $migration = new Bluebox_Migration(NULL, NULL, strtolower($modelName));
                 $migration->setCurrentVersion(0);
             }
         }
     } else {
         kohana::log('debug', 'Attempting to downgrade package ' . $installed['packageName'] . ' version ' . $installed['version'] . ' to ' . $package['version']);
         foreach ($loadedModels as $modelName) {
             if (get_parent_class($modelName) != 'Bluebox_Record' and get_parent_class($modelName) != 'Doctrine_Record') {
                 continue;
             }
             $migrationDirectory = $installed['directory'] . '/migrations/' . $modelName;
             kohana::log('debug', 'Looking for migrations in `' . $migrationDirectory . '`');
             if (is_dir($migrationDirectory)) {
                 try {
                     $modelVersion = 0;
                     if (is_dir($package['directory'] . '/migrations/' . $modelName)) {
                         $previousMigration = new Doctrine_Migration($package['directory'] . '/migrations/' . $modelName);
                         $modelVersion = $previousMigration->getLatestVersion();
                     }
                     kohana::log('debug', 'Determined that ' . $package['packageName'] . ' version ' . $package['version'] . ' works against ' . $modelName . ' version ' . $modelVersion);
                     $migration = new Bluebox_Migration($migrationDirectory, NULL, strtolower($modelName));
                     kohana::log('debug', 'Running migration on ' . $modelName . ' from model version ' . $migration->getCurrentVersion() . ' to ' . $modelVersion);
                     $migration->migrate($modelVersion);
                     $msg = inflector::humanizeModelName($modelName);
                     $msg .= ' database table downgraded to model version # ' . $migration->getCurrentVersion();
                     Package_Message::set($msg, 'info', $identifier);
                 } catch (Exception $e) {
                     kohana::log('alert', 'Alerts during migration, this can USUALLY be ignored: ' . $e->getMessage());
                     // TODO: This isnt a great idea, but migrations are so noisy with needless failures... PITA
                     $migration->setCurrentVersion($migration->getLatestVersion());
                     foreach ($migration->getErrors() as $error) {
                         if (strstr($error->getMessage(), 'Already at version')) {
                             $msg = inflector::humanizeModelName($modelName);
                             $msg .= ' database table ' . inflector::lcfirst($error->getMessage());
                             Package_Message::set($msg, 'info', $identifier);
                         } else {
                             Package_Message::set($error->getMessage(), 'alert', $identifier);
                         }
                     }
                 }
             } else {
                 $migration = new Bluebox_Migration(NULL, NULL, strtolower($modelName));
                 $migration->setCurrentVersion(0);
             }
         }
     }
 }