Search in sources :

Example 41 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)

Example 42 with Change

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

the class VerifyChangeClassesTest method lessThanMinimumFails.

@Test
public void lessThanMinimumFails() throws Exception {
    ChangeFactory changeFactory = ChangeFactory.getInstance();
    for (String changeName : changeFactory.getDefinedChanges()) {
        for (Database database : DatabaseFactory.getInstance().getImplementedDatabases()) {
            if (database.getShortName() == null) {
                continue;
            }
            Change change = changeFactory.create(changeName);
            if (!change.supports(database)) {
                continue;
            }
            if (change.generateStatementsVolatile(database)) {
                continue;
            }
            ChangeMetaData changeMetaData = ChangeFactory.getInstance().getChangeMetaData(change);
            change.setResourceAccessor(new JUnitResourceAccessor());
            ArrayList<String> requiredParams = new ArrayList<String>(changeMetaData.getRequiredParameters(database).keySet());
            for (String paramName : requiredParams) {
                ChangeParameterMetaData param = changeMetaData.getParameters().get(paramName);
                Object paramValue = param.getExampleValue(database);
                param.setValue(change, paramValue);
            }
            for (int i = 0; i < requiredParams.size(); i++) {
                String paramToRemove = requiredParams.get(i);
                ChangeParameterMetaData paramToRemoveMetadata = changeMetaData.getParameters().get(paramToRemove);
                Object currentValue = paramToRemoveMetadata.getCurrentValue(change);
                paramToRemoveMetadata.setValue(change, null);
                assertTrue("No errors even with " + changeMetaData.getName() + " with a null " + paramToRemove + " on " + database.getShortName(), change.validate(database).hasErrors());
                paramToRemoveMetadata.setValue(change, currentValue);
            }
        }
    }
}
Also used : ChangeFactory(liquibase.change.ChangeFactory) Database(liquibase.database.Database) JUnitResourceAccessor(liquibase.test.JUnitResourceAccessor) ChangeParameterMetaData(liquibase.change.ChangeParameterMetaData) Change(liquibase.change.Change) ChangeMetaData(liquibase.change.ChangeMetaData) Test(org.junit.Test) AbstractVerifyTest(liquibase.verify.AbstractVerifyTest)

Example 43 with Change

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

the class VerifyChangeClassesTest method extraParamsIsValidSql.

@Ignore
@Test
public void extraParamsIsValidSql() throws Exception {
    ChangeFactory changeFactory = ChangeFactory.getInstance();
    for (String changeName : changeFactory.getDefinedChanges()) {
        if (changeName.equals("addDefaultValue")) {
            //need to better handle strange "one of defaultValue* is required" logic
            continue;
        }
        if (changeName.equals("createProcedure")) {
            //need to better handle strange "one of path or body is required" logic
            continue;
        }
        for (Database database : DatabaseFactory.getInstance().getImplementedDatabases()) {
            if (database.getShortName() == null) {
                continue;
            }
            TestState state = new TestState(name.getMethodName(), changeName, database.getShortName(), TestState.Type.SQL);
            state.addComment("Database: " + database.getShortName());
            Change baseChange = changeFactory.create(changeName);
            if (!baseChange.supports(database)) {
                continue;
            }
            if (baseChange.generateStatementsVolatile(database)) {
                continue;
            }
            ChangeMetaData changeMetaData = ChangeFactory.getInstance().getChangeMetaData(baseChange);
            ArrayList<String> optionalParameters = new ArrayList<String>(changeMetaData.getOptionalParameters(database).keySet());
            Collections.sort(optionalParameters);
            List<List<String>> paramLists = powerSet(optionalParameters);
            Collections.sort(paramLists, new Comparator<List<String>>() {

                @Override
                public int compare(List<String> o1, List<String> o2) {
                    int comp = Integer.valueOf(o1.size()).compareTo(o2.size());
                    if (comp == 0) {
                        comp = StringUtils.join(o1, ",").compareTo(StringUtils.join(o2, ","));
                    }
                    return comp;
                }
            });
            for (List<String> permutation : paramLists) {
                Change change = changeFactory.create(changeName);
                change.setResourceAccessor(new JUnitResourceAccessor());
                //
                for (String paramName : new TreeSet<String>(changeMetaData.getRequiredParameters(database).keySet())) {
                    ChangeParameterMetaData param = changeMetaData.getParameters().get(paramName);
                    Object paramValue = param.getExampleValue(database);
                    String serializedValue;
                    serializedValue = formatParameter(paramValue);
                    state.addComment("Required Change Parameter: " + param.getParameterName() + "=" + serializedValue);
                    param.setValue(change, paramValue);
                }
                for (String paramName : permutation) {
                    ChangeParameterMetaData param = changeMetaData.getParameters().get(paramName);
                    if (!param.supports(database)) {
                        continue;
                    }
                    Object paramValue = param.getExampleValue(database);
                    String serializedValue;
                    serializedValue = formatParameter(paramValue);
                    state.addComment("Optional Change Parameter: " + param.getParameterName() + "=" + serializedValue);
                    param.setValue(change, paramValue);
                }
                ValidationErrors errors = change.validate(database);
                assertFalse("Validation errors for " + changeMetaData.getName() + " on " + database.getShortName() + ": " + errors.toString(), errors.hasErrors());
            //
            //                    SqlStatement[] sqlStatements = change.generateStatements(database);
            //                    for (SqlStatement statement : sqlStatements) {
            //                        Sql[] sql = SqlGeneratorFactory.getInstance().generateSql(statement, database);
            //                        if (sql == null) {
            //                            System.out.println("Null sql for "+statement+" on "+database.getShortName());
            //                        } else {
            //                            for (Sql line : sql) {
            //                                state.addValue(line.toSql()+";");
            //                            }
            //                        }
            //                    }
            //                    state.test();
            }
        }
    }
}
Also used : ValidationErrors(liquibase.exception.ValidationErrors) JUnitResourceAccessor(liquibase.test.JUnitResourceAccessor) Change(liquibase.change.Change) ChangeFactory(liquibase.change.ChangeFactory) Database(liquibase.database.Database) ChangeParameterMetaData(liquibase.change.ChangeParameterMetaData) ChangeMetaData(liquibase.change.ChangeMetaData) Ignore(org.junit.Ignore) Test(org.junit.Test) AbstractVerifyTest(liquibase.verify.AbstractVerifyTest)

Example 44 with Change

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

the class VerifyChangeClassesTest method minimumRequiredIsValidSql.

@Ignore
@Test
public void minimumRequiredIsValidSql() throws Exception {
    ChangeFactory changeFactory = ChangeFactory.getInstance();
    for (String changeName : changeFactory.getDefinedChanges()) {
        if (changeName.equals("addDefaultValue")) {
            //need to better handle strange "one of defaultValue* is required" logic
            continue;
        }
        if (changeName.equals("changeWithNestedTags") || changeName.equals("sampleChange")) {
            //not a real change
            continue;
        }
        for (Database database : DatabaseFactory.getInstance().getImplementedDatabases()) {
            if (database.getShortName() == null) {
                continue;
            }
            TestState state = new TestState(name.getMethodName(), changeName, database.getShortName(), TestState.Type.SQL);
            state.addComment("Database: " + database.getShortName());
            Change change = changeFactory.create(changeName);
            if (!change.supports(database)) {
                continue;
            }
            if (change.generateStatementsVolatile(database)) {
                continue;
            }
            ChangeMetaData changeMetaData = ChangeFactory.getInstance().getChangeMetaData(change);
            change.setResourceAccessor(new JUnitResourceAccessor());
            for (String paramName : new TreeSet<String>(changeMetaData.getRequiredParameters(database).keySet())) {
                ChangeParameterMetaData param = changeMetaData.getParameters().get(paramName);
                Object paramValue = param.getExampleValue(database);
                String serializedValue;
                serializedValue = formatParameter(paramValue);
                state.addComment("Change Parameter: " + param.getParameterName() + "=" + serializedValue);
                param.setValue(change, paramValue);
            }
            ValidationErrors errors = change.validate(database);
            assertFalse("Validation errors for " + changeMetaData.getName() + " on " + database.getShortName() + ": " + errors.toString(), errors.hasErrors());
            SqlStatement[] sqlStatements = change.generateStatements(database);
            for (SqlStatement statement : sqlStatements) {
                Sql[] sql = SqlGeneratorFactory.getInstance().generateSql(statement, database);
                if (sql == null) {
                    System.out.println("Null sql for " + statement + " on " + database.getShortName());
                } else {
                    for (Sql line : sql) {
                        String sqlLine = line.toSql();
                        assertFalse("Change " + changeMetaData.getName() + " contains 'null' for " + database.getShortName() + ": " + sqlLine, sqlLine.contains(" null "));
                        state.addValue(sqlLine + ";");
                    }
                }
            }
            state.test();
        }
    }
}
Also used : ValidationErrors(liquibase.exception.ValidationErrors) JUnitResourceAccessor(liquibase.test.JUnitResourceAccessor) Change(liquibase.change.Change) Sql(liquibase.sql.Sql) SqlStatement(liquibase.statement.SqlStatement) ChangeFactory(liquibase.change.ChangeFactory) Database(liquibase.database.Database) ChangeParameterMetaData(liquibase.change.ChangeParameterMetaData) ChangeMetaData(liquibase.change.ChangeMetaData) Ignore(org.junit.Ignore) Test(org.junit.Test) AbstractVerifyTest(liquibase.verify.AbstractVerifyTest)

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