package liquibase.datatype.core;
import liquibase.configuration.GlobalConfiguration;
import liquibase.configuration.LiquibaseConfiguration;
import liquibase.database.Database;
import liquibase.database.core.*;
import liquibase.datatype.DataTypeInfo;
import liquibase.datatype.DatabaseDataType;
import liquibase.datatype.LiquibaseDataType;
import liquibase.exception.DatabaseException;
import liquibase.statement.DatabaseFunction;
import liquibase.util.StringUtils;
@DataTypeInfo(name = "clob", aliases = {"longvarchar", "text", "longtext", "java.sql.Types.LONGVARCHAR", "java.sql.Types.CLOB", "nclob", "longnvarchar", "ntext", "java.sql.Types.LONGNVARCHAR", "java.sql.Types.NCLOB", "tinytext", "mediumtext"}, minParameters = 0, maxParameters = 0, priority = LiquibaseDataType.PRIORITY_DEFAULT)
public class ClobType extends LiquibaseDataType {
@Override
public String objectToSql(Object value, Database database) {
if (value == null || value.toString().equalsIgnoreCase("null")) {
return null;
}
if (value instanceof DatabaseFunction) {
return value.toString();
}
String val = String.valueOf(value);
// postgres type character varying gets identified as a char type
// simple sanity check to avoid double quoting a value
if (val.startsWith("'")) {
return val;
} else {
if (database instanceof MSSQLDatabase && !StringUtils.isAscii(val)) {
return "N'" + database.escapeStringForDatabase(val) + "'";
}
return "'" + database.escapeStringForDatabase(val) + "'";
}
}
@Override
public DatabaseDataType toDatabaseDataType(Database database) {
String originalDefinition = StringUtils.trimToEmpty(getRawDefinition());
if (database instanceof MSSQLDatabase) {
if (!LiquibaseConfiguration.getInstance().getProperty(GlobalConfiguration.class, GlobalConfiguration.CONVERT_DATA_TYPES).getValue(Boolean.class) && originalDefinition.toLowerCase().startsWith("text")) {
DatabaseDataType type = new DatabaseDataType(database.escapeDataTypeName("text"));
type.addAdditionalInformation(getAdditionalInformation());
return type;
}
}
if (database instanceof FirebirdDatabase) {
return new DatabaseDataType("BLOB SUB_TYPE TEXT");
} else if (database instanceof SybaseASADatabase) {
return new DatabaseDataType("LONG VARCHAR");
} else if (database instanceof MSSQLDatabase) {
if (originalDefinition.equalsIgnoreCase("text")
|| originalDefinition.equals("[text]")
|| originalDefinition.matches("(?i)text .+")
|| originalDefinition.matches("\\[text\\] .+")) {
DatabaseDataType type = new DatabaseDataType(database.escapeDataTypeName("text"));
type.addAdditionalInformation(getAdditionalInformation());
return type;
}
if (originalDefinition.toLowerCase().startsWith("ntext")
|| originalDefinition.toLowerCase().startsWith("[ntext]")) {
DatabaseDataType type = new DatabaseDataType(database.escapeDataTypeName("ntext"));
type.addAdditionalInformation(getAdditionalInformation());
return type;
}
if (originalDefinition.equalsIgnoreCase("nclob")) {
try {
if (database.getDatabaseMajorVersion() <= 8) { //2000 or earlier
DatabaseDataType type = new DatabaseDataType(database.escapeDataTypeName("ntext"));
type.addAdditionalInformation(getAdditionalInformation());
return type;
}
} catch (DatabaseException ignore) {
} //assuming it is a newer version
return new DatabaseDataType(database.escapeDataTypeName("nvarchar"), "MAX");
}
try {
if (database.getDatabaseMajorVersion() <= 8) { //2000 or earlier
DatabaseDataType type = new DatabaseDataType(database.escapeDataTypeName("text"));
type.addAdditionalInformation(getAdditionalInformation());
return type;
}
} catch (DatabaseException ignore) {
} //assuming it is a newer version
return new DatabaseDataType(database.escapeDataTypeName("varchar"), "MAX");
} else if (database instanceof MySQLDatabase) {
if (originalDefinition.toLowerCase().startsWith("text")) {
return new DatabaseDataType("TEXT");
} else if (originalDefinition.toLowerCase().startsWith("tinytext")) {
return new DatabaseDataType("TINYTEXT");
} else if (originalDefinition.toLowerCase().startsWith("mediumtext")) {
return new DatabaseDataType("MEDIUMTEXT");
} else if (originalDefinition.toLowerCase().startsWith("nclob")) {
DatabaseDataType type = new DatabaseDataType("LONGTEXT");
type.addAdditionalInformation("CHARACTER SET utf8");
return type;
} else {
return new DatabaseDataType("LONGTEXT");
}
} else if (database instanceof H2Database || database instanceof HsqlDatabase) {
if (originalDefinition.toLowerCase().startsWith("longvarchar") || originalDefinition.startsWith("java.sql.Types.LONGVARCHAR")) {
return new DatabaseDataType("LONGVARCHAR");
} else {
return new DatabaseDataType("CLOB");
}
} else if (database instanceof PostgresDatabase || database instanceof SQLiteDatabase || database instanceof SybaseDatabase) {
return new DatabaseDataType("TEXT");
} else if (database instanceof OracleDatabase) {
if (originalDefinition.equalsIgnoreCase("nclob")) {
return new DatabaseDataType("NCLOB");
}
return new DatabaseDataType("CLOB");
} else if (database instanceof InformixDatabase) {
if (originalDefinition.toLowerCase().startsWith("text")) {
return new DatabaseDataType("TEXT");
}
}
return super.toDatabaseDataType(database);
}
//sqlite
// } else if (columnTypeString.equals("TEXT") ||
// columnTypeString.toLowerCase(Locale.ENGLISH).contains("uuid") ||
// columnTypeString.toLowerCase(Locale.ENGLISH).contains("uniqueidentifier") ||
// columnTypeString.toLowerCase(Locale.ENGLISH).equals("uniqueidentifier") ||
// columnTypeString.toLowerCase(Locale.ENGLISH).equals("datetime") ||
// columnTypeString.toLowerCase(Locale.ENGLISH).contains("timestamp") ||
// columnTypeString.toLowerCase(Locale.ENGLISH).contains("char") ||
// columnTypeString.toLowerCase(Locale.ENGLISH).contains("clob") ||
// columnTypeString.toLowerCase(Locale.ENGLISH).contains("text")) {
// type = new CustomType("TEXT",0,0);
}