use of liquibase.change.Change in project liquibase by liquibase.
the class MissingIndexChangeGenerator method fixMissing.
@Override
public Change[] fixMissing(DatabaseObject missingObject, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) {
Index index = (Index) missingObject;
if (comparisonDatabase instanceof MSSQLDatabase) {
PrimaryKey primaryKey = index.getTable().getPrimaryKey();
if (primaryKey != null && DatabaseObjectComparatorFactory.getInstance().isSameObject(missingObject, primaryKey.getBackingIndex(), control.getSchemaComparisons(), referenceDatabase)) {
//will be handled by the PK
return new Change[0];
}
}
CreateIndexChange change = createCreateIndexChange();
change.setTableName(index.getTable().getName());
if (control.getIncludeTablespace()) {
change.setTablespace(index.getTablespace());
}
if (control.getIncludeCatalog()) {
change.setCatalogName(index.getTable().getSchema().getCatalogName());
}
if (control.getIncludeSchema()) {
change.setSchemaName(index.getTable().getSchema().getName());
}
change.setIndexName(index.getName());
change.setUnique(index.isUnique() != null && index.isUnique() ? Boolean.TRUE : null);
change.setAssociatedWith(index.getAssociatedWithAsString());
change.setClustered(index.getClustered() != null && index.getClustered() ? Boolean.TRUE : null);
for (Column column : index.getColumns()) {
change.addColumn(new AddColumnConfig(column));
}
return new Change[] { change };
}
use of liquibase.change.Change in project liquibase by liquibase.
the class MissingSequenceChangeGenerator method fixMissing.
@Override
public Change[] fixMissing(DatabaseObject missingObject, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) {
Sequence sequence = (Sequence) missingObject;
CreateSequenceChange change = new CreateSequenceChange();
change.setSequenceName(sequence.getName());
if (control.getIncludeCatalog()) {
change.setCatalogName(sequence.getSchema().getCatalogName());
}
if (control.getIncludeSchema()) {
change.setSchemaName(sequence.getSchema().getName());
}
change.setStartValue(sequence.getStartValue());
change.setIncrementBy(sequence.getIncrementBy());
change.setMinValue(sequence.getMinValue());
change.setMaxValue(sequence.getMaxValue());
change.setCacheSize(sequence.getCacheSize());
change.setCycle(sequence.getWillCycle());
change.setOrdered(sequence.getOrdered());
return new Change[] { change };
}
use of liquibase.change.Change in project liquibase by liquibase.
the class MissingTableChangeGenerator method fixMissing.
@Override
public Change[] fixMissing(DatabaseObject missingObject, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) {
Table missingTable = (Table) missingObject;
PrimaryKey primaryKey = missingTable.getPrimaryKey();
// if (control.diffResult.getReferenceSnapshot().getDatabase().isLiquibaseTable(missingTable.getSchema().toCatalogAndSchema(), missingTable.getName())) {
// continue;
// }
CreateTableChange change = createCreateTableChange();
change.setTableName(missingTable.getName());
if (control.getIncludeCatalog()) {
change.setCatalogName(missingTable.getSchema().getCatalogName());
}
if (control.getIncludeSchema()) {
change.setSchemaName(missingTable.getSchema().getName());
}
if (missingTable.getRemarks() != null) {
change.setRemarks(missingTable.getRemarks());
}
for (Column column : missingTable.getColumns()) {
ColumnConfig columnConfig = new ColumnConfig();
columnConfig.setName(column.getName());
LiquibaseDataType ldt = DataTypeFactory.getInstance().from(column.getType(), referenceDatabase);
DatabaseDataType ddt = ldt.toDatabaseDataType(comparisonDatabase);
String typeString = ddt.toString();
if (comparisonDatabase instanceof MSSQLDatabase) {
typeString = comparisonDatabase.unescapeDataTypeString(typeString);
}
columnConfig.setType(typeString);
if (column.isAutoIncrement()) {
columnConfig.setAutoIncrement(true);
}
ConstraintsConfig constraintsConfig = null;
// In MySQL, the primary key must be specified at creation for an autoincrement column
if (column.isAutoIncrement() && primaryKey != null && primaryKey.getColumns().size() == 1 && primaryKey.getColumnNamesAsList().contains(column.getName())) {
if (referenceDatabase instanceof MSSQLDatabase && primaryKey.getBackingIndex() != null && primaryKey.getBackingIndex().getClustered() != null && !primaryKey.getBackingIndex().getClustered()) {
// have to handle PK as a separate statement
} else if (referenceDatabase instanceof PostgresDatabase && primaryKey.getBackingIndex() != null && primaryKey.getBackingIndex().getClustered() != null && primaryKey.getBackingIndex().getClustered()) {
// have to handle PK as a separate statement
} else {
constraintsConfig = new ConstraintsConfig();
if (shouldAddPrimarykeyToConstraints(missingObject, control, referenceDatabase, comparisonDatabase)) {
constraintsConfig.setPrimaryKey(true);
constraintsConfig.setPrimaryKeyTablespace(primaryKey.getTablespace());
// MySQL sets some primary key names as PRIMARY which is invalid
if (comparisonDatabase instanceof MySQLDatabase && "PRIMARY".equals(primaryKey.getName())) {
constraintsConfig.setPrimaryKeyName(null);
} else {
constraintsConfig.setPrimaryKeyName(primaryKey.getName());
}
control.setAlreadyHandledMissing(primaryKey);
control.setAlreadyHandledMissing(primaryKey.getBackingIndex());
} else {
constraintsConfig.setNullable(false);
}
}
} else if (column.isNullable() != null && !column.isNullable()) {
constraintsConfig = new ConstraintsConfig();
constraintsConfig.setNullable(false);
}
if (constraintsConfig != null) {
columnConfig.setConstraints(constraintsConfig);
}
setDefaultValue(columnConfig, column, referenceDatabase);
if (column.getRemarks() != null) {
columnConfig.setRemarks(column.getRemarks());
}
if (column.getAutoIncrementInformation() != null) {
BigInteger startWith = column.getAutoIncrementInformation().getStartWith();
BigInteger incrementBy = column.getAutoIncrementInformation().getIncrementBy();
if (startWith != null && !startWith.equals(BigInteger.ONE)) {
columnConfig.setStartWith(startWith);
}
if (incrementBy != null && !incrementBy.equals(BigInteger.ONE)) {
columnConfig.setIncrementBy(incrementBy);
}
}
change.addColumn(columnConfig);
control.setAlreadyHandledMissing(column);
}
return new Change[] { change };
}
use of liquibase.change.Change in project liquibase by liquibase.
the class HTMLWriter method writeChanges.
protected void writeChanges(String title, Writer fileWriter, List<Change> changes) throws IOException, DatabaseHistoryException, DatabaseException {
fileWriter.append("<p><TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" CELLSPACING=\"0\" SUMMARY=\"\">\n");
fileWriter.append("<TR BGCOLOR=\"#CCCCFF\" CLASS=\"TableHeadingColor\">\n");
fileWriter.append("<TD COLSPAN='4'><FONT SIZE=\"+2\">\n");
fileWriter.append("<B>");
fileWriter.append(title);
fileWriter.append("</B></FONT></TD>\n");
fileWriter.append("</TR>\n");
ChangeSet lastChangeSet = null;
if (changes == null || changes.size() == 0) {
fileWriter.append("<tr><td>None Found</td></tr>");
} else {
for (Change change : changes) {
if (!change.getChangeSet().equals(lastChangeSet)) {
lastChangeSet = change.getChangeSet();
fileWriter.append("<TR BGCOLOR=\"#EEEEFF\" CLASS=\"TableSubHeadingColor\">\n");
writeTD(fileWriter, "<a href='../changelogs/" + DBDocUtil.toFileName(change.getChangeSet().getFilePath()) + ".html'>" + change.getChangeSet().getFilePath() + "</a>");
writeTD(fileWriter, change.getChangeSet().getId());
writeTD(fileWriter, "<a href='../authors/" + DBDocUtil.toFileName(change.getChangeSet().getAuthor().toLowerCase()) + ".html'>" + StringUtils.escapeHtml(change.getChangeSet().getAuthor().toLowerCase()) + "</a>");
ChangeSet.RunStatus runStatus = database.getRunStatus(change.getChangeSet());
if (runStatus.equals(ChangeSet.RunStatus.NOT_RAN)) {
String anchor = change.getChangeSet().toString(false).replaceAll("\\W", "_");
writeTD(fileWriter, "NOT YET RAN [<a href='../pending/sql.html#" + anchor + "'>SQL</a>]");
} else if (runStatus.equals(ChangeSet.RunStatus.INVALID_MD5SUM)) {
writeTD(fileWriter, "INVALID MD5SUM");
} else if (runStatus.equals(ChangeSet.RunStatus.ALREADY_RAN)) {
writeTD(fileWriter, "Executed " + DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(database.getRanDate(change.getChangeSet())));
} else if (runStatus.equals(ChangeSet.RunStatus.RUN_AGAIN)) {
writeTD(fileWriter, "Executed, WILL RUN AGAIN");
} else {
throw new RuntimeException("Unknown run status: " + runStatus);
}
fileWriter.append("</TR>");
if (StringUtils.trimToNull(change.getChangeSet().getComments()) != null) {
fileWriter.append("<TR><TD BGCOLOR='#EEEEFF' CLASS='TableSubHeadingColor' colspan='4'>").append(change.getChangeSet().getComments()).append("</TD></TR>");
}
}
fileWriter.append("<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">\n");
fileWriter.append("<td colspan='4'> ").append(change.getConfirmationMessage()).append("</td></TR>");
}
}
fileWriter.append("</TABLE>");
fileWriter.append(" </P>");
}
use of liquibase.change.Change in project liquibase by liquibase.
the class UnexpectedIndexChangeGenerator method fixUnexpected.
@Override
public Change[] fixUnexpected(DatabaseObject unexpectedObject, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) {
Index index = (Index) unexpectedObject;
// if (index.getAssociatedWith().contains(Index.MARK_PRIMARY_KEY) || index.getAssociatedWith().contains(Index.MARK_FOREIGN_KEY) || index.getAssociatedWith().contains(Index.MARK_UNIQUE_CONSTRAINT)) {
// return null;
// }
DropIndexChange change = new DropIndexChange();
change.setTableName(index.getTable().getName());
if (control.getIncludeCatalog()) {
change.setCatalogName(index.getTable().getSchema().getCatalogName());
}
if (control.getIncludeSchema()) {
change.setSchemaName(index.getTable().getSchema().getName());
}
change.setIndexName(index.getName());
change.setAssociatedWith(index.getAssociatedWithAsString());
return new Change[] { change };
}
Aggregations