/** * 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; }
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); }
/** * 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; }
/** * 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; }