Search in sources :

Example 1 with Change

use of liquibase.change.Change in project liquibase by liquibase.

the class ChangeSet method rollback.

public void rollback(Database database) throws RollbackFailedException {
    try {
        Executor executor = ExecutorService.getInstance().getExecutor(database);
        executor.comment("Rolling Back ChangeSet: " + toString());
        database.setObjectQuotingStrategy(objectQuotingStrategy);
        // set auto-commit based on runInTransaction if database supports DDL in transactions
        if (database.supportsDDLInTransaction()) {
            database.setAutoCommit(!runInTransaction);
        }
        RanChangeSet ranChangeSet = database.getRanChangeSet(this);
        if (hasCustomRollbackChanges()) {
            final List<SqlStatement> statements = new LinkedList<SqlStatement>();
            for (Change change : rollback.getChanges()) {
                if (((change instanceof DbmsTargetedChange)) && !DatabaseList.definitionMatches(((DbmsTargetedChange) change).getDbms(), database, true)) {
                    continue;
                }
                ValidationErrors errors = change.validate(database);
                if (errors.hasErrors()) {
                    throw new RollbackFailedException("Rollback statement failed validation: " + errors.toString());
                }
                SqlStatement[] changeStatements = change.generateStatements(database);
                if (changeStatements != null) {
                    statements.addAll(Arrays.asList(changeStatements));
                }
            }
            if (!statements.isEmpty()) {
                database.executeRollbackStatements(statements.toArray(new SqlStatement[] {}), sqlVisitors);
            }
        } else {
            List<Change> changes = getChanges();
            for (int i = changes.size() - 1; i >= 0; i--) {
                Change change = changes.get(i);
                database.executeRollbackStatements(change, sqlVisitors);
            }
        }
        if (runInTransaction) {
            database.commit();
        }
        log.debug("ChangeSet " + toString() + " has been successfully rolled back.");
    } catch (Exception e) {
        try {
            database.rollback();
        } catch (DatabaseException e1) {
        //ok
        }
        throw new RollbackFailedException(e);
    } finally {
        // but only if the database supports DDL in transactions
        if (!runInTransaction && database.supportsDDLInTransaction()) {
            try {
                database.setAutoCommit(false);
            } catch (DatabaseException e) {
                throw new RollbackFailedException("Could not resetInternalState autocommit", e);
            }
        }
    }
}
Also used : Change(liquibase.change.Change) EmptyChange(liquibase.change.core.EmptyChange) RawSQLChange(liquibase.change.core.RawSQLChange) DbmsTargetedChange(liquibase.change.DbmsTargetedChange) ParsedNodeException(liquibase.parser.core.ParsedNodeException) SqlStatement(liquibase.statement.SqlStatement) Executor(liquibase.executor.Executor) DbmsTargetedChange(liquibase.change.DbmsTargetedChange)

Example 2 with Change

use of liquibase.change.Change in project liquibase by liquibase.

the class UnexpectedForeignKeyChangeGenerator method fixUnexpected.

@Override
public Change[] fixUnexpected(DatabaseObject unexpectedObject, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) {
    ForeignKey fk = (ForeignKey) unexpectedObject;
    DropForeignKeyConstraintChange change = new DropForeignKeyConstraintChange();
    change.setConstraintName(fk.getName());
    change.setBaseTableName(fk.getForeignKeyTable().getName());
    if (control.getIncludeCatalog()) {
        change.setBaseTableCatalogName(fk.getForeignKeyTable().getSchema().getCatalogName());
    }
    if (control.getIncludeSchema()) {
        change.setBaseTableSchemaName(fk.getForeignKeyTable().getSchema().getName());
    }
    Index backingIndex = fk.getBackingIndex();
    // if (backingIndex == null) {
    // Index exampleIndex = new Index().setTable(fk.getForeignKeyTable());
    // for (String col : fk.getForeignKeyColumns().split("\\s*,\\s*")) {
    // exampleIndex.getColumns().add(col);
    // }
    // control.setAlreadyHandledUnexpected(exampleIndex);
    // } else {
    control.setAlreadyHandledUnexpected(backingIndex);
    return new Change[] { change };
}
Also used : DropForeignKeyConstraintChange(liquibase.change.core.DropForeignKeyConstraintChange) Change(liquibase.change.Change) DropForeignKeyConstraintChange(liquibase.change.core.DropForeignKeyConstraintChange)

Example 3 with Change

use of liquibase.change.Change in project liquibase by liquibase.

the class UnexpectedPrimaryKeyChangeGenerator method fixUnexpected.

@Override
public Change[] fixUnexpected(DatabaseObject unexpectedObject, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) {
    // if (!diffResult.getObjectDiff(Table.class).getUnexpected().contains(pk.getTable())) {
    PrimaryKey pk = (PrimaryKey) unexpectedObject;
    DropPrimaryKeyChange change = new DropPrimaryKeyChange();
    change.setTableName(pk.getTable().getName());
    if (control.getIncludeCatalog()) {
        change.setCatalogName(pk.getTable().getSchema().getCatalogName());
    }
    if (control.getIncludeSchema()) {
        change.setSchemaName(pk.getTable().getSchema().getName());
    }
    change.setConstraintName(pk.getName());
    Index backingIndex = pk.getBackingIndex();
    control.setAlreadyHandledUnexpected(backingIndex);
    return new Change[] { change };
// }
}
Also used : DropPrimaryKeyChange(liquibase.change.core.DropPrimaryKeyChange) PrimaryKey(liquibase.structure.core.PrimaryKey) Index(liquibase.structure.core.Index) DropPrimaryKeyChange(liquibase.change.core.DropPrimaryKeyChange) Change(liquibase.change.Change)

Example 4 with Change

use of liquibase.change.Change in project liquibase by liquibase.

the class UnexpectedTableChangeGenerator method fixUnexpected.

@Override
public Change[] fixUnexpected(DatabaseObject unexpectedObject, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) {
    Table unexpectedTable = (Table) unexpectedObject;
    DropTableChange change = new DropTableChange();
    change.setTableName(unexpectedTable.getName());
    if (control.getIncludeCatalog()) {
        change.setCatalogName(unexpectedTable.getSchema().getCatalogName());
    }
    if (control.getIncludeSchema()) {
        change.setSchemaName(unexpectedTable.getSchema().getName());
    }
    for (Column column : unexpectedTable.getColumns()) {
        control.setAlreadyHandledUnexpected(column);
    }
    ;
    control.setAlreadyHandledUnexpected(unexpectedTable.getPrimaryKey());
    for (Index index : unexpectedTable.getIndexes()) {
        control.setAlreadyHandledUnexpected(index);
    }
    control.setAlreadyHandledUnexpected(unexpectedTable.getPrimaryKey());
    if (unexpectedTable.getPrimaryKey() != null) {
        control.setAlreadyHandledUnexpected(unexpectedTable.getPrimaryKey().getBackingIndex());
    }
    return new Change[] { change };
}
Also used : Table(liquibase.structure.core.Table) Column(liquibase.structure.core.Column) DropTableChange(liquibase.change.core.DropTableChange) Index(liquibase.structure.core.Index) Change(liquibase.change.Change) DropTableChange(liquibase.change.core.DropTableChange)

Example 5 with Change

use of liquibase.change.Change in project liquibase by liquibase.

the class UnexpectedViewChangeGenerator method fixUnexpected.

@Override
public Change[] fixUnexpected(DatabaseObject unexpectedObject, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) {
    View view = (View) unexpectedObject;
    DropViewChange change = new DropViewChange();
    change.setViewName(view.getName());
    if (control.getIncludeCatalog()) {
        change.setCatalogName(view.getSchema().getCatalogName());
    }
    if (control.getIncludeSchema()) {
        change.setSchemaName(view.getSchema().getName());
    }
    for (Column column : view.getColumns()) {
        control.setAlreadyHandledUnexpected(column);
    }
    ;
    return new Change[] { change };
}
Also used : Column(liquibase.structure.core.Column) DropViewChange(liquibase.change.core.DropViewChange) DropViewChange(liquibase.change.core.DropViewChange) Change(liquibase.change.Change) View(liquibase.structure.core.View)

Aggregations

Change (liquibase.change.Change)49 ArrayList (java.util.ArrayList)10 UnexpectedLiquibaseException (liquibase.exception.UnexpectedLiquibaseException)10 ChangeSet (liquibase.changelog.ChangeSet)9 DatabaseObject (liquibase.structure.DatabaseObject)9 SqlStatement (liquibase.statement.SqlStatement)8 Column (liquibase.structure.core.Column)8 Table (liquibase.structure.core.Table)7 Database (liquibase.database.Database)6 Sql (liquibase.sql.Sql)6 Index (liquibase.structure.core.Index)6 OracleDatabase (liquibase.database.core.OracleDatabase)5 Difference (liquibase.diff.Difference)5 LiquibaseException (liquibase.exception.LiquibaseException)5 ChangeFactory (liquibase.change.ChangeFactory)4 ChangeMetaData (liquibase.change.ChangeMetaData)4 ChangeParameterMetaData (liquibase.change.ChangeParameterMetaData)4 DiffOutputControl (liquibase.diff.output.DiffOutputControl)4 ValidationErrors (liquibase.exception.ValidationErrors)4 AbstractVerifyTest (liquibase.verify.AbstractVerifyTest)4