diff --git a/liquibase-core/src/main/java/liquibase/action/AddPrimaryKeyAction.java b/liquibase-core/src/main/java/liquibase/action/AddPrimaryKeyAction.java index e60d473b64a..36db4252587 100644 --- a/liquibase-core/src/main/java/liquibase/action/AddPrimaryKeyAction.java +++ b/liquibase-core/src/main/java/liquibase/action/AddPrimaryKeyAction.java @@ -5,7 +5,6 @@ import liquibase.change.DatabaseChange; import liquibase.change.ExecutableChange; import liquibase.change.core.AddPrimaryKeyChange; -import liquibase.change.core.DropPrimaryKeyChange; import liquibase.database.Database; import liquibase.database.core.DB2Database; import liquibase.snapshot.SnapshotGeneratorFactory; @@ -174,7 +173,7 @@ public ChangeStatus checkStatus(Database database) { @Override protected ExecutableChange[] createInverses() { - DropPrimaryKeyChange inverse = new DropPrimaryKeyChange(); + DropPrimaryKeyAction inverse = new DropPrimaryKeyAction(); inverse.setSchemaName(getSchemaName()); inverse.setTableName(getTableName()); inverse.setConstraintName(getConstraintName()); diff --git a/liquibase-core/src/main/java/liquibase/action/DropPrimaryKeyAction.java b/liquibase-core/src/main/java/liquibase/action/DropPrimaryKeyAction.java new file mode 100644 index 00000000000..576a3e272fc --- /dev/null +++ b/liquibase-core/src/main/java/liquibase/action/DropPrimaryKeyAction.java @@ -0,0 +1,158 @@ +package liquibase.action; + +import java.util.ArrayList; +import java.util.List; + +import liquibase.change.ChangeMetaData; +import liquibase.change.ChangeStatus; +import liquibase.change.ColumnConfig; +import liquibase.change.DatabaseChange; +import liquibase.change.ExecutableChange; +import liquibase.change.core.DropPrimaryKeyChange; +import liquibase.database.Database; +import liquibase.database.core.SQLiteDatabase; +import liquibase.database.core.SQLiteDatabase.AlterTableVisitor; +import liquibase.snapshot.SnapshotGeneratorFactory; +import liquibase.statement.SqlStatement; +import liquibase.statement.core.DropPrimaryKeyStatement; +import liquibase.structure.core.Index; +import liquibase.structure.core.PrimaryKey; + +import org.kohsuke.MetaInfServices; + +/** + * Removes an existing primary key. + */ +@DatabaseChange(name = "dropPrimaryKey", description = "Drops an existing primary key", priority = ChangeMetaData.PRIORITY_DEFAULT, appliesTo = "primaryKey") +@MetaInfServices(ExecutableChange.class) +public class DropPrimaryKeyAction extends AbstractAction { + + public DropPrimaryKeyAction() { + this(new DropPrimaryKeyChange()); + } + + public DropPrimaryKeyAction(DropPrimaryKeyChange change) { + super(change); + } + + @Override + public boolean generateStatementsVolatile(Database database) { + if (database instanceof SQLiteDatabase) { + return true; + } + return false; + } + + public String getCatalogName() { + return change.getCatalogName(); + } + + public void setCatalogName(String catalogName) { + change.setCatalogName(catalogName); + } + + public String getSchemaName() { + return change.getSchemaName(); + } + + public void setSchemaName(String schemaName) { + change.setSchemaName(schemaName); + } + + public String getTableName() { + return change.getTableName(); + } + + public void setTableName(String tableName) { + change.setTableName(tableName); + } + + public String getConstraintName() { + return change.getConstraintName(); + } + + public void setConstraintName(String constraintName) { + change.setConstraintName(constraintName); + } + + @Override + public SqlStatement[] generateStatements(Database database) { + + if (database instanceof SQLiteDatabase) { + // return special statements for SQLite databases + return generateStatementsForSQLiteDatabase(database); + } + + return new SqlStatement[] { new DropPrimaryKeyStatement(getCatalogName(), getSchemaName(), + getTableName(), getConstraintName()), }; + } + + @Override + public ChangeStatus checkStatus(Database database) { + try { + return new ChangeStatus().assertComplete( + !SnapshotGeneratorFactory.getInstance().has( + new PrimaryKey(getConstraintName(), getCatalogName(), getSchemaName(), + getTableName()), database), "Primary key exists"); + } + catch (Exception e) { + return new ChangeStatus().unknown(e); + } + + } + + private SqlStatement[] generateStatementsForSQLiteDatabase(Database database) { + + // SQLite does not support this ALTER TABLE operation until now. + // For more information see: http://www.sqlite.org/omitted.html. + // This is a small work around... + + // Note: The attribute "constraintName" is used to pass the column + // name instead of the constraint name. + + List statements = new ArrayList(); + + // define alter table logic + AlterTableVisitor rename_alter_visitor = new AlterTableVisitor() { + + @Override + public ColumnConfig[] getColumnsToAdd() { + return new ColumnConfig[0]; + } + + @Override + public boolean copyThisColumn(ColumnConfig column) { + return true; + } + + @Override + public boolean createThisColumn(ColumnConfig column) { + if (column.getName().equals(getConstraintName())) { + column.getConstraints().setPrimaryKey(false); + } + return true; + } + + @Override + public boolean createThisIndex(Index index) { + return true; + } + }; + + try { + // alter table + statements.addAll(SQLiteDatabase.getAlterTableStatements(rename_alter_visitor, + database, getCatalogName(), getSchemaName(), getTableName())); + } + catch (Exception e) { + e.printStackTrace(); + } + + return statements.toArray(new SqlStatement[statements.size()]); + } + + @Override + public String getConfirmationMessage() { + return "Primary key dropped from " + getTableName(); + } +} diff --git a/liquibase-core/src/main/java/liquibase/change/core/DropPrimaryKeyChange.java b/liquibase-core/src/main/java/liquibase/change/core/DropPrimaryKeyChange.java deleted file mode 100644 index 542aa68ee56..00000000000 --- a/liquibase-core/src/main/java/liquibase/change/core/DropPrimaryKeyChange.java +++ /dev/null @@ -1,157 +0,0 @@ -package liquibase.change.core; - -import java.util.ArrayList; -import java.util.List; - -import liquibase.change.AbstractChange; -import liquibase.change.ExecutableChange; -import liquibase.change.ChangeMetaData; -import liquibase.change.ChangeStatus; -import liquibase.change.ColumnConfig; -import liquibase.change.DatabaseChange; -import liquibase.change.DatabaseChangeProperty; -import liquibase.database.Database; -import liquibase.database.core.SQLiteDatabase; -import liquibase.database.core.SQLiteDatabase.AlterTableVisitor; -import liquibase.snapshot.SnapshotGeneratorFactory; -import liquibase.statement.SqlStatement; -import liquibase.statement.core.DropPrimaryKeyStatement; -import liquibase.structure.core.Index; -import liquibase.structure.core.PrimaryKey; - -import org.kohsuke.MetaInfServices; - -/** - * Removes an existing primary key. - */ -@DatabaseChange(name="dropPrimaryKey", description = "Drops an existing primary key", priority = ChangeMetaData.PRIORITY_DEFAULT, appliesTo = "primaryKey") -@MetaInfServices(ExecutableChange.class) -public class DropPrimaryKeyChange extends AbstractChange { - private String catalogName; - private String schemaName; - private String tableName; - private String constraintName; - - @Override - public boolean generateStatementsVolatile(Database database) { - if (database instanceof SQLiteDatabase) { - return true; - } - return false; - } - - @DatabaseChangeProperty(mustEqualExisting ="primaryKey.catalog") - public String getCatalogName() { - return catalogName; - } - - public void setCatalogName(String catalogName) { - this.catalogName = catalogName; - } - - @DatabaseChangeProperty(mustEqualExisting ="primaryKey.schema") - public String getSchemaName() { - return schemaName; - } - - public void setSchemaName(String schemaName) { - this.schemaName = schemaName; - } - - @DatabaseChangeProperty(mustEqualExisting = "primaryKey.table", description = "Name of the table to drop the primary key of") - public String getTableName() { - return tableName; - } - - public void setTableName(String tableName) { - this.tableName = tableName; - } - - @DatabaseChangeProperty(mustEqualExisting = "primaryKey", description = "Name of the primary key") - public String getConstraintName() { - return constraintName; - } - - public void setConstraintName(String constraintName) { - this.constraintName = constraintName; - } - - @Override - public SqlStatement[] generateStatements(Database database) { - - if (database instanceof SQLiteDatabase) { - // return special statements for SQLite databases - return generateStatementsForSQLiteDatabase(database); - } - - return new SqlStatement[]{ - new DropPrimaryKeyStatement(getCatalogName(), getSchemaName(), getTableName(), getConstraintName()), - }; - } - - @Override - public ChangeStatus checkStatus(Database database) { - try { - return new ChangeStatus().assertComplete(!SnapshotGeneratorFactory.getInstance().has(new PrimaryKey(getConstraintName(), getCatalogName(), getSchemaName(), getTableName()), database), "Primary key exists"); - } catch (Exception e) { - return new ChangeStatus().unknown(e); - } - - } - - private SqlStatement[] generateStatementsForSQLiteDatabase(Database database) { - - // SQLite does not support this ALTER TABLE operation until now. - // For more information see: http://www.sqlite.org/omitted.html. - // This is a small work around... - - // Note: The attribute "constraintName" is used to pass the column - // name instead of the constraint name. - - List statements = new ArrayList(); - - // define alter table logic - AlterTableVisitor rename_alter_visitor = new AlterTableVisitor() { - @Override - public ColumnConfig[] getColumnsToAdd() { - return new ColumnConfig[0]; - } - @Override - public boolean copyThisColumn(ColumnConfig column) { - return true; - } - @Override - public boolean createThisColumn(ColumnConfig column) { - if (column.getName().equals(getConstraintName())) { - column.getConstraints().setPrimaryKey(false); - } - return true; - } - @Override - public boolean createThisIndex(Index index) { - return true; - } - }; - - try { - // alter table - statements.addAll(SQLiteDatabase.getAlterTableStatements( - rename_alter_visitor, - database,getCatalogName(), getSchemaName(),getTableName())); - } catch (Exception e) { - e.printStackTrace(); - } - - return statements.toArray(new SqlStatement[statements.size()]); - } - - @Override - public String getConfirmationMessage() { - return "Primary key dropped from "+getTableName(); - } - - @Override - public String getSerializedObjectNamespace() { - return STANDARD_CHANGELOG_NAMESPACE; - } -} diff --git a/liquibase-core/src/main/java/liquibase/diff/output/changelog/core/ChangedPrimaryKeyChangeGenerator.java b/liquibase-core/src/main/java/liquibase/diff/output/changelog/core/ChangedPrimaryKeyChangeGenerator.java index e9a849f18f8..b61f4a0a269 100644 --- a/liquibase-core/src/main/java/liquibase/diff/output/changelog/core/ChangedPrimaryKeyChangeGenerator.java +++ b/liquibase-core/src/main/java/liquibase/diff/output/changelog/core/ChangedPrimaryKeyChangeGenerator.java @@ -3,8 +3,8 @@ import java.util.List; import liquibase.action.AddPrimaryKeyAction; +import liquibase.action.DropPrimaryKeyAction; import liquibase.change.ExecutableChange; -import liquibase.change.core.DropPrimaryKeyChange; import liquibase.database.Database; import liquibase.diff.ObjectDifferences; import liquibase.diff.output.DiffOutputControl; @@ -44,8 +44,8 @@ public Class[] runAfterTypes() { public ExecutableChange[] fixChanged(DatabaseObject changedObject, ObjectDifferences differences, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) { PrimaryKey pk = (PrimaryKey) changedObject; - DropPrimaryKeyChange dropPkChange = new DropPrimaryKeyChange(); - dropPkChange.setTableName(pk.getTable().getName()); + DropPrimaryKeyAction dropPkAction = new DropPrimaryKeyAction(); + dropPkAction.setTableName(pk.getTable().getName()); AddPrimaryKeyAction addPkAction = new AddPrimaryKeyAction(); addPkAction.setTableName(pk.getTable().getName()); @@ -54,11 +54,11 @@ public ExecutableChange[] fixChanged(DatabaseObject changedObject, ObjectDiffere if (control.getIncludeCatalog()) { - dropPkChange.setCatalogName(pk.getSchema().getCatalogName()); + dropPkAction.setCatalogName(pk.getSchema().getCatalogName()); addPkAction.setCatalogName(pk.getSchema().getCatalogName()); } if (control.getIncludeSchema()) { - dropPkChange.setSchemaName(pk.getSchema().getName()); + dropPkAction.setSchemaName(pk.getSchema().getName()); addPkAction.setSchemaName(pk.getSchema().getName()); } @@ -77,6 +77,6 @@ public ExecutableChange[] fixChanged(DatabaseObject changedObject, ObjectDiffere control.setAlreadyHandledChanged(new UniqueConstraint().setTable(pk.getTable()).setColumns(comparedColumns)); } - return new ExecutableChange[] { dropPkChange, addPkAction }; + return new ExecutableChange[] { dropPkAction, addPkAction }; } } diff --git a/liquibase-core/src/main/java/liquibase/diff/output/changelog/core/UnexpectedPrimaryKeyChangeGenerator.java b/liquibase-core/src/main/java/liquibase/diff/output/changelog/core/UnexpectedPrimaryKeyChangeGenerator.java index 38834f08434..cfd026f2796 100644 --- a/liquibase-core/src/main/java/liquibase/diff/output/changelog/core/UnexpectedPrimaryKeyChangeGenerator.java +++ b/liquibase-core/src/main/java/liquibase/diff/output/changelog/core/UnexpectedPrimaryKeyChangeGenerator.java @@ -1,7 +1,7 @@ package liquibase.diff.output.changelog.core; +import liquibase.action.DropPrimaryKeyAction; import liquibase.change.ExecutableChange; -import liquibase.change.core.DropPrimaryKeyChange; import liquibase.database.Database; import liquibase.diff.output.DiffOutputControl; import liquibase.diff.output.changelog.ChangeGenerator; @@ -39,21 +39,21 @@ public Class[] runBeforeTypes() { public ExecutableChange[] fixUnexpected(DatabaseObject unexpectedObject, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) { // if (!diffResult.getObjectDiff(Table.class).getUnexpected().contains(pk.getTable())) { PrimaryKey pk = (PrimaryKey) unexpectedObject; - DropPrimaryKeyChange change = new DropPrimaryKeyChange(); - change.setTableName(pk.getTable().getName()); + DropPrimaryKeyAction action = new DropPrimaryKeyAction(); + action.setTableName(pk.getTable().getName()); if (control.getIncludeCatalog()) { - change.setCatalogName(pk.getTable().getSchema().getCatalogName()); + action.setCatalogName(pk.getTable().getSchema().getCatalogName()); } if (control.getIncludeSchema()) { - change.setSchemaName(pk.getTable().getSchema().getName()); + action.setSchemaName(pk.getTable().getSchema().getName()); } - change.setConstraintName(pk.getName()); + action.setConstraintName(pk.getName()); Index backingIndex = pk.getBackingIndex(); control.setAlreadyHandledUnexpected(backingIndex); - return new ExecutableChange[] { change }; + return new ExecutableChange[] { action }; // } } diff --git a/liquibase-core/src/test/groovy/liquibase/change/core/DropPrimaryKeyChangeTest.groovy b/liquibase-core/src/test/groovy/liquibase/change/core/DropPrimaryKeyChangeTest.groovy index df61413119c..dfbea178359 100644 --- a/liquibase-core/src/test/groovy/liquibase/change/core/DropPrimaryKeyChangeTest.groovy +++ b/liquibase-core/src/test/groovy/liquibase/change/core/DropPrimaryKeyChangeTest.groovy @@ -1,6 +1,7 @@ package liquibase.change.core -import liquibase.change.ChangeStatus; +import liquibase.action.DropPrimaryKeyAction +import liquibase.change.ChangeStatus import liquibase.change.StandardChangeTest import liquibase.sdk.database.MockDatabase import liquibase.snapshot.MockSnapshotGeneratorFactory @@ -13,7 +14,7 @@ public class DropPrimaryKeyChangeTest extends StandardChangeTest { def getConfirmationMessage() throws Exception { when: - DropPrimaryKeyChange change = new DropPrimaryKeyChange(); + DropPrimaryKeyAction change = new DropPrimaryKeyAction(); change.setSchemaName("SCHEMA_NAME"); change.setTableName("TABLE_NAME"); change.setConstraintName("PK_NAME"); @@ -33,7 +34,7 @@ public class DropPrimaryKeyChangeTest extends StandardChangeTest { def testColumn = new Column(Table.class, null, null, table.name, "test_col") def pk = new PrimaryKey("pk_test", null, null, table.name, new Column(testColumn.name)) - def change = new DropPrimaryKeyChange() + def change = new DropPrimaryKeyAction() change.tableName = table.name change.constraintName = pk.name diff --git a/liquibase-parser-api/src/main/java/liquibase/change/core/DropPrimaryKeyChange.java b/liquibase-parser-api/src/main/java/liquibase/change/core/DropPrimaryKeyChange.java new file mode 100644 index 00000000000..e79d82acd04 --- /dev/null +++ b/liquibase-parser-api/src/main/java/liquibase/change/core/DropPrimaryKeyChange.java @@ -0,0 +1,62 @@ +package liquibase.change.core; + +import liquibase.change.BaseChange; +import liquibase.change.Change; +import liquibase.change.ChangeMetaData; +import liquibase.change.DatabaseChange; +import liquibase.change.DatabaseChangeProperty; + +import org.kohsuke.MetaInfServices; + +/** + * Removes an existing primary key. + */ +@DatabaseChange(name="dropPrimaryKey", description = "Drops an existing primary key", priority = ChangeMetaData.PRIORITY_DEFAULT, appliesTo = "primaryKey") +@MetaInfServices(Change.class) +public class DropPrimaryKeyChange extends BaseChange { + private String catalogName; + private String schemaName; + private String tableName; + private String constraintName; + + @DatabaseChangeProperty(mustEqualExisting ="primaryKey.catalog") + public String getCatalogName() { + return catalogName; + } + + public void setCatalogName(String catalogName) { + this.catalogName = catalogName; + } + + @DatabaseChangeProperty(mustEqualExisting ="primaryKey.schema") + public String getSchemaName() { + return schemaName; + } + + public void setSchemaName(String schemaName) { + this.schemaName = schemaName; + } + + @DatabaseChangeProperty(mustEqualExisting = "primaryKey.table", description = "Name of the table to drop the primary key of") + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + @DatabaseChangeProperty(mustEqualExisting = "primaryKey", description = "Name of the primary key") + public String getConstraintName() { + return constraintName; + } + + public void setConstraintName(String constraintName) { + this.constraintName = constraintName; + } + + @Override + public String getSerializedObjectNamespace() { + return STANDARD_CHANGELOG_NAMESPACE; + } +}