private function SyncTable(IConnection $Connection, IDatabaseModifier $Modifier, Relational\Table $Table = null, Relational\Table $CurrentTable = null)
{
if ($Table === null && $CurrentTable === null) {
return;
}
if ($CurrentTable === null) {
$this->CreateTable($Connection, $Modifier, $Table);
} else {
if ($Table === null) {
if ($this->DropUnspecifiedTables) {
$Modifier->DropTable($Connection, $CurrentTable);
}
} else {
list($TraitsToAdd, $TraitsToRemove) = $this->GetTableStructuralTraits($Table, $CurrentTable);
list($ColumnsToModify, $ColumnsToAdd, $ColumnsToRemove) = $this->GetTableColumns($Table->GetColumns(), $CurrentTable->GetColumns());
foreach ($TraitsToRemove as $TraitToRemove) {
$Modifier->DropTableTrait($Connection, $Table, $TraitToRemove);
}
if ($this->DropUnspecifiedColumns) {
foreach ($ColumnsToRemove as $ColumnToRemove) {
$Modifier->DropColumn($Connection, $Table, $ColumnToRemove);
}
}
ksort($ColumnsToAdd, SORT_NUMERIC);
ksort($ColumnsToModify, SORT_NUMERIC);
$AllColumns = array_values($Table->GetColumns());
$MinimumPositionIndex = min(array_keys($AllColumns));
foreach ($ColumnsToAdd as $Position => $ColumnToAdd) {
$PreviousColumn = null;
if ($Position !== $MinimumPositionIndex) {
$PreviousColumn = $AllColumns[$Position - 1];
}
$Modifier->AddColumn($Connection, $Table, $ColumnToAdd, $PreviousColumn);
}
foreach ($ColumnsToModify as $Position => $ColumnToModify) {
$PreviousColumn = null;
if ($Position !== $MinimumPositionIndex) {
$PreviousColumn = $AllColumns[$Position - 1];
}
$Modifier->ModifyColumn($Connection, $Table, $ColumnToModify, $PreviousColumn);
}
foreach ($TraitsToAdd as $TraitToAdd) {
$Modifier->AddTableTrait($Connection, $Table, $TraitToAdd);
}
}
}
}