From 01c5d99c903c6e231b542eb84511d6aa82f48627 Mon Sep 17 00:00:00 2001 From: klementinastojanovska Date: Thu, 1 Feb 2018 16:04:09 -0500 Subject: [PATCH] 0003389: dbcompare, timestamp and utf8. Added date-time-format option --- .../jumpmind/symmetric/DbCompareCommand.java | 16 ++++++++-- .../org/jumpmind/symmetric/io/DbCompare.java | 1 + .../symmetric/io/DbCompareConfig.java | 7 +++++ .../symmetric/io/DbValueComparator.java | 29 +++++++++++++++---- 4 files changed, 46 insertions(+), 7 deletions(-) diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/DbCompareCommand.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/DbCompareCommand.java index f1e1ee4d1f..afe4bb13dc 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/DbCompareCommand.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/DbCompareCommand.java @@ -119,6 +119,15 @@ protected boolean executeWithOptions(CommandLine line) throws Exception { throw new ParseException("Failed to parse arg [" + numericScaleArg + "] " + ex); } } + + String dateTimeFormatArg = getOptionValue(OPTION_DATE_TIME_FORMAT, "dateTimeFormat", line, config); + if (!StringUtils.isEmpty(dateTimeFormatArg)) { + try { + config.setDateTimeFormat(dateTimeFormatArg); + } catch (Exception ex) { + throw new ParseException("Failed to parse arg [" + dateTimeFormatArg + "]" + ex); + } + } ISymmetricEngine sourceEngine = new ClientSymmetricEngine(sourceProperies); ISymmetricEngine targetEngine = new ClientSymmetricEngine(targetProperties); @@ -133,10 +142,10 @@ protected String getOptionValue(String optionName, String internalName, CommandL String optionValue = line.hasOption(optionName) ? line.getOptionValue(optionName) : null; if (optionValue == null) { Properties props = getConfigProperties(line); - optionValue = props.getProperty(optionName); + optionValue = props != null ? props.getProperty(optionName) : null; if (optionValue == null) { String optionNameUnderScore = optionName.replace('-', '_'); - optionValue = props.getProperty(optionNameUnderScore); + optionValue = props != null ? props.getProperty(optionNameUnderScore) : null; if (optionValue != null) { config.setConfigSource(internalName, line.getOptionValue(OPTION_CONFIG_PROPERTIES)); } @@ -171,6 +180,8 @@ protected static void initFromServerProperties() { private static final String OPTION_OUTPUT_SQL = "output-sql"; private static final String OPTION_NUMERIC_SCALE = "numeric-scale"; + + private static final String OPTION_DATE_TIME_FORMAT = "date-time-format"; private static final String OPTION_CONFIG_PROPERTIES = "config"; @@ -191,6 +202,7 @@ protected void buildOptions(Options options) { addOption(options, null, OPTION_USE_SYM_CONFIG, true); addOption(options, null, OPTION_OUTPUT_SQL, true); addOption(options, null, OPTION_NUMERIC_SCALE, true); + addOption(options, null, OPTION_DATE_TIME_FORMAT, true); addOption(options, null, OPTION_CONFIG_PROPERTIES, true); } diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbCompare.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbCompare.java index 4766626d24..1e3d9d47d3 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbCompare.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbCompare.java @@ -79,6 +79,7 @@ public DbCompare(ISymmetricEngine sourceEngine, ISymmetricEngine targetEngine, D public DbCompareReport compare() { dbValueComparator.setNumericScale(config.getNumericScale()); + dbValueComparator.setDateTimeFormat(config.getDateTimeFormat()); log.info("Starting DBCompare with config:\n{}", config.report()); diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbCompareConfig.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbCompareConfig.java index a420945de0..42f0ee4c62 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbCompareConfig.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbCompareConfig.java @@ -42,6 +42,7 @@ public class DbCompareConfig { private List excludedTableNames; private boolean useSymmetricConfig = true; private int numericScale = 3; + private String dateTimeFormat; private Map whereClauses = new LinkedHashMap(); private Map> tablesToExcludedColumns = new LinkedHashMap>(); private String outputSql; @@ -133,6 +134,12 @@ public int getNumericScale() { public void setNumericScale(int numericScale) { this.numericScale = numericScale; } + public String getDateTimeFormat() { + return dateTimeFormat; + } + public void setDateTimeFormat(String format) { + this.dateTimeFormat= format; + } public Map getWhereClauses() { return whereClauses; } diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbValueComparator.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbValueComparator.java index 6acb1877ce..47037d6cc5 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbValueComparator.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/io/DbValueComparator.java @@ -47,6 +47,7 @@ public class DbValueComparator { private boolean stringNullEqualsEmptyString = true; private List dateFormats = new ArrayList(); private int numericScale = -1; + private String dateTimeFormat; public DbValueComparator(ISymmetricEngine sourceEngine, ISymmetricEngine targetEngine) { this.sourceEngine = sourceEngine; @@ -142,15 +143,26 @@ public int compareDateTime(Column sourceColumn, Column targetColumn, String sour Date sourceDate = parseDate(sourceEngine, sourceColumn, sourceValue); Date targetDate = parseDate(targetEngine, targetColumn, targetValue); - // if either column is a simple date, clear the time for comparison purposes. - if (sourceColumn.getJdbcTypeCode() == Types.DATE - || targetColumn.getJdbcTypeCode() == Types.DATE) { + if (sourceColumn.getJdbcTypeCode() != Types.DATE + && targetColumn.getJdbcTypeCode() != Types.DATE) { + if (dateTimeFormat != null) { + String sourceDateFormatted = formatDateTime(sourceDate); + String targetDateFormatted = formatDateTime(targetDate); + return compareDefault(sourceColumn, targetColumn, sourceDateFormatted, targetDateFormatted); + } + } else { // if either column is a simple date, clear the time for comparison purposes. sourceDate = DateUtils.truncate(sourceDate, Calendar.DATE); targetDate = DateUtils.truncate(targetDate, Calendar.DATE); } - return compareDefault(sourceColumn, targetColumn, sourceDate, targetDate); } + + public String formatDateTime(Date date) { + SimpleDateFormat formatter = new SimpleDateFormat(dateTimeFormat); + + String formattedDate = formatter.format(date); + return formattedDate; + } @SuppressWarnings("unchecked") protected int compareDefault(Column sourceColumn, Column targetColumn, Object sourceValue, Object targetValue) { @@ -204,6 +216,13 @@ public int getNumericScale() { public void setNumericScale(int numericScale) { this.numericScale = numericScale; } - + + public String getDateTimeFormat() { + return dateTimeFormat; + } + + public void setDateTimeFormat(String format) { + this.dateTimeFormat = format; + } }