liquibase.change.core.LoadUpdateDataChange Maven / Gradle / Ivy
package liquibase.change.core;
import liquibase.database.Database;
import liquibase.database.typeconversion.TypeConverterFactory;
import liquibase.exception.RollbackImpossibleException;
import liquibase.exception.UnsupportedChangeException;
import liquibase.exception.LiquibaseException;
import liquibase.statement.SqlStatement;
import liquibase.statement.core.DeleteStatement;
import liquibase.statement.core.InsertOrUpdateStatement;
import liquibase.statement.core.InsertStatement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class LoadUpdateDataChange extends LoadDataChange {
private String primaryKey;
@Override
public SqlStatement[] generateStatements(Database database) {
return super.generateStatements(database); //To change body of overridden methods use File | Settings | File Templates.
}
public LoadUpdateDataChange() {
super("loadUpdateData", "Smart Load Data");
}
public void setPrimaryKey(String primaryKey) throws LiquibaseException {
if (primaryKey == null) {
throw new LiquibaseException("primaryKey cannot be null.");
}
this.primaryKey = primaryKey;
}
public String getPrimaryKey() {
return primaryKey;
}
@Override
protected InsertStatement createStatement(String schemaName, String tableName) {
return new InsertOrUpdateStatement(schemaName, tableName, this.primaryKey);
}
@Override
public SqlStatement[] generateRollbackStatements(Database database) throws UnsupportedChangeException, RollbackImpossibleException {
List statements = new ArrayList();
SqlStatement[] forward = this.generateStatements(database);
for(SqlStatement thisForward: forward){
InsertOrUpdateStatement thisInsert = (InsertOrUpdateStatement)thisForward;
DeleteStatement delete = new DeleteStatement(getSchemaName(),getTableName());
delete.setWhereClause(getWhereClause(thisInsert,database));
statements.add(delete);
}
return statements.toArray(new SqlStatement[statements.size()]);
}
private String getWhereClause(InsertOrUpdateStatement insertOrUpdateStatement, Database database) {
StringBuffer where = new StringBuffer();
String[] pkColumns = insertOrUpdateStatement.getPrimaryKey().split(",");
for(String thisPkColumn:pkColumns)
{
where.append(database.escapeColumnName(insertOrUpdateStatement.getSchemaName(), insertOrUpdateStatement.getTableName(), thisPkColumn) + " = " );
Object newValue = insertOrUpdateStatement.getColumnValues().get(thisPkColumn);
if (newValue == null || newValue.toString().equals("NULL")) {
where.append("NULL");
} else if (newValue instanceof String && database.shouldQuoteValue(((String) newValue))) {
where.append("'").append(database.escapeStringForDatabase((String) newValue)).append("'");
} else if (newValue instanceof Date) {
where.append(database.getDateLiteral(((Date) newValue)));
} else if (newValue instanceof Boolean) {
if (((Boolean) newValue)) {
where.append(TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType().getTrueBooleanValue());
} else {
where.append(TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType().getFalseBooleanValue());
}
} else {
where.append(newValue);
}
where.append(" AND ");
}
where.delete(where.lastIndexOf(" AND "),where.lastIndexOf(" AND ") + " AND ".length());
return where.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy