Java Examples for liquibase.changelog.DatabaseChangeLog

The following java examples will help you to understand the usage of liquibase.changelog.DatabaseChangeLog. These source code samples are taken from different open source projects.

Example 1
Project: BACKUP_FROM_SVN-master  File: AbstractDatabase.java View source code
/**
     * This method will check the database ChangeLog table used to keep track of
     * the changes in the file. If the table does not exist it will create one
     * otherwise it will not do anything besides outputting a log message.
     * @param updateExistingNullChecksums
     * @param contexts
     */
public void checkDatabaseChangeLogTable(boolean updateExistingNullChecksums, DatabaseChangeLog databaseChangeLog, String... contexts) throws DatabaseException {
    Executor executor = ExecutorService.getInstance().getExecutor(this);
    Table changeLogTable = DatabaseSnapshotGeneratorFactory.getInstance().getGenerator(this).getDatabaseChangeLogTable(this);
    List<SqlStatement> statementsToExecute = new ArrayList<SqlStatement>();
    boolean changeLogCreateAttempted = false;
    if (changeLogTable != null) {
        boolean hasDescription = changeLogTable.getColumn("DESCRIPTION") != null;
        boolean hasComments = changeLogTable.getColumn("COMMENTS") != null;
        boolean hasTag = changeLogTable.getColumn("TAG") != null;
        boolean hasLiquibase = changeLogTable.getColumn("LIQUIBASE") != null;
        boolean liquibaseColumnNotRightSize = changeLogTable.getColumn("LIQUIBASE").getColumnSize() != 20;
        boolean hasOrderExecuted = changeLogTable.getColumn("ORDEREXECUTED") != null;
        boolean checksumNotRightSize = changeLogTable.getColumn("MD5SUM").getColumnSize() != 35;
        boolean hasExecTypeColumn = changeLogTable.getColumn("EXECTYPE") != null;
        if (!hasDescription) {
            executor.comment("Adding missing databasechangelog.description column");
            statementsToExecute.add(new AddColumnStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName(), "DESCRIPTION", "VARCHAR(255)", null));
        }
        if (!hasTag) {
            executor.comment("Adding missing databasechangelog.tag column");
            statementsToExecute.add(new AddColumnStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName(), "TAG", "VARCHAR(255)", null));
        }
        if (!hasComments) {
            executor.comment("Adding missing databasechangelog.comments column");
            statementsToExecute.add(new AddColumnStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName(), "COMMENTS", "VARCHAR(255)", null));
        }
        if (!hasLiquibase) {
            executor.comment("Adding missing databasechangelog.liquibase column");
            statementsToExecute.add(new AddColumnStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName(), "LIQUIBASE", "VARCHAR(255)", null));
        }
        if (!hasOrderExecuted) {
            executor.comment("Adding missing databasechangelog.orderexecuted column");
            statementsToExecute.add(new AddColumnStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName(), "ORDEREXECUTED", "INT", null));
            statementsToExecute.add(new UpdateStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName()).addNewColumnValue("ORDEREXECUTED", -1));
            statementsToExecute.add(new SetNullableStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName(), "ORDEREXECUTED", "INT", false));
        }
        if (checksumNotRightSize) {
            executor.comment("Modifying size of databasechangelog.md5sum column");
            statementsToExecute.add(new ModifyDataTypeStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName(), "MD5SUM", "VARCHAR(35)"));
        }
        if (liquibaseColumnNotRightSize) {
            executor.comment("Modifying size of databasechangelog.liquibase column");
            statementsToExecute.add(new ModifyDataTypeStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName(), "LIQUIBASE", "VARCHAR(20)"));
        }
        if (!hasExecTypeColumn) {
            executor.comment("Adding missing databasechangelog.exectype column");
            statementsToExecute.add(new AddColumnStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName(), "EXECTYPE", "VARCHAR(10)", null));
            statementsToExecute.add(new UpdateStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName()).addNewColumnValue("EXECTYPE", "EXECUTED"));
            statementsToExecute.add(new SetNullableStatement(getLiquibaseSchemaName(), getDatabaseChangeLogTableName(), "EXECTYPE", "VARCHAR(10)", false));
        }
        List<Map> md5sumRS = ExecutorService.getInstance().getExecutor(this).queryForList(new SelectFromDatabaseChangeLogStatement(new SelectFromDatabaseChangeLogStatement.ByNotNullCheckSum(), "MD5SUM"));
        if (md5sumRS.size() > 0) {
            String md5sum = md5sumRS.get(0).get("MD5SUM").toString();
            if (!md5sum.startsWith(CheckSum.getCurrentVersion() + ":")) {
                executor.comment("DatabaseChangeLog checksums are an incompatible version.  Setting them to null so they will be updated on next database update");
                statementsToExecute.add(new RawSqlStatement("UPDATE " + escapeTableName(getLiquibaseSchemaName(), getDatabaseChangeLogTableName()) + " SET MD5SUM=null"));
            }
        }
    } else if (!changeLogCreateAttempted) {
        executor.comment("Create Database Change Log Table");
        SqlStatement createTableStatement = new CreateDatabaseChangeLogTableStatement();
        if (!canCreateChangeLogTable()) {
            throw new DatabaseException("Cannot create " + escapeTableName(getDefaultSchemaName(), getDatabaseChangeLogTableName()) + " table for your database.\n\n" + "Please construct it manually using the following SQL as a base and re-run Liquibase:\n\n" + createTableStatement);
        }
        // If there is no table in the database for recording change history create one.
        statementsToExecute.add(createTableStatement);
        LogFactory.getLogger().info("Creating database history table with name: " + escapeTableName(getDefaultSchemaName(), getDatabaseChangeLogTableName()));
    //                }
    }
    for (SqlStatement sql : statementsToExecute) {
        executor.execute(sql);
        this.commit();
    }
    if (updateExistingNullChecksums) {
        for (RanChangeSet ranChangeSet : this.getRanChangeSetList()) {
            if (ranChangeSet.getLastCheckSum() == null) {
                ChangeSet changeSet = databaseChangeLog.getChangeSet(ranChangeSet);
                if (changeSet != null && new ContextChangeSetFilter(contexts).accepts(changeSet) && new DbmsChangeSetFilter(this).accepts(changeSet)) {
                    LogFactory.getLogger().info("Updating null or out of date checksum on changeSet " + changeSet + " to correct value");
                    executor.execute(new UpdateChangeSetChecksumStatement(changeSet));
                }
            }
        }
        commit();
        this.ranChangeSetList = null;
    }
}
Example 2
Project: liquibase-master  File: LiquibaseTest.java View source code
//    private TestLiquibase testLiquibase;
//    private DatabaseConnection connectionForConstructor;
@Before
public void before() throws Exception {
    //        if (connectionForConstructor != null) {
    //            reset(connectionForConstructor);
    //        }
    //        connectionForConstructor = createMock(DatabaseConnection.class);
    //        connectionForConstructor.setAutoCommit(false);
    //        expectLastCall().atLeastOnce();
    //
    //        DatabaseMetaData metaData = createMock(DatabaseMetaData.class);
    //        expect(metaData.getDatabaseProductName()).andReturn("Oracle");
    //        replay(metaData);
    //
    ////        expect(connectionForConstructor.getMetaData()).andReturn(metaData);
    //        replay(connectionForConstructor);
    //
    //        testLiquibase = new TestLiquibase();
    mockResourceAccessor = new MockResourceAccessor();
    mockDatabase = mock(Database.class);
    mockLockService = mock(LockService.class);
    mockLockServiceFactory = mock(LockServiceFactory.class);
    mockChangeLogParserFactory = mock(ChangeLogParserFactory.class);
    mockChangeLogParser = mock(ChangeLogParser.class);
    mockChangeLog = mock(DatabaseChangeLog.class);
    mockChangeLogIterator = mock(ChangeLogIterator.class);
    mockLogger = mock(Logger.class);
    LockServiceFactory.setInstance(mockLockServiceFactory);
    when(mockLockServiceFactory.getLockService(any(Database.class))).thenReturn(mockLockService);
    ChangeLogParserFactory.setInstance(mockChangeLogParserFactory);
    when(mockChangeLogParserFactory.getParser(anyString(), Mockito.isA(ResourceAccessor.class))).thenReturn(mockChangeLogParser);
    when(mockChangeLogParser.parse(anyString(), any(ChangeLogParameters.class), Mockito.isA(ResourceAccessor.class))).thenReturn(mockChangeLog);
    LogFactory.setInstance(new LogFactory() {

        @Override
        public Logger getLog(String name) {
            return mockLogger;
        }
    });
}
Example 3
Project: liquibase-oracle-preconditions-master  File: OracleIndexExistsPrecondition.java View source code
public void check(Database database, DatabaseChangeLog changeLog, ChangeSet changeSet) throws PreconditionFailedException, PreconditionErrorException {
    JdbcConnection connection = (JdbcConnection) database.getConnection();
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        if (getIndexName() != null) {
            final String sql = "select count(*) from all_indexes i join dual d on upper(i.index_name) = upper(?) and upper(i.owner) = upper(?) left join all_constraints c on i.index_name = c.constraint_name where c.constraint_name is null";
            ps = connection.prepareStatement(sql);
            ps.setString(1, getIndexName());
            ps.setString(2, database.getLiquibaseSchemaName());
            rs = ps.executeQuery();
            if (!rs.next() || rs.getInt(1) <= 0) {
                throw new PreconditionFailedException(String.format("The index '%s.%s' was not found.", database.getLiquibaseSchemaName(), getIndexName()), changeLog, this);
            }
        } else {
            final String sql = "select i.index_name, i.column_name from ( select * from all_ind_columns where upper(table_name) = upper (?) and upper(index_owner) = upper(?) ) i left join all_constraints c on i.index_name = c.constraint_name where c.constraint_name is null";
            ps = connection.prepareStatement(sql);
            ps.setString(1, getTableName());
            ps.setString(2, database.getLiquibaseSchemaName());
            rs = ps.executeQuery();
            Map<String, List<String>> columnsMap = new HashMap<String, List<String>>();
            while (rs.next()) {
                String indexName = rs.getString(1);
                String columnName = rs.getString(2);
                List<String> cols = columnsMap.get(indexName);
                if (cols == null) {
                    cols = new ArrayList<String>();
                    columnsMap.put(indexName, cols);
                }
                cols.add(columnName.toUpperCase());
            }
            String[] expectedColumns = getColumnNames().toUpperCase().split("\\s*,\\s*");
            // check for an index with all columns listed.
            for (String index : columnsMap.keySet()) {
                List<String> columnNames = columnsMap.get(index);
                if (columnNames.size() == expectedColumns.length) {
                    if (columnNames.containsAll(Arrays.asList(expectedColumns))) {
                        return;
                    }
                }
            }
            throw new PreconditionFailedException(String.format("No index was found on table '%s.%s' with columns '%s'.", database.getLiquibaseSchemaName(), getTableName(), getColumnNames()), changeLog, this);
        }
    } catch (SQLException e) {
        throw new PreconditionErrorException(e, changeLog, this);
    } catch (DatabaseException e) {
        throw new PreconditionErrorException(e, changeLog, this);
    } finally {
        closeSilently(rs);
        closeSilently(ps);
    }
}
Example 4
Project: liquiface-master  File: DatabaseChangeLoader.java View source code
private DatabaseChangeLog getChangeLog() {
    if (changeLog == null) {
        try {
            ChangeLogParameters params = new ChangeLogParameters();
            changeLog = new XMLChangeLogSAXParser().parse(getChangeLogFile(), params, new FileSystemResourceAccessor());
        } catch (Exception ex) {
            logger.log(Level.SEVERE, null, ex);
        }
    }
    return changeLog;
}
Example 5
Project: liquibase-oracle-master  File: EncapsulateTableWithViewTest.java View source code
@Test
public void parseAndGenerate() throws Exception {
    if (connection == null) {
        return;
    }
    Database database = liquiBase.getDatabase();
    ResourceAccessor resourceAccessor = new ClassLoaderResourceAccessor();
    ChangeLogParameters changeLogParameters = new ChangeLogParameters();
    DatabaseChangeLog changeLog = ChangeLogParserFactory.getInstance().getParser(changeLogFile, resourceAccessor).parse(changeLogFile, changeLogParameters, resourceAccessor);
    changeLog.validate(database);
    List<ChangeSet> changeSets = changeLog.getChangeSets();
    List<String> expectedQuery = new ArrayList<String>();
    expectedQuery.add("CREATE TABLE LBUSER.person (id NUMBER(10), name VARCHAR2(50))");
    expectedQuery.add("INSERT INTO LBUSER.person (id, name) VALUES ('1', 'James')");
    expectedQuery.add("ALTER TABLE LBUSER.person RENAME TO Tperson");
    expectedQuery.add("CREATE OR REPLACE VIEW LBUSER.person AS SELECT * FROM Tperson");
    int i = 0;
    for (ChangeSet changeSet : changeSets) {
        for (Change change : changeSet.getChanges()) {
            Sql[] sql = SqlGeneratorFactory.getInstance().generateSql(change.generateStatements(database)[0], database);
            assertEquals(expectedQuery.get(i), sql[0].toSql());
        }
        i++;
    }
}
Example 6
Project: ngrinder-master  File: LiquibaseEx.java View source code
/*
	 * (non-Javadoc)
	 * 
	 * @see liquibase.Liquibase#update(java.lang.String)
	 */
@Override
public void update(String contexts) throws LiquibaseException {
    contexts = StringUtils.trimToNull(contexts);
    LockServiceEx lockService = LockServiceEx.getInstance(database);
    lockService.waitForLock();
    try {
        getChangeLogParameters().setContexts(StringUtils.splitAndTrim(contexts, ","));
        DatabaseChangeLog changeLog = ChangeLogParserFactory.getInstance().getParser(this.changeLogFile, getFileOpener()).parse(this.changeLogFile, getChangeLogParameters(), getFileOpener());
        checkDatabaseChangeLogTable(true, changeLog, contexts);
        changeLog.validate(database, contexts);
        ChangeLogIterator changeLogIterator = getStandardChangelogIterator(contexts, changeLog);
        changeLogIterator.run(new UpdateVisitor(database), database);
    } finally {
        try {
            lockService.releaseLock();
        } catch (LockException e) {
            LOGGER.error("Error while releasing db lock", e);
        }
    }
}
Example 7
Project: liquibase-percona-master  File: ChangeLogParserTest.java View source code
@Test
public void testReadLiquibaseUsePerconaFlagYAML() throws Exception {
    DatabaseChangeLog changelog = loadChangeLog("test-changelog.yaml");
    Assert.assertEquals(2, changelog.getChangeSets().size());
    ChangeSet addColumnChangeset = changelog.getChangeSets().get(1);
    Change change = addColumnChangeset.getChanges().get(0);
    Assert.assertEquals(PerconaAddColumnChange.class, change.getClass());
    Assert.assertNotNull(((PerconaAddColumnChange) change).getUsePercona());
    Assert.assertFalse(((PerconaAddColumnChange) change).getUsePercona());
}
Example 8
Project: liquibase-spatial-master  File: SpatialIndexExistsPrecondition.java View source code
@Override
public void check(final Database database, final DatabaseChangeLog changeLog, final ChangeSet changeSet) throws PreconditionFailedException, PreconditionErrorException {
    Precondition delegatedPrecondition;
    if (database instanceof DerbyDatabase || database instanceof H2Database) {
        final TableExistsPrecondition precondition = new TableExistsPrecondition();
        precondition.setCatalogName(getCatalogName());
        precondition.setSchemaName(getSchemaName());
        final String tableName = getHatboxTableName();
        precondition.setTableName(tableName);
        delegatedPrecondition = precondition;
    } else {
        final IndexExistsPrecondition precondition = new IndexExistsPrecondition();
        precondition.setCatalogName(getCatalogName());
        precondition.setSchemaName(getSchemaName());
        precondition.setTableName(getTableName());
        precondition.setIndexName(getIndexName());
        precondition.setColumnNames(getColumnNames());
        delegatedPrecondition = precondition;
    }
    delegatedPrecondition.check(database, changeLog, changeSet);
}
Example 9
Project: openmrs-core-master  File: DatabaseUpdater.java View source code
/**
	 * This code was borrowed from the liquibase jar so that we can call the given callback
	 * function.
	 *
	 * @param changeLogFile the file to execute
	 * @param contexts the liquibase changeset context
	 * @param userInput answers given by the user
	 * @param callback the function to call after every changeset
	 * @param cl {@link ClassLoader} to use to find the changeLogFile (or null to use
	 *            {@link OpenmrsClassLoader})
	 * @return A list of messages or warnings generated by the executed changesets
	 * @throws Exception
	 */
public static List<String> executeChangelog(String changeLogFile, String contexts, Map<String, Object> userInput, ChangeSetExecutorCallback callback, ClassLoader cl) throws Exception {
    final class OpenmrsUpdateVisitor extends UpdateVisitor {

        private ChangeSetExecutorCallback callback;

        private int numChangeSetsToRun;

        public OpenmrsUpdateVisitor(Database database, ChangeSetExecutorCallback callback, int numChangeSetsToRun) {
            super(database);
            this.callback = callback;
            this.numChangeSetsToRun = numChangeSetsToRun;
        }

        @Override
        public void visit(ChangeSet changeSet, DatabaseChangeLog databaseChangeLog, Database database) throws LiquibaseException {
            if (callback != null) {
                callback.executing(changeSet, numChangeSetsToRun);
            }
            super.visit(changeSet, databaseChangeLog, database);
        }
    }
    if (cl == null) {
        cl = OpenmrsClassLoader.getInstance();
    }
    log.debug("Setting up liquibase object to run changelog: " + changeLogFile);
    Liquibase liquibase = getLiquibase(changeLogFile, cl);
    int numChangeSetsToRun = liquibase.listUnrunChangeSets(contexts).size();
    Database database = null;
    LockService lockHandler = null;
    try {
        database = liquibase.getDatabase();
        lockHandler = LockService.getInstance(database);
        lockHandler.waitForLock();
        ResourceAccessor openmrsFO = new ClassLoaderFileOpener(cl);
        ResourceAccessor fsFO = new FileSystemResourceAccessor();
        DatabaseChangeLog changeLog = new XMLChangeLogSAXParser().parse(changeLogFile, new ChangeLogParameters(), new CompositeResourceAccessor(openmrsFO, fsFO));
        changeLog.setChangeLogParameters(liquibase.getChangeLogParameters());
        changeLog.validate(database);
        ChangeLogIterator logIterator = new ChangeLogIterator(changeLog, new ShouldRunChangeSetFilter(database), new ContextChangeSetFilter(contexts), new DbmsChangeSetFilter(database));
        database.checkDatabaseChangeLogTable(true, changeLog, new String[] { contexts });
        logIterator.run(new OpenmrsUpdateVisitor(database, callback, numChangeSetsToRun), database);
    } catch (LiquibaseException e) {
        throw e;
    } finally {
        try {
            lockHandler.releaseLock();
        } catch (Exception e) {
            log.error("Could not release lock", e);
        }
        try {
            database.getConnection().close();
        } catch (Exception e) {
        }
    }
    return updateWarnings;
}
Example 10
Project: osgi-bundles-liquibase-master  File: MockChangeLogSerializer.java View source code
public String serialize(DatabaseChangeLog databaseChangeLog) {
    return null;
}
Example 11
Project: telekom-workflow-engine-master  File: Slf4jLogger.java View source code
@Override
public void setChangeLog(DatabaseChangeLog databaseChangeLog) {
    changeLogName = (databaseChangeLog == null) ? null : databaseChangeLog.getFilePath();
}
Example 12
Project: DataHubSystem-master  File: LiquibaseLogger.java View source code
@Override
public void setChangeLog(DatabaseChangeLog databaseChangeLog) {
}
Example 13
Project: keycloak-master  File: DefaultLiquibaseConnectionProvider.java View source code
@Override
public void setChangeLog(DatabaseChangeLog databaseChangeLog) {
}