package liquibase.ext.oracle.preconditions; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import liquibase.changelog.ChangeSet; import liquibase.changelog.DatabaseChangeLog; import liquibase.database.Database; import liquibase.database.jvm.JdbcConnection; import liquibase.exception.DatabaseException; import liquibase.exception.PreconditionErrorException; import liquibase.exception.PreconditionFailedException; import liquibase.exception.ValidationErrors; import liquibase.exception.Warnings; import liquibase.precondition.Precondition; public class OracleColumnExistsPrecondition extends OraclePrecondition { private String tableName; private String columnName; public String getTableName() { return tableName; } public void setTableName( String tableName ) { this.tableName = tableName; } public String getColumnName() { return columnName; } public void setColumnName( String columnName ) { this.columnName = columnName; } public String getName() { return "oracleColumnExists"; } public Warnings warn( Database database ) { return new Warnings(); } public ValidationErrors validate( Database database ) { return new ValidationErrors(); } public void check( Database database, DatabaseChangeLog changeLog, ChangeSet changeSet ) throws PreconditionFailedException, PreconditionErrorException { JdbcConnection connection = (JdbcConnection) database.getConnection(); PreparedStatement ps = null; ResultSet rs = null; try { final String sql = "select count(*) from all_tab_columns where upper(table_name) = upper(?) and upper(column_name) = upper(?) and upper(owner) = upper(?)"; ps = connection.prepareStatement( sql ); ps.setString( 1, getTableName() ); ps.setString( 2, getColumnName() ); ps.setString( 3, database.getLiquibaseSchemaName() ); rs = ps.executeQuery(); if ( !rs.next() || rs.getInt( 1 ) <= 0 ) { throw new PreconditionFailedException( String.format( "The column '%s' was not found on table '%s.%s'.", getColumnName(), database.getLiquibaseSchemaName(), getTableName() ), 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 ); } } }