package liquibase.datatype.core; 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.util.StringUtils; @DataTypeInfo(name = "xml", aliases = { "xmltype", "java.sql.Types.SQLXML" }, minParameters = 0, maxParameters = 1, priority = LiquibaseDataType.PRIORITY_DEFAULT) public class XMLType extends LiquibaseDataType { @Override protected String otherToSql(Object value, Database database) { if (value == null) { return null; } String val = value.toString(); if (database instanceof MSSQLDatabase && !StringUtils.isAscii(val)) { return "N'" + database.escapeStringForDatabase(val) + "'"; } else if (database instanceof PostgresDatabase) { try { if (database.getDatabaseMajorVersion() <= 7 // 8.2 or earlier || (database.getDatabaseMajorVersion() == 8 && database.getDatabaseMinorVersion() <= 2)) { return "'" + database.escapeStringForDatabase(val) + "'"; } } catch (DatabaseException ignore) { } // assuming it is a newer version return "xml '" + database.escapeStringForDatabase(val) + "'"; } else if (database instanceof OracleDatabase) { return "XMLType('" + database.escapeStringForDatabase(val) + "')"; } return "'" + database.escapeStringForDatabase(val) + "'"; } @Override public DatabaseDataType toDatabaseDataType(Database database) { if (database instanceof MSSQLDatabase) { try { if (database.getDatabaseMajorVersion() <= 8) { // 2000 or earlier return new DatabaseDataType(database.escapeDataTypeName("ntext")); } } catch (DatabaseException ignore) { } // assuming it is a newer version Object[] parameters = getParameters(); if (parameters.length > 1) { parameters = new Object[] { parameters[0] }; } return new DatabaseDataType(database.escapeDataTypeName("xml"), parameters); } else if (database instanceof PostgresDatabase) { try { if (database.getDatabaseMajorVersion() <= 7 // 8.2 or earlier || (database.getDatabaseMajorVersion() == 8 && database.getDatabaseMinorVersion() <= 2)) { return new DatabaseDataType("TEXT"); } } catch (DatabaseException ignore) { } // assuming it is a newer version return new DatabaseDataType("XML"); } else if (database instanceof DB2Database) { return new DatabaseDataType("XML"); } else if (database instanceof OracleDatabase) { return new DatabaseDataType("XMLTYPE"); } else 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 MySQLDatabase) { return new DatabaseDataType("LONGTEXT"); } else if (database instanceof H2Database || database instanceof HsqlDatabase || database instanceof InformixDatabase) { return new DatabaseDataType("CLOB"); } else if (database instanceof SQLiteDatabase || database instanceof SybaseDatabase) { return new DatabaseDataType("TEXT"); } return super.toDatabaseDataType(database); } }