/**
  * Returns the number of differences.
  *
  * Compares the tables of the fromDatabase and the toDatabase, and modifies
  * the inner databaseDiff if necessary.
  *
  * @param  boolean $caseInsensitive
  * @return integer
  */
 public function compareTables($caseInsensitive = false)
 {
     $fromDatabaseTables = $this->fromDatabase->getTables();
     $toDatabaseTables = $this->toDatabase->getTables();
     $databaseDifferences = 0;
     $platform = $this->toDatabase->getPlatform() ?: $this->fromDatabase->getPlatform();
     // check for new tables in $toDatabase
     foreach ($toDatabaseTables as $table) {
         if ($platform) {
             $platform->normalizeTable($table);
         }
         if (!$this->fromDatabase->hasTable($table->getName(), $caseInsensitive) && !$table->isSkipSql()) {
             $this->databaseDiff->addAddedTable($table->getName(), $table);
             $databaseDifferences++;
         }
     }
     // check for removed tables in $toDatabase
     foreach ($fromDatabaseTables as $table) {
         if (!$this->toDatabase->hasTable($table->getName(), $caseInsensitive) && !$table->isSkipSql()) {
             $this->databaseDiff->addRemovedTable($table->getName(), $table);
             $databaseDifferences++;
         }
     }
     // check for table differences
     foreach ($fromDatabaseTables as $fromTable) {
         if ($this->toDatabase->hasTable($fromTable->getName(), $caseInsensitive)) {
             $toTable = $this->toDatabase->getTable($fromTable->getName(), $caseInsensitive);
             $databaseDiff = TableComparator::computeDiff($fromTable, $toTable, $caseInsensitive);
             if ($databaseDiff) {
                 $this->databaseDiff->addModifiedTable($fromTable->getName(), $databaseDiff);
                 $databaseDifferences++;
             }
         }
     }
     $renamed = [];
     // check for table renamings
     foreach ($this->databaseDiff->getAddedTables() as $addedTableName => $addedTable) {
         foreach ($this->databaseDiff->getRemovedTables() as $removedTableName => $removedTable) {
             if (!in_array($addedTableName, $renamed) && !TableComparator::computeDiff($addedTable, $removedTable, $caseInsensitive)) {
                 // no difference except the name, that's probably a renaming
                 $renamed[] = $addedTableName;
                 $this->databaseDiff->addRenamedTable($removedTableName, $addedTableName);
                 $this->databaseDiff->removeAddedTable($addedTableName);
                 $this->databaseDiff->removeRemovedTable($removedTableName);
                 $databaseDifferences--;
             }
         }
     }
     return $databaseDifferences;
 }
 /**
  * Builds the DDL SQL to modify a database
  * based on a DatabaseDiff instance
  *
  * @return string
  */
 public function getModifyDatabaseDDL(DatabaseDiff $databaseDiff)
 {
     $ret = '';
     foreach ($databaseDiff->getRemovedTables() as $table) {
         $ret .= $this->getDropTableDDL($table);
     }
     foreach ($databaseDiff->getRenamedTables() as $fromTableName => $toTableName) {
         $ret .= $this->getRenameTableDDL($fromTableName, $toTableName);
     }
     foreach ($databaseDiff->getModifiedTables() as $tableDiff) {
         $ret .= $this->getModifyTableDDL($tableDiff);
     }
     foreach ($databaseDiff->getAddedTables() as $table) {
         $ret .= $this->getAddTableDDL($table);
     }
     if ($ret) {
         $ret = $this->getBeginDDL() . $ret . $this->getEndDDL();
     }
     return $ret;
 }
Esempio n. 3
0
 public function getModifyDatabaseDDL(DatabaseDiff $databaseDiff)
 {
     foreach ($databaseDiff->getModifiedTables() as $table) {
         $this->checkTable($table->getToTable());
     }
     foreach ($databaseDiff->getAddedTables() as $table) {
         $this->checkTable($table);
     }
     return parent::getModifyDatabaseDDL($databaseDiff);
 }
Esempio n. 4
0
 /**
  * Builds the DDL SQL to modify a database
  * based on a DatabaseDiff instance
  *
  * @return     string
  */
 public function getModifyDatabaseDDL(DatabaseDiff $databaseDiff)
 {
     $ret = $this->getBeginDDL();
     foreach ($databaseDiff->getRemovedTables() as $table) {
         $ret .= $this->getDropTableDDL($table);
     }
     foreach ($databaseDiff->getRenamedTables() as $fromTableName => $toTableName) {
         $ret .= $this->getRenameTableDDL($fromTableName, $toTableName);
     }
     foreach ($databaseDiff->getAddedTables() as $table) {
         $ret .= $this->getAddTableDDL($table);
         $ret .= $this->getAddIndicesDDL($table);
     }
     foreach ($databaseDiff->getModifiedTables() as $tableDiff) {
         $ret .= $this->getModifyTableDDL($tableDiff);
     }
     foreach ($databaseDiff->getAddedTables() as $table) {
         $ret .= $this->getAddForeignKeysDDL($table);
     }
     $ret .= $this->getEndDDL();
     return $ret;
 }
Esempio n. 5
0
 /**
  * Returns the number of differences.
  *
  * Compares the tables of the fromDatabase and the toDatabase, and modifies
  * the inner databaseDiff if necessary.
  *
  * @param  boolean $caseInsensitive
  * @return integer
  */
 public function compareTables($caseInsensitive = false)
 {
     $fromDatabaseTables = $this->fromDatabase->getTables();
     $toDatabaseTables = $this->toDatabase->getTables();
     $databaseDifferences = 0;
     // check for new tables in $toDatabase
     foreach ($toDatabaseTables as $table) {
         if ($this->isTableExcluded($table)) {
             continue;
         }
         if (!$this->fromDatabase->hasTable($table->getName(), $caseInsensitive) && !$table->isSkipSql()) {
             $this->databaseDiff->addAddedTable($table->getName(), $table);
             $databaseDifferences++;
         }
     }
     // check for removed tables in $toDatabase
     if ($this->getRemoveTable()) {
         foreach ($fromDatabaseTables as $table) {
             if ($this->isTableExcluded($table)) {
                 continue;
             }
             if (!$this->toDatabase->hasTable($table->getName(), $caseInsensitive) && !$table->isSkipSql()) {
                 $this->databaseDiff->addRemovedTable($table->getName(), $table);
                 $databaseDifferences++;
             }
         }
     }
     // check for table differences
     foreach ($fromDatabaseTables as $fromTable) {
         if ($this->isTableExcluded($fromTable)) {
             continue;
         }
         if ($this->toDatabase->hasTable($fromTable->getName(), $caseInsensitive)) {
             $toTable = $this->toDatabase->getTable($fromTable->getName(), $caseInsensitive);
             $databaseDiff = TableComparator::computeDiff($fromTable, $toTable, $caseInsensitive);
             if ($databaseDiff) {
                 $this->databaseDiff->addModifiedTable($fromTable->getName(), $databaseDiff);
                 $databaseDifferences++;
             }
         }
     }
     // check for table renamings
     foreach ($this->databaseDiff->getAddedTables() as $addedTableName => $addedTable) {
         foreach ($this->databaseDiff->getRemovedTables() as $removedTableName => $removedTable) {
             if (!TableComparator::computeDiff($addedTable, $removedTable, $caseInsensitive)) {
                 // no difference except the name, that's probably a renaming
                 if ($this->getWithRenaming()) {
                     $this->databaseDiff->addRenamedTable($removedTableName, $addedTableName);
                     $this->databaseDiff->removeAddedTable($addedTableName);
                     $this->databaseDiff->removeRemovedTable($removedTableName);
                     $databaseDifferences--;
                 } else {
                     $this->databaseDiff->addPossibleRenamedTable($removedTableName, $addedTableName);
                 }
                 // skip to the next added table
                 break;
             }
         }
     }
     return $databaseDifferences;
 }