package liquibase.sqlgenerator.core;
import liquibase.database.Database;
import liquibase.database.core.*;
import liquibase.exception.ValidationErrors;
import liquibase.sql.Sql;
import liquibase.sql.UnparsedSql;
import liquibase.sqlgenerator.SqlGenerator;
import liquibase.sqlgenerator.SqlGeneratorChain;
import liquibase.statement.core.AddUniqueConstraintStatement;
import liquibase.util.StringUtils;
public class AddUniqueConstraintGenerator extends AbstractSqlGenerator<AddUniqueConstraintStatement> {
@Override
public boolean supports(AddUniqueConstraintStatement statement, Database database) {
return !(database instanceof SQLiteDatabase)
&& !(database instanceof MSSQLDatabase)
&& !(database instanceof SybaseDatabase)
&& !(database instanceof SybaseASADatabase)
&& !(database instanceof InformixDatabase)
;
}
public ValidationErrors validate(AddUniqueConstraintStatement addUniqueConstraintStatement, Database database, SqlGeneratorChain sqlGeneratorChain) {
ValidationErrors validationErrors = new ValidationErrors();
validationErrors.checkRequiredField("columnNames", addUniqueConstraintStatement.getColumnNames());
validationErrors.checkRequiredField("tableName", addUniqueConstraintStatement.getTableName());
return validationErrors;
}
public Sql[] generateSql(AddUniqueConstraintStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
String sql = null;
if (statement.getConstraintName() == null) {
sql = String.format("ALTER TABLE %s ADD UNIQUE (%s)"
, database.escapeTableName(statement.getSchemaName(), statement.getTableName())
, database.escapeColumnNameList(statement.getColumnNames())
);
} else {
sql = String.format("ALTER TABLE %s ADD CONSTRAINT %s UNIQUE (%s)"
, database.escapeTableName(statement.getSchemaName(), statement.getTableName())
, database.escapeConstraintName(statement.getConstraintName())
, database.escapeColumnNameList(statement.getColumnNames())
);
}
if(database instanceof OracleDatabase) {
if (statement.isDeferrable() || statement.isInitiallyDeferred()) {
if (statement.isDeferrable()) {
sql += " DEFERRABLE";
}
if (statement.isInitiallyDeferred()) {
sql +=" INITIALLY DEFERRED";
}
}
if (statement.isDisabled()) {
sql +=" DISABLE";
}
}
if (StringUtils.trimToNull(statement.getTablespace()) != null && database.supportsTablespaces()) {
if (database instanceof MSSQLDatabase) {
sql += " ON " + statement.getTablespace();
} else if (database instanceof DB2Database
|| database instanceof SybaseASADatabase
|| database instanceof InformixDatabase) {
; //not supported
} else {
sql += " USING INDEX TABLESPACE " + statement.getTablespace();
}
}
return new Sql[] {
new UnparsedSql(sql)
};
}
}