From: Aron Roberts Date: Tue, 27 Mar 2012 01:05:26 +0000 (-0700) Subject: CSPACE-4928: Slightly generalized how logical datatypes are configured, when modifyin... X-Git-Url: https://git.aero2k.de/?a=commitdiff_plain;h=1506536be99bdda5e1324be7b18d054385470cac;p=tmp%2Fjakarta-migration.git CSPACE-4928: Slightly generalized how logical datatypes are configured, when modifying datatypes for database columns during post-init process. Did this otherwise long-intended cleanup in part to experiment with setting date-only datatypes. Dates are stored correctly in the database as date-only, but are still returned with timestamps in UTC, without additional changes to services code. --- diff --git a/services/common/src/main/java/org/collectionspace/services/common/init/ModifyFieldDatatypes.java b/services/common/src/main/java/org/collectionspace/services/common/init/ModifyFieldDatatypes.java index 328cadfa2..c575579a7 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/init/ModifyFieldDatatypes.java +++ b/services/common/src/main/java/org/collectionspace/services/common/init/ModifyFieldDatatypes.java @@ -26,7 +26,10 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.sql.DataSource; @@ -105,23 +108,37 @@ public class ModifyFieldDatatypes extends InitHandler implements IInitHandler { } } - // TODO: Consider refactoring this method to a general-purpose mechanism for retrieving - // datatypes appropriate to a particular database product, that corresponds - // to logical datatypes such as "LARGETEXT". - // - // Currently, this is hard-coded to a single logical datatype. private String getDatatypeFromLogicalType(DatabaseProductType databaseProductType, String logicalDatatype) throws Exception { + final Map> DATABASE_DATATYPES = + new HashMap>(); + // Define the logical datatypes and database-specific datatypes associated + // with each database system. final String LARGE_TEXT_DATATYPE = "LARGETEXT"; + final String[] DATATYPES = { LARGE_TEXT_DATATYPE }; + // final String DATE_DATATYPE = "DATE"; + // final String[] DATATYPES = { LARGE_TEXT_DATATYPE, DATE_DATATYPE }; + final DatabaseProductType[] DATABASE_PRODUCT_TYPES = + { DatabaseProductType.POSTGRESQL, DatabaseProductType.MYSQL }; + Map postgresqlDatatypeMap = new HashMap(); + postgresqlDatatypeMap.put("LARGETEXT", "text"); + // postgresqlDatatypeMap.put("DATE", "date"); + DATABASE_DATATYPES.put(DatabaseProductType.POSTGRESQL, postgresqlDatatypeMap); + Map mysqlDatatypeMap = new HashMap(); + mysqlDatatypeMap.put("LARGETEXT", "TEXT"); + // mysqlDatatypeMap.put("DATE", "DATE"); + DATABASE_DATATYPES.put(DatabaseProductType.MYSQL, mysqlDatatypeMap); + String datatype = ""; - if (!logicalDatatype.equalsIgnoreCase(LARGE_TEXT_DATATYPE)) { + if (!Arrays.asList(DATABASE_PRODUCT_TYPES).contains(databaseProductType)) { + throw new Exception("Unrecognized database system " + databaseProductType); + } + if (!Arrays.asList(DATATYPES).contains(logicalDatatype.toUpperCase())) { throw new Exception("Unrecognized logical datatype " + logicalDatatype); } - if (databaseProductType == DatabaseProductType.MYSQL) { - datatype = "TEXT"; - } else if (databaseProductType == DatabaseProductType.POSTGRESQL) { - datatype = "TEXT"; - } else { - throw new Exception("Unrecognized database system " + databaseProductType); + datatype = DATABASE_DATATYPES.get(databaseProductType).get(logicalDatatype.toUpperCase()); + if (datatype == null) { + throw new Exception("Unrecognized logical datatype " + logicalDatatype + + " for database system " + databaseProductType); } return datatype; }