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.util.StringUtils;
@DataTypeInfo(name = "timestamp", aliases = {"java.sql.Types.TIMESTAMP", "java.sql.Timestamp", "timestamptz"}, minParameters = 0, maxParameters = 1, priority = LiquibaseDataType.PRIORITY_DEFAULT)
public class TimestampType extends DateTimeType {
@Override
public DatabaseDataType toDatabaseDataType(Database database) {
String originalDefinition = StringUtils.trimToEmpty(getRawDefinition());
if (database instanceof MySQLDatabase) {
if (getRawDefinition().contains(" ") || getRawDefinition().contains("(")) {
return new DatabaseDataType(getRawDefinition());
}
return super.toDatabaseDataType(database);
}
if (database instanceof MSSQLDatabase) {
if (!LiquibaseConfiguration.getInstance().getProperty(GlobalConfiguration.class, GlobalConfiguration.CONVERT_DATA_TYPES).getValue(Boolean.class) && originalDefinition.toLowerCase().startsWith("timestamp")) {
return new DatabaseDataType(database.escapeDataTypeName("timestamp"));
}
return new DatabaseDataType(database.escapeDataTypeName("datetime"));
}
if (database instanceof SybaseDatabase) {
return new DatabaseDataType(database.escapeDataTypeName("datetime"));
}
if (database instanceof DB2Database) {
Object[] parameters = getParameters();
if (parameters != null && parameters.length > 1) {
parameters = new Object[] {parameters[1]};
}
return new DatabaseDataType(database.escapeDataTypeName("timestamp"), parameters);
}
if (getAdditionalInformation() != null
&& (database instanceof PostgresDatabase
|| database instanceof OracleDatabase)
|| database instanceof HsqlDatabase){
DatabaseDataType type = new DatabaseDataType("TIMESTAMP");
String additionalInformation = this.getAdditionalInformation();
if (additionalInformation != null && database instanceof PostgresDatabase) {
if (additionalInformation.toUpperCase().contains("TIMEZONE")) {
additionalInformation = additionalInformation.toUpperCase().replace("TIMEZONE", "TIME ZONE");
}
}
type.addAdditionalInformation(additionalInformation);
return type;
}
return super.toDatabaseDataType(database);
}
}