📄 modelcomparator.java
字号:
AddColumnChange change = new AddColumnChange(sourceTable,
targetColumn,
columnIdx > 0 ? targetTable.getColumn(columnIdx - 1) : null,
columnIdx < targetTable.getColumnCount() - 1 ? targetTable.getColumn(columnIdx + 1) : null);
changes.add(change);
addColumnChanges.put(targetColumn, change);
}
else
{
changes.addAll(compareColumns(sourceTable, sourceColumn, targetTable, targetColumn));
}
}
// if the last columns in the target table are added, then we note this at the changes
for (int columnIdx = targetTable.getColumnCount() - 1; columnIdx >= 0; columnIdx--)
{
Column targetColumn = targetTable.getColumn(columnIdx);
AddColumnChange change = (AddColumnChange)addColumnChanges.get(targetColumn);
if (change == null)
{
// column was not added, so we can ignore any columns before it that were added
break;
}
else
{
change.setAtEnd(true);
}
}
Column[] sourcePK = sourceTable.getPrimaryKeyColumns();
Column[] targetPK = targetTable.getPrimaryKeyColumns();
if ((sourcePK.length == 0) && (targetPK.length > 0))
{
if (_log.isInfoEnabled())
{
_log.info("A primary key needs to be added to the table " + sourceTable.getName());
}
// we have to use the target table here because the primary key might
// reference a new column
changes.add(new AddPrimaryKeyChange(targetTable, targetPK));
}
else if ((targetPK.length == 0) && (sourcePK.length > 0))
{
if (_log.isInfoEnabled())
{
_log.info("The primary key needs to be removed from the table " + sourceTable.getName());
}
changes.add(new RemovePrimaryKeyChange(sourceTable, sourcePK));
}
else if ((sourcePK.length > 0) && (targetPK.length > 0))
{
boolean changePK = false;
if (sourcePK.length != targetPK.length)
{
changePK = true;
}
else
{
for (int pkColumnIdx = 0; (pkColumnIdx < sourcePK.length) && !changePK; pkColumnIdx++)
{
if ((_caseSensitive && !sourcePK[pkColumnIdx].getName().equals(targetPK[pkColumnIdx].getName())) ||
(!_caseSensitive && !sourcePK[pkColumnIdx].getName().equalsIgnoreCase(targetPK[pkColumnIdx].getName())))
{
changePK = true;
}
}
}
if (changePK)
{
if (_log.isInfoEnabled())
{
_log.info("The primary key of table " + sourceTable.getName() + " needs to be changed");
}
changes.add(new PrimaryKeyChange(sourceTable, sourcePK, targetPK));
}
}
HashMap columnPosChanges = new HashMap();
for (int columnIdx = 0; columnIdx < sourceTable.getColumnCount(); columnIdx++)
{
Column sourceColumn = sourceTable.getColumn(columnIdx);
Column targetColumn = targetTable.findColumn(sourceColumn.getName(), _caseSensitive);
if (targetColumn == null)
{
if (_log.isInfoEnabled())
{
_log.info("Column " + sourceColumn.getName() + " needs to be removed from table " + sourceTable.getName());
}
changes.add(new RemoveColumnChange(sourceTable, sourceColumn));
}
else
{
int targetColumnIdx = targetTable.getColumnIndex(targetColumn);
if (targetColumnIdx != columnIdx)
{
columnPosChanges.put(sourceColumn, new Integer(targetColumnIdx));
}
}
}
if (!columnPosChanges.isEmpty())
{
changes.add(new ColumnOrderChange(sourceTable, columnPosChanges));
}
return changes;
}
/**
* Compares the two columns and returns the changes necessary to create the second
* column from the first one.
*
* @param sourceTable The source table which contains the source column
* @param sourceColumn The source column
* @param targetTable The target table which contains the target column
* @param targetColumn The target column
* @return The changes
*/
public List compareColumns(Table sourceTable,
Column sourceColumn,
Table targetTable,
Column targetColumn)
{
ArrayList changes = new ArrayList();
if (_platformInfo.getTargetJdbcType(targetColumn.getTypeCode()) != sourceColumn.getTypeCode())
{
changes.add(new ColumnDataTypeChange(sourceTable, sourceColumn, targetColumn.getTypeCode()));
}
boolean sizeMatters = _platformInfo.hasSize(sourceColumn.getTypeCode());
boolean scaleMatters = _platformInfo.hasPrecisionAndScale(sourceColumn.getTypeCode());
if (sizeMatters &&
!StringUtils.equals(sourceColumn.getSize(), targetColumn.getSize()))
{
changes.add(new ColumnSizeChange(sourceTable, sourceColumn, targetColumn.getSizeAsInt(), targetColumn.getScale()));
}
else if (scaleMatters &&
(!StringUtils.equals(sourceColumn.getSize(), targetColumn.getSize()) ||
(sourceColumn.getScale() != targetColumn.getScale())))
{
changes.add(new ColumnSizeChange(sourceTable, sourceColumn, targetColumn.getSizeAsInt(), targetColumn.getScale()));
}
Object sourceDefaultValue = sourceColumn.getParsedDefaultValue();
Object targetDefaultValue = targetColumn.getParsedDefaultValue();
if (((sourceDefaultValue == null) && (targetDefaultValue != null)) ||
((sourceDefaultValue != null) && !sourceDefaultValue.equals(targetDefaultValue)))
{
changes.add(new ColumnDefaultValueChange(sourceTable, sourceColumn, targetColumn.getDefaultValue()));
}
if (sourceColumn.isRequired() != targetColumn.isRequired())
{
changes.add(new ColumnRequiredChange(sourceTable, sourceColumn));
}
if (sourceColumn.isAutoIncrement() != targetColumn.isAutoIncrement())
{
changes.add(new ColumnAutoIncrementChange(sourceTable, sourceColumn));
}
return changes;
}
/**
* Searches in the given table for a corresponding foreign key. If the given key
* has no name, then a foreign key to the same table with the same columns (but not
* necessarily in the same order) is searched. If the given key has a name, then the
* corresponding key also needs to have the same name, or no name at all, but not a
* different one.
*
* @param table The table to search in
* @param fk The original foreign key
* @return The corresponding foreign key if found
*/
private ForeignKey findCorrespondingForeignKey(Table table, ForeignKey fk)
{
for (int fkIdx = 0; fkIdx < table.getForeignKeyCount(); fkIdx++)
{
ForeignKey curFk = table.getForeignKey(fkIdx);
if ((_caseSensitive && fk.equals(curFk)) ||
(!_caseSensitive && fk.equalsIgnoreCase(curFk)))
{
return curFk;
}
}
return null;
}
/**
* Searches in the given table for a corresponding index. If the given index
* has no name, then a index to the same table with the same columns in the
* same order is searched. If the given index has a name, then the a corresponding
* index also needs to have the same name, or no name at all, but not a different one.
*
* @param table The table to search in
* @param index The original index
* @return The corresponding index if found
*/
private Index findCorrespondingIndex(Table table, Index index)
{
for (int indexIdx = 0; indexIdx < table.getIndexCount(); indexIdx++)
{
Index curIndex = table.getIndex(indexIdx);
if ((_caseSensitive && index.equals(curIndex)) ||
(!_caseSensitive && index.equalsIgnoreCase(curIndex)))
{
return curIndex;
}
}
return null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -