| 1 |  |  package liquibase.sqlgenerator.core; | 
  | 2 |  |   | 
  | 3 |  |  import liquibase.database.Database; | 
  | 4 |  |  import liquibase.database.core.FirebirdDatabase; | 
  | 5 |  |  import liquibase.database.core.InformixDatabase; | 
  | 6 |  |  import liquibase.database.core.MSSQLDatabase; | 
  | 7 |  |  import liquibase.database.core.OracleDatabase; | 
  | 8 |  |  import liquibase.database.core.PostgresDatabase; | 
  | 9 |  |  import liquibase.database.core.SQLiteDatabase; | 
  | 10 |  |  import liquibase.exception.ValidationErrors; | 
  | 11 |  |  import liquibase.sql.Sql; | 
  | 12 |  |  import liquibase.sql.UnparsedSql; | 
  | 13 |  |  import liquibase.sqlgenerator.SqlGeneratorChain; | 
  | 14 |  |  import liquibase.statement.core.DropPrimaryKeyStatement; | 
  | 15 |  |   | 
  | 16 | 86 |  public class DropPrimaryKeyGenerator extends AbstractSqlGenerator<DropPrimaryKeyStatement> { | 
  | 17 |  |   | 
  | 18 |  |      @Override | 
  | 19 |  |      public boolean supports(DropPrimaryKeyStatement statement, Database database) { | 
  | 20 | 61 |          return (!(database instanceof SQLiteDatabase)); | 
  | 21 |  |      } | 
  | 22 |  |   | 
  | 23 |  |      @Override | 
  | 24 |  |      public ValidationErrors validate(DropPrimaryKeyStatement dropPrimaryKeyStatement, Database database, | 
  | 25 |  |              SqlGeneratorChain sqlGeneratorChain) { | 
  | 26 | 15 |          ValidationErrors validationErrors = new ValidationErrors(); | 
  | 27 | 15 |          validationErrors.checkRequiredField("tableName", dropPrimaryKeyStatement.getTableName()); | 
  | 28 |  |   | 
  | 29 | 15 |          if (database instanceof FirebirdDatabase || database instanceof InformixDatabase) { | 
  | 30 | 2 |              validationErrors.checkRequiredField("constraintName", dropPrimaryKeyStatement.getConstraintName()); | 
  | 31 |  |          } | 
  | 32 |  |   | 
  | 33 | 15 |          return validationErrors; | 
  | 34 |  |      } | 
  | 35 |  |   | 
  | 36 |  |      @Override | 
  | 37 |  |      public Sql[] generateSql(DropPrimaryKeyStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { | 
  | 38 |  |          String sql; | 
  | 39 |  |   | 
  | 40 | 0 |          if (database instanceof MSSQLDatabase) { | 
  | 41 | 0 |              if (statement.getConstraintName() == null) { | 
  | 42 | 0 |                  StringBuilder query = new StringBuilder(); | 
  | 43 | 0 |                  query.append("DECLARE @pkname nvarchar(255)"); | 
  | 44 | 0 |                  query.append("\n"); | 
  | 45 | 0 |                  query.append("DECLARE @sql nvarchar(2048)"); | 
  | 46 | 0 |                  query.append("\n"); | 
  | 47 | 0 |                  query.append("select @pkname=i.name from sysindexes i"); | 
  | 48 | 0 |                  query.append(" join sysobjects o ON i.id = o.id"); | 
  | 49 | 0 |                  query.append(" join sysobjects pk ON i.name = pk.name AND pk.parent_obj = i.id AND pk.xtype = 'PK'"); | 
  | 50 | 0 |                  query.append(" join sysindexkeys ik on i.id = ik.id AND i.indid = ik.indid"); | 
  | 51 | 0 |                  query.append(" join syscolumns c ON ik.id = c.id AND ik.colid = c.colid"); | 
  | 52 | 0 |                  query.append(" where o.name = '").append(statement.getTableName()).append("'"); | 
  | 53 | 0 |                  query.append("\n"); | 
  | 54 | 0 |                  query.append("set @sql='alter table ") | 
  | 55 |  |                          .append(database.escapeTableName(statement.getSchemaName(), statement.getTableName())) | 
  | 56 |  |                          .append(" drop constraint ' + @pkname"); | 
  | 57 | 0 |                  query.append("\n"); | 
  | 58 | 0 |                  query.append("exec(@sql)"); | 
  | 59 | 0 |                  query.append("\n"); | 
  | 60 | 0 |                  sql = query.toString(); | 
  | 61 | 0 |              } else { | 
  | 62 | 0 |                  sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) | 
  | 63 |  |                          + " DROP CONSTRAINT " + database.escapeConstraintName(statement.getConstraintName()); | 
  | 64 |  |              } | 
  | 65 | 0 |          } else if (database instanceof PostgresDatabase) { | 
  | 66 | 0 |              if (statement.getConstraintName() == null) { | 
  | 67 | 0 |                  StringBuilder query = new StringBuilder(); | 
  | 68 | 0 |                  query.append("create or replace function __liquibase_drop_pk(tableName text) returns void as $$"); | 
  | 69 | 0 |                  query.append(" declare"); | 
  | 70 | 0 |                  query.append(" pkname text;"); | 
  | 71 | 0 |                  query.append(" sql text;"); | 
  | 72 | 0 |                  query.append(" begin"); | 
  | 73 | 0 |                  query.append(" pkname = c.conname"); | 
  | 74 | 0 |                  query.append(" from pg_class r, pg_constraint c"); | 
  | 75 | 0 |                  query.append(" where r.oid = c.conrelid"); | 
  | 76 | 0 |                  query.append(" and contype = 'p'"); | 
  | 77 | 0 |                  query.append(" and relname ilike tableName;"); | 
  | 78 | 0 |                  query.append(" sql = 'alter table ' || tableName || ' drop constraint ' || pkname;"); | 
  | 79 | 0 |                  query.append(" execute sql;"); | 
  | 80 | 0 |                  query.append(" end;"); | 
  | 81 | 0 |                  query.append(" $$ language plpgsql;"); | 
  | 82 | 0 |                  query.append(" select __liquibase_drop_pk('").append(statement.getTableName()).append("');"); | 
  | 83 | 0 |                  query.append(" drop function __liquibase_drop_pk(tableName text);"); | 
  | 84 | 0 |                  sql = query.toString(); | 
  | 85 | 0 |              } else { | 
  | 86 | 0 |                  sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) | 
  | 87 |  |                          + " DROP CONSTRAINT " + database.escapeConstraintName(statement.getConstraintName()); | 
  | 88 |  |              } | 
  | 89 | 0 |          } else if (database instanceof FirebirdDatabase) { | 
  | 90 | 0 |              sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) | 
  | 91 |  |                      + " DROP CONSTRAINT " + database.escapeConstraintName(statement.getConstraintName()); | 
  | 92 | 0 |          } else if (database instanceof OracleDatabase) { | 
  | 93 | 0 |              sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) | 
  | 94 |  |                      + " DROP PRIMARY KEY DROP INDEX"; | 
  | 95 | 0 |          } else if (database instanceof InformixDatabase) { | 
  | 96 | 0 |              sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) | 
  | 97 |  |                      + " DROP CONSTRAINT " + database.escapeConstraintName(statement.getConstraintName()); | 
  | 98 |  |          } else { | 
  | 99 | 0 |              sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) | 
  | 100 |  |                      + " DROP PRIMARY KEY"; | 
  | 101 |  |          } | 
  | 102 |  |   | 
  | 103 | 0 |          return new Sql[] { new UnparsedSql(sql) }; | 
  | 104 |  |      } | 
  | 105 |  |  } |