Skip to content

Commit

Permalink
split DropPrimaryKeyChange
Browse files Browse the repository at this point in the history
  • Loading branch information
hwellmann committed Dec 8, 2014
1 parent 0a5d4ba commit d1ac3d9
Show file tree
Hide file tree
Showing 7 changed files with 238 additions and 175 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
Expand Down
@@ -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<DropPrimaryKeyChange> {

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<SqlStatement> statements = new ArrayList<SqlStatement>();

// 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();
}
}

This file was deleted.

Expand Up @@ -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;
Expand Down Expand Up @@ -44,8 +44,8 @@ public Class<? extends DatabaseObject>[] 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());
Expand All @@ -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());
}

Expand All @@ -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 };
}
}

0 comments on commit d1ac3d9

Please sign in to comment.