package org.ovirt.engine.core.dao; import java.sql.Types; import java.util.Arrays; import java.util.Collection; import org.dbunit.dataset.datatype.DataType; import org.dbunit.dataset.datatype.DataTypeException; import org.dbunit.dataset.datatype.DefaultDataTypeFactory; import org.dbunit.ext.postgresql.GenericEnumType; import org.dbunit.ext.postgresql.InetType; import org.dbunit.ext.postgresql.IntervalType; import org.dbunit.ext.postgresql.PostgresqlDataTypeFactory; import org.dbunit.ext.postgresql.UuidType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PostgresDataTypeFactory extends DefaultDataTypeFactory { private static final Logger logger = LoggerFactory.getLogger(PostgresqlDataTypeFactory.class); private static final Collection<String> DATABASE_PRODUCTS = Arrays.asList(new String[] { "PostgreSQL" }); @Override public Collection<String> getValidDbProducts() { return DATABASE_PRODUCTS; } @Override public DataType createDataType(int sqlType, String sqlTypeName) throws DataTypeException { logger.debug("createDataType(sqlType={}, sqlTypeName={})", String.valueOf(sqlType), sqlTypeName); if (sqlType == Types.OTHER) // Treat Postgresql UUID types as VARCHARS if ("uuid".equals(sqlTypeName)) return new UuidType(); // Intervals are custom types else if ("interval".equals(sqlTypeName)) return new IntervalType(); else if ("inet".equals(sqlTypeName)) return new InetType(); else { // Finally check whether the user defined a custom datatype if (isEnumType(sqlTypeName)) { if (logger.isDebugEnabled()) logger.debug("Custom enum type used for sqlTypeName {} (sqlType '{}')", new Object[] { sqlTypeName, new Integer(sqlType) }); return new GenericEnumType(sqlTypeName); } } return super.createDataType(sqlType, sqlTypeName); } /** * Returns a data type for the given sql type name if the user wishes one. <b>Designed to be overridden by custom * implementations extending this class.</b> Override this method if you have a custom enum type in the database and * want to map it via dbunit. * * @param sqlTypeName * The sql type name for which users can specify a custom data type. * @return <code>null</code> if the given type name is not a custom type which is the default implementation. * @since 2.4.6 */ public boolean isEnumType(String sqlTypeName) { return false; } }