diff --git a/database-commons/src/main/java/io/cdap/plugin/util/DBUtils.java b/database-commons/src/main/java/io/cdap/plugin/util/DBUtils.java index e45bbe4c1..3baba2da6 100644 --- a/database-commons/src/main/java/io/cdap/plugin/util/DBUtils.java +++ b/database-commons/src/main/java/io/cdap/plugin/util/DBUtils.java @@ -37,9 +37,13 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; import java.util.Hashtable; import java.util.List; import java.util.Objects; +import java.util.TimeZone; import javax.annotation.Nullable; import javax.management.InstanceNotFoundException; import javax.management.IntrospectionException; @@ -55,6 +59,18 @@ public final class DBUtils { private static final Logger LOG = LoggerFactory.getLogger(DBUtils.class); + private static final Calendar PURE_GREGORIAN_CALENDAR = createPureGregorianCalender(); + + // Java by default uses October 15, 1582 as a Gregorian cut over date. + // Any timestamp created with time less than this cut over date is treated as Julian date. + // This causes old dates from database such as 0001-01-01 01:00:00 mapped to 0000-12-30 + // Get the pure gregorian calendar so that all dates are treated as gregorian format. + private static Calendar createPureGregorianCalender() { + GregorianCalendar gc = new GregorianCalendar(); + gc.setGregorianChange(new Date(Long.MIN_VALUE)); + return gc; + } + /** * Performs any Database related cleanup * @@ -116,7 +132,7 @@ public static Object transformValue(int sqlType, int precision, int scale, case Types.TIME: return resultSet.getTime(columnIndex); case Types.TIMESTAMP: - return resultSet.getTimestamp(columnIndex); + return resultSet.getTimestamp(columnIndex, PURE_GREGORIAN_CALENDAR); case Types.ROWID: return resultSet.getString(columnIndex); case Types.BLOB: diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java index 5117f18cc..78fe4d1ff 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConnectorConfig.java @@ -58,7 +58,7 @@ public String getConnectionString() { } else if (OracleConstants.SERVICE_CONNECTION_TYPE.equals(getConnectionType())) { return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT, host, getPort(), database); } else { - return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT, host, getPort(),database); + return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT, host, getPort(), database); } } diff --git a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java index 52a02c828..d3b510598 100644 --- a/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java +++ b/oracle-plugin/src/main/java/io/cdap/plugin/oracle/OracleConstants.java @@ -34,5 +34,5 @@ private OracleConstants() { public static final String CONNECTION_TYPE = "connectionType"; public static final String ROLE = "role"; public static final String NAME_DATABASE = "database"; - public static final String TNS_CONNECTION_TYPE= "TNS"; + public static final String TNS_CONNECTION_TYPE = "TNS"; }