Search in sources :

Example 36 with Change

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 };
}
Also used : Column(liquibase.structure.core.Column) PrimaryKey(liquibase.structure.core.PrimaryKey) Index(liquibase.structure.core.Index) AddColumnConfig(liquibase.change.AddColumnConfig) MSSQLDatabase(liquibase.database.core.MSSQLDatabase) Change(liquibase.change.Change) CreateIndexChange(liquibase.change.core.CreateIndexChange) CreateIndexChange(liquibase.change.core.CreateIndexChange)

Example 37 with 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 };
}
Also used : Sequence(liquibase.structure.core.Sequence) CreateSequenceChange(liquibase.change.core.CreateSequenceChange) Change(liquibase.change.Change) CreateSequenceChange(liquibase.change.core.CreateSequenceChange)

Example 38 with 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 };
}
Also used : Table(liquibase.structure.core.Table) ColumnConfig(liquibase.change.ColumnConfig) LiquibaseDataType(liquibase.datatype.LiquibaseDataType) PrimaryKey(liquibase.structure.core.PrimaryKey) MySQLDatabase(liquibase.database.core.MySQLDatabase) Change(liquibase.change.Change) CreateTableChange(liquibase.change.core.CreateTableChange) PostgresDatabase(liquibase.database.core.PostgresDatabase) DatabaseDataType(liquibase.datatype.DatabaseDataType) Column(liquibase.structure.core.Column) CreateTableChange(liquibase.change.core.CreateTableChange) ConstraintsConfig(liquibase.change.ConstraintsConfig) BigInteger(java.math.BigInteger) MSSQLDatabase(liquibase.database.core.MSSQLDatabase)

Example 39 with 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'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;").append(change.getConfirmationMessage()).append("</td></TR>");
        }
    }
    fileWriter.append("</TABLE>");
    fileWriter.append("&nbsp;</P>");
}
Also used : Change(liquibase.change.Change) ChangeSet(liquibase.changelog.ChangeSet)

Example 40 with Change

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 };
}
Also used : DropIndexChange(liquibase.change.core.DropIndexChange) DropIndexChange(liquibase.change.core.DropIndexChange) Change(liquibase.change.Change)

Aggregations

Change (liquibase.change.Change)44 ArrayList (java.util.ArrayList)9 Column (liquibase.structure.core.Column)9 ChangeSet (liquibase.changelog.ChangeSet)7 DatabaseObject (liquibase.structure.DatabaseObject)7 DbmsTargetedChange (liquibase.change.DbmsTargetedChange)6 EmptyChange (liquibase.change.core.EmptyChange)6 RawSQLChange (liquibase.change.core.RawSQLChange)6 OracleDatabase (liquibase.database.core.OracleDatabase)6 Database (liquibase.database.Database)4 MSSQLDatabase (liquibase.database.core.MSSQLDatabase)4 UnexpectedLiquibaseException (liquibase.exception.UnexpectedLiquibaseException)4 AddColumnConfig (liquibase.change.AddColumnConfig)3 ChangeFactory (liquibase.change.ChangeFactory)3 ChangeMetaData (liquibase.change.ChangeMetaData)3 ChangeParameterMetaData (liquibase.change.ChangeParameterMetaData)3 CreateIndexChange (liquibase.change.core.CreateIndexChange)3 Difference (liquibase.diff.Difference)3 Executor (liquibase.executor.Executor)3 ParsedNodeException (liquibase.parser.core.ParsedNodeException)3