/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ngrinder.infra.init;
import liquibase.database.Database;
import liquibase.database.core.CUBRIDDatabase;
import liquibase.database.core.CacheDatabase;
import liquibase.database.core.DB2Database;
import liquibase.database.core.DerbyDatabase;
import liquibase.database.core.H2Database;
import liquibase.database.core.HsqlDatabase;
import liquibase.database.core.InformixDatabase;
import liquibase.database.core.MSSQLDatabase;
import liquibase.database.core.MaxDBDatabase;
import liquibase.database.core.MySQLDatabase;
import liquibase.database.core.OracleDatabase;
import liquibase.database.core.SybaseASADatabase;
import liquibase.database.core.SybaseDatabase;
import liquibase.database.typeconversion.TypeConverterFactory;
import liquibase.exception.ValidationErrors;
import liquibase.exception.Warnings;
import liquibase.sql.Sql;
import liquibase.sql.UnparsedSql;
import liquibase.sqlgenerator.SqlGeneratorChain;
import liquibase.sqlgenerator.core.AbstractSqlGenerator;
import liquibase.statement.core.ModifyDataTypeStatement;
/**
* Modify Column type sql generator. Modified to support Cubrid.
*
* @since 3.1.1
* @author JunHo Yoon
*/
public class ModifyDataTypeExGenerator extends AbstractSqlGenerator<ModifyDataTypeStatement> {
/*
* (non-Javadoc)
*
* @see liquibase.sqlgenerator.core.AbstractSqlGenerator#warn(liquibase.statement.SqlStatement,
* liquibase.database.Database, liquibase.sqlgenerator.SqlGeneratorChain)
*/
@Override
public Warnings warn(ModifyDataTypeStatement modifyDataTypeStatement, Database database,
SqlGeneratorChain sqlGeneratorChain) {
Warnings warnings = super.warn(modifyDataTypeStatement, database, sqlGeneratorChain);
if (database instanceof MySQLDatabase
&& !modifyDataTypeStatement.getNewDataType().toLowerCase().contains("varchar")) {
warnings.addWarning("modifyDataType will lose primary key/autoincrement/not null settings for mysql."
+ " Use <sql> and re-specify all configuration if this is the case");
}
return warnings;
}
/*
* (non-Javadoc)
*
* @see liquibase.sqlgenerator.SqlGenerator#validate(liquibase.statement.SqlStatement,
* liquibase.database.Database, liquibase.sqlgenerator.SqlGeneratorChain)
*/
@Override
public ValidationErrors validate(ModifyDataTypeStatement statement, Database database,
SqlGeneratorChain sqlGeneratorChain) {
ValidationErrors validationErrors = new ValidationErrors();
validationErrors.checkRequiredField("tableName", statement.getTableName());
validationErrors.checkRequiredField("columnName", statement.getColumnName());
validationErrors.checkRequiredField("newDataType", statement.getNewDataType());
return validationErrors;
}
/*
* (non-Javadoc)
*
* @see liquibase.sqlgenerator.SqlGenerator#generateSql(liquibase.statement.SqlStatement,
* liquibase.database.Database, liquibase.sqlgenerator.SqlGeneratorChain)
*/
@Override
public Sql[] generateSql(ModifyDataTypeStatement statement, Database database, SqlGeneratorChain chain) {
String alterTable = "ALTER TABLE "
+ database.escapeTableName(statement.getSchemaName(), statement.getTableName());
// add "MODIFY"
alterTable += " " + getModifyString(database) + " ";
// add column name
alterTable += database.escapeColumnName(statement.getSchemaName(), statement.getTableName(),
statement.getColumnName());
alterTable += getPreDataTypeString(database); // adds a space if nothing else
// add column type
alterTable += TypeConverterFactory.getInstance().findTypeConverter(database)
.getDataType(statement.getNewDataType(), false);
return new Sql[] { new UnparsedSql(alterTable) };
}
private String getModifyString(Database database) {
if (database instanceof CUBRIDDatabase || database instanceof SybaseASADatabase
|| database instanceof SybaseDatabase || database instanceof MySQLDatabase
|| database instanceof OracleDatabase || database instanceof MaxDBDatabase
|| database instanceof InformixDatabase) {
return "MODIFY";
} else {
return "ALTER COLUMN";
}
}
private String getPreDataTypeString(Database database) {
if (database instanceof DerbyDatabase || database instanceof DB2Database) {
return " SET DATA TYPE ";
} else if (database instanceof CUBRIDDatabase || database instanceof SybaseASADatabase
|| database instanceof SybaseDatabase || database instanceof MSSQLDatabase
|| database instanceof MySQLDatabase || database instanceof HsqlDatabase
|| database instanceof H2Database || database instanceof CacheDatabase
|| database instanceof OracleDatabase || database instanceof MaxDBDatabase
|| database instanceof InformixDatabase) {
return " ";
} else {
return " TYPE ";
}
}
}