killbill-aplcache

util: make ValidationManager work on PostgreSQL Signed-off-by:

7/15/2015 12:17:27 PM

Details

diff --git a/util/src/main/java/org/killbill/billing/util/validation/dao/DatabaseSchemaSqlDao.java b/util/src/main/java/org/killbill/billing/util/validation/dao/DatabaseSchemaSqlDao.java
index 6fe55eb..bcc7095 100644
--- a/util/src/main/java/org/killbill/billing/util/validation/dao/DatabaseSchemaSqlDao.java
+++ b/util/src/main/java/org/killbill/billing/util/validation/dao/DatabaseSchemaSqlDao.java
@@ -22,6 +22,7 @@ import java.util.List;
 
 import javax.annotation.Nullable;
 
+import org.killbill.billing.util.validation.DefaultColumnInfo;
 import org.skife.jdbi.v2.StatementContext;
 import org.skife.jdbi.v2.sqlobject.Bind;
 import org.skife.jdbi.v2.sqlobject.SqlQuery;
@@ -29,8 +30,6 @@ import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
 import org.skife.jdbi.v2.sqlobject.stringtemplate.UseStringTemplate3StatementLocator;
 import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
-import org.killbill.billing.util.validation.DefaultColumnInfo;
-
 @UseStringTemplate3StatementLocator
 @RegisterMapper(DatabaseSchemaSqlDao.ColumnInfoMapper.class)
 public interface DatabaseSchemaSqlDao {
@@ -46,7 +45,18 @@ public interface DatabaseSchemaSqlDao {
             final String columnName = r.getString("column_name");
             final Integer scale = r.getInt("numeric_scale");
             final Integer precision = r.getInt("numeric_precision");
-            final boolean isNullable = r.getBoolean("is_nullable");
+
+            // Special handling for PostgreSQL - the implementation of AbstractJdbc2ResultSet#getBoolean doesn't support YES/NO
+            final String isNullableString = r.getString("is_nullable");
+            final boolean isNullable;
+            if ("YES".equalsIgnoreCase(isNullableString)) {
+                isNullable = true;
+            } else if ("NO".equalsIgnoreCase(isNullableString)) {
+                isNullable = false;
+            } else {
+                isNullable = r.getBoolean("is_nullable");
+            }
+
             final Integer maximumLength = r.getInt("character_maximum_length");
             final String dataType = r.getString("data_type");
 
diff --git a/util/src/main/java/org/killbill/billing/util/validation/ValidationManager.java b/util/src/main/java/org/killbill/billing/util/validation/ValidationManager.java
index 253ed8f..2b4864f 100644
--- a/util/src/main/java/org/killbill/billing/util/validation/ValidationManager.java
+++ b/util/src/main/java/org/killbill/billing/util/validation/ValidationManager.java
@@ -140,8 +140,8 @@ public class ValidationManager {
     }
 
     private boolean isValidLengthChar(final DefaultColumnInfo columnInfo, final Object value) {
-        // MySQL reports data_type as Strings, H2 as SQLTypes
-        if (columnInfo.getDataType().equals("char") || columnInfo.getDataType().equals(String.valueOf(Types.CHAR))) {
+        // MySQL and PostgreSQL report data_type as Strings, H2 as SQLTypes
+        if ("char".equals(columnInfo.getDataType()) || "character".equals(columnInfo.getDataType()) || String.valueOf(Types.CHAR).equals(columnInfo.getDataType())) {
             if (value == null) {
                 return false;
             } else {