View Javadoc

1   package liquibase.sqlgenerator.ext;
2   
3   import liquibase.database.Database;
4   import liquibase.database.core.*;
5   import liquibase.exception.ValidationErrors;
6   import liquibase.sql.Sql;
7   import liquibase.sql.UnparsedSql;
8   import liquibase.sqlgenerator.SqlGenerator;
9   import liquibase.sqlgenerator.SqlGeneratorChain;
10  import liquibase.statement.core.AddUniqueConstraintStatement;
11  import liquibase.util.StringUtils;
12  
13  import static liquibase.ext.Constants.EXTENSION_PRIORITY;
14  
15  public class AddUniqueConstraintGenerator extends liquibase.sqlgenerator.core.AddUniqueConstraintGenerator {
16  
17      @Override
18      public int getPriority() {
19          return EXTENSION_PRIORITY;
20      }
21  
22      public Sql[] generateSql(AddUniqueConstraintStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
23  
24  		String sql = null;
25  		if (statement.getConstraintName() == null) {
26  			sql = String.format("ALTER TABLE %s ADD UNIQUE (%s)"
27  					, database.escapeTableName(null, statement.getTableName())
28  					, database.escapeColumnNameList(statement.getColumnNames())
29  			);
30  		} else {
31  			sql = String.format("ALTER TABLE %s ADD CONSTRAINT %s UNIQUE (%s)"
32  					, database.escapeTableName(null, statement.getTableName())
33  					, database.escapeConstraintName(statement.getConstraintName())
34  					, database.escapeColumnNameList(statement.getColumnNames())
35  			);
36  		}
37  		if(database instanceof OracleDatabase) {
38  	        if (statement.isDeferrable() || statement.isInitiallyDeferred()) {
39  	            if (statement.isDeferrable()) {
40  	            	sql += " DEFERRABLE";
41  	            }
42  
43  	            if (statement.isInitiallyDeferred()) {
44  	            	sql +=" INITIALLY DEFERRED";
45  	            }
46  	        }
47              if (statement.isDisabled()) {
48                  sql +=" DISABLE";
49              }
50  		}
51  
52          if (StringUtils.trimToNull(statement.getTablespace()) != null && database.supportsTablespaces()) {
53              if (database instanceof MSSQLDatabase) {
54                  sql += " ON " + statement.getTablespace();
55              } else if (database instanceof DB2Database
56                  || database instanceof SybaseASADatabase
57                  || database instanceof InformixDatabase) {
58                  ; //not supported
59              } else {
60                  sql += " USING INDEX TABLESPACE " + statement.getTablespace();
61              }
62          }
63  
64          return new Sql[] {
65                  new UnparsedSql(sql)
66          };
67  
68      }
69  }