package liquibase.database.typeconversion.core;
import liquibase.database.Database;
import liquibase.database.core.MSSQLDatabase;
import liquibase.database.structure.type.*;
import java.text.ParseException;
public class MSSQLTypeConverter extends AbstractTypeConverter {
public int getPriority() {
return PRIORITY_DATABASE;
}
public boolean supports(Database database) {
return database instanceof MSSQLDatabase;
}
@Override
public Object convertDatabaseValueToObject(Object defaultValue, int dataType, int columnSize, int decimalDigits, Database database) throws ParseException {
if (defaultValue == null) {
return null;
}
if (defaultValue instanceof String) {
if (((String) defaultValue).startsWith("('")) {
defaultValue = ((String) defaultValue).replaceFirst("^\\('", "").replaceFirst("'\\)$", "");
} else if (((String) defaultValue).startsWith("((")) {
defaultValue = ((String) defaultValue).replaceFirst("^\\(\\(", "").replaceFirst("\\)\\)$", "");
}
}
defaultValue = super.convertDatabaseValueToObject(defaultValue, dataType, columnSize, decimalDigits, database);
return defaultValue;
}
@Override
public DataType getDataType(String columnTypeString, Boolean autoIncrement) {
// System.out.println("IN :columnTypeString=" +columnTypeString +", autoIncrement=" +autoIncrement);
if (columnTypeString.toLowerCase().endsWith("() identity")) {
columnTypeString = columnTypeString.replaceFirst("\\(\\) identity$", "");
autoIncrement = true;
}
if (columnTypeString.toLowerCase().endsWith(" identity")) {
columnTypeString = columnTypeString.replaceFirst(" identity$", "");
autoIncrement = true;
}
if (columnTypeString.equalsIgnoreCase("varbinary(2147483647)")){
columnTypeString = "varbinary(max)";
}
return super.getDataType(columnTypeString, autoIncrement);
}
@Override
protected DataType getDataType(String columnTypeString, Boolean autoIncrement, String dataTypeName, String precision, String additionalInformation) {
if (columnTypeString.endsWith(" identity")) {
columnTypeString = columnTypeString.replaceFirst(" identity$", "");
autoIncrement = true;
}
if (columnTypeString.equalsIgnoreCase("varbinary") && (precision==null || Long.valueOf(precision) > 8000)) {
precision = "max";
}
// Try to define data type by searching of common standard types
DataType returnTypeName = super.getDataType(columnTypeString, autoIncrement, dataTypeName, precision, additionalInformation);
// If we found CustomType (it means - nothing compatible) then search for oracle types
if (returnTypeName instanceof CustomType) {
boolean returnTypeChanged=false;
if (columnTypeString.toUpperCase().startsWith("NVARCHAR")) {
returnTypeName = new NVarcharType();
returnTypeChanged=true;
} else if(columnTypeString.toUpperCase().startsWith("NCHAR")) {
returnTypeName= new CharType("NCHAR");
returnTypeChanged=true;
}
if(returnTypeChanged)
addPrecisionToType(precision, returnTypeName);
}
return returnTypeName;
}
@Override
public DateType getDateType() {
return new DateType("SMALLDATETIME");
}
@Override
public TimeType getTimeType() {
return new TimeType("DATETIME");
}
@Override
public BooleanType getBooleanType() {
return new BooleanType.NumericBooleanType("BIT");
}
@Override
public CurrencyType getCurrencyType() {
return new CurrencyType("MONEY");
}
@Override
public UUIDType getUUIDType() {
return new UUIDType("UNIQUEIDENTIFIER");
}
@Override
public ClobType getClobType() {
return new ClobType("NVARCHAR(MAX)");
}
@Override
public BlobType getBlobType() {
return new BlobType("VARBINARY(MAX)");
}
@Override
public NumberType getNumberType() {
return new NumberType("NUMERIC");
}
@Override
public DoubleType getDoubleType() {
return new DoubleType("FLOAT");
}
}