Пример #1
0
 /**
  * Main method builds all the targets for a typical propel project.
  */
 public function main()
 {
     $manager = new MigrationManager();
     $manager->setConnections($this->getGeneratorConfig()->getBuildConnections());
     $manager->setMigrationTable($this->getMigrationTable());
     $manager->setMigrationDir($this->getOutputDirectory());
     $previousTimestamps = $manager->getAlreadyExecutedMigrationTimestamps();
     if (!($nextMigrationTimestamp = array_pop($previousTimestamps))) {
         $this->log('No migration were ever executed on this database - nothing to reverse.');
         return false;
     }
     $this->log(sprintf('Executing migration %s down', $manager->getMigrationClassName($nextMigrationTimestamp)));
     if ($nbPreviousTimestamps = count($previousTimestamps)) {
         $previousTimestamp = array_pop($previousTimestamps);
     } else {
         $previousTimestamp = 0;
     }
     $migration = $manager->getMigrationObject($nextMigrationTimestamp);
     if (false === $migration->preDown($manager)) {
         $this->log('preDown() returned false. Aborting migration.', Project::MSG_ERR);
         return false;
     }
     foreach ($migration->getDownSQL() as $datasource => $sql) {
         $connection = $manager->getConnection($datasource);
         $this->log(sprintf('Connecting to database "%s" using DSN "%s"', $datasource, $connection['dsn']), Project::MSG_VERBOSE);
         $pdo = $manager->getPdoConnection($datasource);
         $res = 0;
         $statements = SqlParser::parseString($sql);
         foreach ($statements as $statement) {
             try {
                 $this->log(sprintf('Executing statement "%s"', $statement), Project::MSG_VERBOSE);
                 $stmt = $pdo->prepare($statement);
                 $stmt->execute();
                 $res++;
             } catch (PDOException $e) {
                 $this->log(sprintf('Failed to execute SQL "%s"', $statement), Project::MSG_ERR);
                 // continue
             }
         }
         if (!$res) {
             $this->log('No statement was executed. The version was not updated.');
             $this->log(sprintf('Please review the code in "%s"', $manager->getMigrationDir() . DIRECTORY_SEPARATOR . $manager->getMigrationClassName($nextMigrationTimestamp)));
             $this->log('Migration aborted', Project::MSG_ERR);
             return false;
         }
         $this->log(sprintf('%d of %d SQL statements executed successfully on datasource "%s"', $res, count($statements), $datasource));
         $manager->updateLatestMigrationTimestamp($datasource, $previousTimestamp);
         $this->log(sprintf('Downgraded migration date to %d for datasource "%s"', $previousTimestamp, $datasource), Project::MSG_VERBOSE);
     }
     $migration->postDown($manager);
     if ($nbPreviousTimestamps) {
         $this->log(sprintf('Reverse migration complete. %d more migrations available for reverse.', $nbPreviousTimestamps));
     } else {
         $this->log('Reverse migration complete. No more migration available for reverse');
     }
 }
Пример #2
0
 /**
  * Main method builds all the targets for a typical propel project.
  */
 public function main()
 {
     $manager = new MigrationManager();
     $manager->setConnections($this->getGeneratorConfig()->getBuildConnections());
     $manager->setMigrationTable($this->getMigrationTable());
     $manager->setMigrationDir($this->getOutputDirectory());
     if (!($nextMigrationTimestamp = $manager->getFirstUpMigrationTimestamp())) {
         $this->log('All migrations were already executed - nothing to migrate.');
         return false;
     }
     $timestamps = $manager->getValidMigrationTimestamps();
     if (count($timestamps) > 1) {
         $this->log(sprintf('%d migrations to execute', count($timestamps)));
     }
     foreach ($timestamps as $timestamp) {
         $this->log(sprintf('Executing migration %s up', $manager->getMigrationClassName($timestamp)));
         $migration = $manager->getMigrationObject($timestamp);
         if (false === $migration->preUp($manager)) {
             $this->log('preUp() returned false. Aborting migration.', Project::MSG_ERR);
             return false;
         }
         foreach ($migration->getUpSQL() as $datasource => $sql) {
             $connection = $manager->getConnection($datasource);
             $this->log(sprintf('Connecting to database "%s" using DSN "%s"', $datasource, $connection['dsn']), Project::MSG_VERBOSE);
             $pdo = $manager->getPdoConnection($datasource);
             $res = 0;
             $statements = SqlParser::parseString($sql);
             foreach ($statements as $statement) {
                 try {
                     $this->log(sprintf('Executing statement "%s"', $statement), Project::MSG_VERBOSE);
                     $stmt = $pdo->prepare($statement);
                     $stmt->execute();
                     $res++;
                 } catch (PDOException $e) {
                     $this->log(sprintf('Failed to execute SQL "%s"', $statement), Project::MSG_ERR);
                     // continue
                 }
             }
             if (!$res) {
                 $this->log('No statement was executed. The version was not updated.');
                 $this->log(sprintf('Please review the code in "%s"', $manager->getMigrationDir() . DIRECTORY_SEPARATOR . $manager->getMigrationClassName($timestamp)));
                 $this->log('Migration aborted', Project::MSG_ERR);
                 return false;
             }
             $this->log(sprintf('%d of %d SQL statements executed successfully on datasource "%s"', $res, count($statements), $datasource));
             $manager->updateLatestMigrationTimestamp($datasource, $timestamp);
             $this->log(sprintf('Updated latest migration date to %d for datasource "%s"', $timestamp, $datasource), Project::MSG_VERBOSE);
         }
         $migration->postUp($manager);
     }
     $this->log('Migration complete. No further migration to execute.');
 }
Пример #3
0
 public function main()
 {
     $manager = new MigrationManager();
     $manager->setConnections($this->getGeneratorConfig()->getBuildConnections());
     $manager->setMigrationTable($this->getMigrationTable());
     $manager->setMigrationDir($this->getOutputDirectory());
     // the following is a verbose version of MigrationManager::getValidMigrationTimestamps()
     // mostly for explicit output
     $this->log('Checking Database Versions...');
     foreach ($manager->getConnections() as $datasource => $params) {
         $this->log(sprintf('Connecting to database "%s" using DSN "%s"', $datasource, $params['dsn']), Project::MSG_VERBOSE);
         if (!$manager->migrationTableExists($datasource)) {
             $this->log(sprintf('Migration table does not exist in datasource "%s"; creating it.', $datasource), Project::MSG_VERBOSE);
             $manager->createMigrationTable($datasource);
         }
     }
     if ($oldestMigrationTimestamp = $manager->getOldestDatabaseVersion()) {
         $this->log(sprintf('Latest migration was executed on %s (timestamp %d)', date('Y-m-d H:i:s', $oldestMigrationTimestamp), $oldestMigrationTimestamp), Project::MSG_VERBOSE);
     } else {
         $this->log('No migration was ever executed on these connection settings.', Project::MSG_VERBOSE);
     }
     $this->log('Listing Migration files...');
     $dir = $this->getOutputDirectory();
     $migrationTimestamps = $manager->getMigrationTimestamps();
     $nbExistingMigrations = count($migrationTimestamps);
     if ($migrationTimestamps) {
         $this->log(sprintf('%d valid migration classes found in "%s"', $nbExistingMigrations, $dir), Project::MSG_VERBOSE);
         if ($validTimestamps = $manager->getValidMigrationTimestamps()) {
             $countValidTimestamps = count($validTimestamps);
             if ($countValidTimestamps == 1) {
                 $this->log('1 migration needs to be executed:');
             } else {
                 $this->log(sprintf('%d migrations need to be executed:', $countValidTimestamps));
             }
         }
         foreach ($migrationTimestamps as $timestamp) {
             $this->log(sprintf(' %s %s %s', $timestamp == $oldestMigrationTimestamp ? '>' : ' ', $manager->getMigrationClassName($timestamp), $timestamp <= $oldestMigrationTimestamp ? '(executed)' : ''), $timestamp <= $oldestMigrationTimestamp ? Project::MSG_VERBOSE : Project::MSG_INFO);
         }
     } else {
         $this->log(sprintf('No migration file found in "%s".', $dir));
         $this->log('Make sure you run the sql-diff task.');
         return false;
     }
     $migrationTimestamps = $manager->getValidMigrationTimestamps();
     $nbNotYetExecutedMigrations = count($migrationTimestamps);
     if (!$nbNotYetExecutedMigrations) {
         $this->log('All migration files were already executed - Nothing to migrate.');
         return false;
     }
     $this->log(sprintf('Call the "migrate" task to execute %s', $countValidTimestamps == 1 ? 'it' : 'them'));
 }