package liquibase.database.typeconversion.core; import liquibase.database.Database; import liquibase.database.core.InformixDatabase; import liquibase.database.structure.type.*; import java.util.regex.Pattern; public class InformixTypeConverter extends AbstractTypeConverter { public int getPriority() { return PRIORITY_DATABASE; } public boolean supports(Database database) { return database instanceof InformixDatabase; } private static final Pattern INTEGER_PATTERN = Pattern.compile("^(int(eger)?)$", Pattern.CASE_INSENSITIVE); private static final Pattern INTEGER8_PATTERN = Pattern.compile("^(int(eger)?8)$", Pattern.CASE_INSENSITIVE); private static final Pattern SERIAL_PATTERN = Pattern.compile("^(serial)(\\s*\\(\\d+\\)|)$", Pattern.CASE_INSENSITIVE); private static final Pattern SERIAL8_PATTERN = Pattern.compile("^(serial8)(\\s*\\(\\d+\\)|)$", Pattern.CASE_INSENSITIVE); private static final String INTERVAL_FIELD_QUALIFIER = "HOUR TO FRACTION(5)"; private static final String DATETIME_FIELD_QUALIFIER = "YEAR TO FRACTION(5)"; @Override public DataType getDataType(String columnTypeString, Boolean autoIncrement) { DataType type = super.getDataType(columnTypeString, autoIncrement); if (autoIncrement != null && autoIncrement) { if (isSerial(type)) { return new CustomType("SERIAL",0,0); } else if (isSerial8(type)) { return new CustomType("SERIAL8",0,0); } else { throw new IllegalArgumentException("Unknown autoincrement type: " + columnTypeString); } } return type; } private boolean isSerial(DataType type) { return INTEGER_PATTERN.matcher(type.getDataTypeName()).matches() || SERIAL_PATTERN.matcher(type.getDataTypeName()).matches(); } private boolean isSerial8(DataType type) { return INTEGER8_PATTERN.matcher(type.getDataTypeName()).matches() || SERIAL8_PATTERN.matcher(type.getDataTypeName()).matches() || "BIGINT".equalsIgnoreCase(type.getDataTypeName()); } @Override public BooleanType getBooleanType() { return new BooleanType() { @Override public String getTrueBooleanValue() { return "'t'"; } @Override public String getFalseBooleanValue() { return "'f'"; } }; } @Override public TextType getTextType() { return new TextType("TEXT", 0, 0); } @Override public BigIntType getBigIntType() { return new BigIntType("INT8"); } @Override public CurrencyType getCurrencyType() { return new CurrencyType("MONEY"); } @Override public DateTimeType getDateTimeType() { return new DateTimeType("DATETIME " + DATETIME_FIELD_QUALIFIER); } @Override public TimeType getTimeType() { return new TimeType("INTERVAL " + INTERVAL_FIELD_QUALIFIER); } }