package liquibase.sqlgenerator.core;
import liquibase.change.ColumnConfig;
import liquibase.database.Database;
import liquibase.database.core.OracleDatabase;
import liquibase.exception.ValidationErrors;
import liquibase.sql.Sql;
import liquibase.sql.UnparsedSql;
import liquibase.sqlgenerator.SqlGeneratorChain;
import liquibase.statement.core.SelectFromDatabaseChangeLogLockStatement;
import liquibase.util.StringUtils;
public class SelectFromDatabaseChangeLogLockGenerator extends AbstractSqlGenerator<SelectFromDatabaseChangeLogLockStatement> {
@Override
public ValidationErrors validate(SelectFromDatabaseChangeLogLockStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
ValidationErrors errors = new ValidationErrors();
errors.checkRequiredField("columnToSelect", statement.getColumnsToSelect());
return errors;
}
@Override
public Sql[] generateSql(SelectFromDatabaseChangeLogLockStatement statement, final Database database, SqlGeneratorChain sqlGeneratorChain) {
String liquibaseSchema;
liquibaseSchema = database.getLiquibaseSchemaName();
ColumnConfig[] columns = statement.getColumnsToSelect();
int numberOfColumns = columns.length;
String sql = "SELECT " + StringUtils.join(statement.getColumnsToSelect(), ",", new StringUtils.StringUtilsFormatter<ColumnConfig>() {
@Override
public String toString(ColumnConfig col) {
if (col.getComputed() != null && col.getComputed()) {
return col.getName();
} else {
return database.escapeColumnName(null, null, null, col.getName());
}
}
}) + " FROM " +
database.escapeTableName(database.getLiquibaseCatalogName(), liquibaseSchema, database.getDatabaseChangeLogLockTableName()) +
" WHERE " + database.escapeColumnName(database.getLiquibaseCatalogName(), liquibaseSchema, database.getDatabaseChangeLogLockTableName(), "ID") + "=1";
if (database instanceof OracleDatabase) {
sql += " FOR UPDATE";
}
return new Sql[] {
new UnparsedSql(sql)
};
}
}