package liquibase.datatype.core;
import liquibase.database.Database;
import liquibase.database.core.DB2Database;
import liquibase.database.core.MSSQLDatabase;
import liquibase.database.core.MySQLDatabase;
import liquibase.database.core.OracleDatabase;
import liquibase.datatype.DatabaseDataType;
import liquibase.datatype.LiquibaseDataType;
import liquibase.statement.DatabaseFunction;
import java.util.Arrays;
import java.util.Collections;
public class UnknownType extends LiquibaseDataType {
public UnknownType() {
super("UNKNOWN", 0, 2);
}
public UnknownType(String name) {
super(name, 0, 2);
}
public UnknownType(String name, int minParameters, int maxParameters) {
super(name, minParameters, maxParameters);
}
private boolean autoIncrement;
public boolean isAutoIncrement() {
return autoIncrement;
}
public void setAutoIncrement(boolean autoIncrement) {
this.autoIncrement = autoIncrement;
}
@Override
public DatabaseDataType toDatabaseDataType(Database database) {
int dataTypeMaxParameters;
if (getName().equalsIgnoreCase("enum") || getName().equalsIgnoreCase("set")) {
dataTypeMaxParameters = Integer.MAX_VALUE;
} else {
dataTypeMaxParameters = database.getDataTypeMaxParameters(getName());
}
Object[] parameters = getParameters();
if (database instanceof OracleDatabase) {
if (getName().equalsIgnoreCase("LONG")
|| getName().equalsIgnoreCase("BFILE")
|| getName().equalsIgnoreCase("ROWID")
|| getName().equalsIgnoreCase("ANYDATA")
|| getName().equalsIgnoreCase("SDO_GEOMETRY")
) {
parameters = new Object[0];
} else if (getName().equalsIgnoreCase("RAW")) {
return new DatabaseDataType(getName(), parameters);
} else if (getName().toUpperCase().startsWith("INTERVAL ")) {
return new DatabaseDataType(getName().replaceAll("\\(\\d+\\)", ""));
} else { //probably a user defined type. Can't call getUserDefinedTypes() to know for sure, since that returns all types including system types.
return new DatabaseDataType(getName().toUpperCase());
}
}
if (dataTypeMaxParameters < parameters.length) {
parameters = Arrays.copyOfRange(parameters, 0, dataTypeMaxParameters);
}
DatabaseDataType type;
if (database instanceof MSSQLDatabase) {
type = new DatabaseDataType(database.escapeDataTypeName(getName()), parameters);
} else {
type = new DatabaseDataType(getName().toUpperCase(), parameters);
}
type.addAdditionalInformation(getAdditionalInformation());
return type;
}
@Override
public String objectToSql(Object value, Database database) {
if (value instanceof DatabaseFunction) {
return super.objectToSql(value, database);
} else {
return "'"+super.objectToSql(value, database)+"'";
}
}
}