package liquibase.ext.ora.adddeferredprimarykey; import liquibase.database.Database; import liquibase.database.core.OracleDatabase; import liquibase.exception.ValidationErrors; import liquibase.exception.Warnings; import liquibase.sql.Sql; import liquibase.sql.UnparsedSql; import liquibase.sqlgenerator.SqlGeneratorChain; import liquibase.sqlgenerator.core.AbstractSqlGenerator; public class AddDeferredPrimaryKeyGenerator extends AbstractSqlGenerator<AddDeferredPrimaryKeyStatement> { public Sql[] generateSql(AddDeferredPrimaryKeyStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { String sql; ValidationErrors validationError = this.validate(statement, database, sqlGeneratorChain); if (validationError.hasErrors()) { for (String errorMassage : validationError.getErrorMessages()) { throw new IllegalStateException(errorMassage); } } if (statement.getConstraintName() == null) { sql = "ALTER TABLE " + database.escapeTableName(null, statement.getSchemaName(), statement.getTableName()) + " ADD PRIMARY KEY (" + database.escapeColumnNameList(statement.getColumnNames()) + ")"; } else { sql = "ALTER TABLE " + database.escapeTableName(null, statement.getSchemaName(), statement.getTableName()) + " ADD CONSTRAINT " + database.escapeConstraintName(statement.getConstraintName()) + " PRIMARY KEY (" + database.escapeColumnNameList(statement.getColumnNames()) + ")"; } if (statement.getDeferrable() != null) { if (statement.getDeferrable()) { sql += " DEFERRABLE"; } } if (statement.getInitiallyDeferred() != null) { if (statement.getInitiallyDeferred()) { sql += " INITIALLY DEFERRED"; } } return new Sql[]{new UnparsedSql(sql)}; } public boolean supports(AddDeferredPrimaryKeyStatement statement, Database database) { return (database instanceof OracleDatabase); } public ValidationErrors validate(AddDeferredPrimaryKeyStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { ValidationErrors validationErrors = new ValidationErrors(); if (!database.supportsInitiallyDeferrableColumns()) { validationErrors.checkDisallowedField("initiallyDeferred", statement.getInitiallyDeferred(), database); validationErrors.checkDisallowedField("deferrable", statement.getDeferrable(), database); } validationErrors.checkRequiredField("columnNames", statement.getColumnNames()); validationErrors.checkRequiredField("tableName", statement.getTableName()); return validationErrors; } }