//
|
// Source code recreated from a .class file by IntelliJ IDEA
|
// (powered by FernFlower decompiler)
|
//
|
|
package liquibase.datatype.core;
|
|
import java.util.Locale;
|
|
import dm.jdbc.util.StringUtil;
|
import liquibase.change.core.LoadDataChange.LOAD_DATA_TYPE;
|
import liquibase.database.Database;
|
import liquibase.database.core.DmDatabase;
|
import liquibase.database.core.*;
|
import liquibase.datatype.DataTypeInfo;
|
import liquibase.datatype.DatabaseDataType;
|
import liquibase.datatype.LiquibaseDataType;
|
import liquibase.exception.UnexpectedLiquibaseException;
|
import liquibase.statement.DatabaseFunction;
|
|
@DataTypeInfo(
|
name = "boolean",
|
aliases = {"java.sql.Types.BOOLEAN", "java.lang.Boolean", "bit", "bool"},
|
minParameters = 0,
|
maxParameters = 0,
|
priority = 1
|
)
|
public class BooleanType extends LiquibaseDataType {
|
public BooleanType() {
|
}
|
|
public DatabaseDataType toDatabaseDataType(Database database) {
|
String originalDefinition = StringUtil.trimToEmpty(getRawDefinition());
|
if ((database instanceof FirebirdDatabase)) {
|
return new DatabaseDataType("BOOLEAN");
|
}
|
|
if ((database instanceof AbstractDb2Database) || (database instanceof FirebirdDatabase)) {
|
return new DatabaseDataType("SMALLINT");
|
} else if (database instanceof MSSQLDatabase) {
|
return new DatabaseDataType(database.escapeDataTypeName("bit"));
|
} else if (database instanceof MySQLDatabase) {
|
if (originalDefinition.toLowerCase(Locale.US).startsWith("bit")) {
|
return new DatabaseDataType("BIT", getParameters());
|
}
|
return new DatabaseDataType("BIT", 1);
|
} else if (database instanceof OracleDatabase) {
|
return new DatabaseDataType("NUMBER", 1);
|
} else if ((database instanceof SybaseASADatabase) || (database instanceof SybaseDatabase)) {
|
return new DatabaseDataType("BIT");
|
} else if (database instanceof DerbyDatabase) {
|
if (((DerbyDatabase) database).supportsBooleanDataType()) {
|
return new DatabaseDataType("BOOLEAN");
|
} else {
|
return new DatabaseDataType("SMALLINT");
|
}
|
} else if (database.getClass().isAssignableFrom(DB2Database.class)) {
|
return new DatabaseDataType("SMALLINT");
|
} else if (database instanceof HsqlDatabase) {
|
return new DatabaseDataType("BOOLEAN");
|
} else if (database instanceof PostgresDatabase) {
|
if (originalDefinition.toLowerCase(Locale.US).startsWith("bit")) {
|
return new DatabaseDataType("BIT", getParameters());
|
}
|
} else if(database instanceof DmDatabase) {
|
return new DatabaseDataType("bit");
|
}
|
|
return super.toDatabaseDataType(database);
|
}
|
|
public String objectToSql(Object value, Database database) {
|
if (value != null && !"null".equals(value.toString().toLowerCase(Locale.US))) {
|
String returnValue;
|
if (value instanceof String) {
|
value = ((String)value).replaceAll("'", "");
|
if (!"true".equals(((String)value).toLowerCase(Locale.US)) && !"1".equals(value) && !"b'1'".equals(((String)value).toLowerCase(Locale.US)) && !"t".equals(((String)value).toLowerCase(Locale.US)) && !((String)value).toLowerCase(Locale.US).equals(this.getTrueBooleanValue(database).toLowerCase(Locale.US))) {
|
if (!"false".equals(((String)value).toLowerCase(Locale.US)) && !"0".equals(value) && !"b'0'".equals(((String)value).toLowerCase(Locale.US)) && !"f".equals(((String)value).toLowerCase(Locale.US)) && !((String)value).toLowerCase(Locale.US).equals(this.getFalseBooleanValue(database).toLowerCase(Locale.US))) {
|
throw new UnexpectedLiquibaseException("Unknown boolean value: " + value);
|
}
|
|
returnValue = this.getFalseBooleanValue(database);
|
} else {
|
returnValue = this.getTrueBooleanValue(database);
|
}
|
} else if (value instanceof Long) {
|
if (Long.valueOf(1L).equals(value)) {
|
returnValue = this.getTrueBooleanValue(database);
|
} else {
|
returnValue = this.getFalseBooleanValue(database);
|
}
|
} else if (value instanceof Number) {
|
if (!value.equals(1) && !"1".equals(value.toString()) && !"1.0".equals(value.toString())) {
|
returnValue = this.getFalseBooleanValue(database);
|
} else {
|
returnValue = this.getTrueBooleanValue(database);
|
}
|
} else {
|
if (value instanceof DatabaseFunction) {
|
return value.toString();
|
}
|
|
if (!(value instanceof Boolean)) {
|
throw new UnexpectedLiquibaseException("Cannot convert type " + value.getClass() + " to a boolean value");
|
}
|
|
if ((Boolean)value) {
|
returnValue = this.getTrueBooleanValue(database);
|
} else {
|
returnValue = this.getFalseBooleanValue(database);
|
}
|
}
|
|
return returnValue;
|
} else {
|
return null;
|
}
|
}
|
|
protected boolean isNumericBoolean(Database database) {
|
if (database instanceof DerbyDatabase) {
|
return !((DerbyDatabase) database).supportsBooleanDataType();
|
}
|
return (database instanceof Db2zDatabase) || (database instanceof DB2Database) || (database instanceof FirebirdDatabase) || (database instanceof
|
MSSQLDatabase) || (database instanceof MySQLDatabase) || (database instanceof OracleDatabase) ||
|
(database instanceof SQLiteDatabase) || (database instanceof SybaseASADatabase) || (database instanceof
|
SybaseDatabase) || (database instanceof DmDatabase);
|
}
|
|
public String getFalseBooleanValue(Database database) {
|
if (this.isNumericBoolean(database)) {
|
return "0";
|
} else {
|
return database instanceof InformixDatabase ? "'f'" : "FALSE";
|
}
|
}
|
|
public String getTrueBooleanValue(Database database) {
|
if (this.isNumericBoolean(database)) {
|
return "1";
|
} else {
|
return database instanceof InformixDatabase ? "'t'" : "TRUE";
|
}
|
}
|
|
public LOAD_DATA_TYPE getLoadTypeName() {
|
return LOAD_DATA_TYPE.BOOLEAN;
|
}
|
}
|