/** * Generate subpart of raport for columns of table. * * @param string $table * @return array */ private function diffColumns($table) { $sourceTable = $this->adapter('source')->table($table); $targetTable = $this->adapter('target')->table($table); $sourceColumns = $sourceTable->columns(); $targetColumns = $targetTable->columns(); $baseDiff = $this->baseDiff($sourceColumns, $targetColumns); $diff = $baseDiff['diff']; $status = $baseDiff['status']; foreach ($diff as $column => &$diffColumn) { if ($diffColumn['status'] != self::NO_CHANGE) { // pomijam kolumny usuniete lub dodane continue; } // tworze kolumny ze zrodla oraz z docelowej bazy $sourceColumn = $sourceTable->column($column); $targetColumn = $targetTable->column($column); // przechodze po wszystkich dostepnych atrybutach kolumny foreach (Column::allAttributes() as $attribute) { if ($this->omitAttribute($attribute, 'column')) { continue; } // pobieram wartosci tych atrybytow $sourceAttribute = $sourceColumn->{$attribute}(); $targetAttribute = $targetColumn->{$attribute}(); if ($sourceAttribute == Column::NOT_SUPPORTED || $targetAttribute == Column::NOT_SUPPORTED) { // jesli ktorykolwiek z atrybutow nie jest wspierany przez // ktorykolwiek z adapterow to pomijam cala procedure // porownania continue; } // @todo : trzeba zmodyfikowac metoda sprawdzania if ($sourceAttribute !== $targetAttribute) { // atrybuty sa rozne wiec zaznaczam ze kolumna sie rozni, // zmienna status oznacza ze w calej tabeli cos sie rozni $diffColumn['status'] = $status = self::CHANGED; // zapisuje wartosci tych atrybutow $diffColumn['diff'][$attribute] = array('source' => $sourceAttribute, 'target' => $targetAttribute); } } } return array('diff' => $diff, 'status' => $status); }
public function inline(MidataColumn $column) { $assert = $this->service('assert'); $sql = ""; $columnName = $column->name(); $type = $column->need(MidataColumn::ATTRIBUTE_TYPE); $nullable = $column->need(MidataColumn::ATTRIBUTE_NULLABLE); $defaultValue = $column->need(MidataColumn::ATTRIBUTE_DEFAULTVALUE); $length = $column->need(MidataColumn::ATTRIBUTE_LENGTH); $numericPrecision = $column->need(MidataColumn::ATTRIBUTE_NUMERICPRECISION); $numericScale = $column->need(MidataColumn::ATTRIBUTE_NUMERICSCALE); $unsigned = $column->need(MidataColumn::ATTRIBUTE_UNSIGNED); if ($unsigned) { $unsigned = "unsigned"; } else { $unsigned = ""; } $sequence = false; if ($column->isSupported(MidataColumn::ATTRIBUTE_SEQUENCE)) { $sequence = $column->sequence(); } $comment = ""; if ($column->isSupported(MidataColumn::ATTRIBUTE_COMMENT)) { $comment = $column->comment(); } $typeOfDataType = $this->typeOfDataType($type); switch ($typeOfDataType) { case 'precision': $sql = "`{$columnName}` {$type}({$numericPrecision}) {$unsigned}"; break; case 'precisionScale': $sql = "`{$columnName}` {$tyle}({$numericPrecision}, {$numericScale}) {$unsigned}"; break; case 'length': $sql = "`{$columnName}` {$type}({$length})"; break; case 'empty': $sql = "`{$columnName}` {$type}"; break; case 'enum': $enums = ""; foreach ($column->enums() as $enum) { $enums .= "'{$enum}',"; } $enums = trim($enums, ','); $sql = "`{$columnName}` {$type}({$enums})"; break; default: $assert->exception("Not recognized type of data type."); break; } if ($nullable) { $sql = "{$sql} NULL"; } else { $sql = "{$sql} NOT NULL"; } if (is_null($defaultValue)) { if ($column->nullable()) { $sql = "{$sql} DEFAULT NULL"; } } else { if (in_array($defaultValue, self::$predefinedDefaultValue)) { $sql = "{$sql} DEFAULT {$defaultValue}"; } else { $sql = "{$sql} DEFAULT '{$defaultValue}'"; } } if (!empty($comment)) { $sql = "{$sql} COMMENT '{$comment}'"; } if ($sequence) { $sql = "{$sql} AUTO_INCREMENT"; } return $sql; }