From fef19b9731fcebdbccdae5393cf331bfb81c6dbb Mon Sep 17 00:00:00 2001 From: mmichalek Date: Wed, 19 Dec 2018 10:29:36 -0500 Subject: [PATCH 1/3] 0003836: Fix DDL creation of ROWID column for Oracle (3.10) --- .../db/platform/oracle/OracleDdlBuilder.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java index 7ce7ae2a11..6098efc992 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/oracle/OracleDdlBuilder.java @@ -40,6 +40,7 @@ import org.jumpmind.db.model.ColumnTypes; import org.jumpmind.db.model.Database; import org.jumpmind.db.model.IIndex; +import org.jumpmind.db.model.PlatformColumn; import org.jumpmind.db.model.Table; import org.jumpmind.db.platform.AbstractDdlBuilder; import org.jumpmind.db.platform.DatabaseNamesConstants; @@ -53,6 +54,8 @@ public class OracleDdlBuilder extends AbstractDdlBuilder { protected static final String PREFIX_TRIGGER = "TRG"; protected static final String PREFIX_SEQUENCE = "SEQ"; + + protected static final String ROWID_TYPE = "ROWID"; public OracleDdlBuilder() { super(DatabaseNamesConstants.ORACLE); @@ -530,5 +533,17 @@ protected void processChange(Database currentModel, Database desiredModel, printEndOfStatement(ddl); change.apply(currentModel, delimitedIdentifierModeOn); } + + + @Override + protected String getSqlType(Column column) { + PlatformColumn platformColumn = column.findPlatformColumn(databaseName); + if (platformColumn != null && platformColumn.getType() != null + && platformColumn.getType().equals(ROWID_TYPE)) { + return ROWID_TYPE; + } else { + return super.getSqlType(column); + } + } } From b5a3c4c8505cc465a4a1331cf94d1ada25720cba Mon Sep 17 00:00:00 2001 From: "Hicks, Josh" Date: Wed, 19 Dec 2018 14:50:16 -0500 Subject: [PATCH 2/3] 0003837: MSSQL Support for datetime2 values that are before January 1, 1753 --- .../db/platform/mssql/MsSqlDmlStatement.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/mssql/MsSqlDmlStatement.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/mssql/MsSqlDmlStatement.java index f88146d894..d5bba35ab5 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/mssql/MsSqlDmlStatement.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/mssql/MsSqlDmlStatement.java @@ -30,4 +30,23 @@ protected int getTypeCode(Column column, boolean isDateOverrideToTimestamp) { return super.getTypeCode(column, isDateOverrideToTimestamp); } } + + @Override + protected void appendColumnParameter(StringBuilder sql, Column column) { + if (column.getJdbcTypeName() != null && column.getJdbcTypeName().equals("datetime2") && column.getMappedTypeCode() == Types.VARCHAR) { + sql.append("cast(? AS datetime2(6))").append(","); + } else { + super.appendColumnParameter(sql, column); + } + } + + @Override + protected void appendColumnEquals(StringBuilder sql, Column column) { + if (column.getJdbcTypeName() != null && column.getJdbcTypeName().equals("datetime2") && column.getMappedTypeCode() == Types.VARCHAR) { + sql.append(quote).append(column.getName()).append(quote) + .append(" = cast(? AS datetime2(6))"); + } else { + super.appendColumnEquals(sql, column); + } + } } From 9aaf4fda0146bdd21267c6ddee3152c089bffec9 Mon Sep 17 00:00:00 2001 From: "Hicks, Josh" Date: Wed, 19 Dec 2018 14:54:44 -0500 Subject: [PATCH 3/3] 0003838: Ability to resolve a row in error on the incoming side and provide resolve data --- .../io/data/writer/AbstractDatabaseWriter.java | 13 ++++++++++++- .../AbstractDatabaseWriterConflictResolver.java | 2 +- .../writer/IDatabaseWriterConflictResolver.java | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/AbstractDatabaseWriter.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/AbstractDatabaseWriter.java index 2b31adc8ef..5c280fc44d 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/AbstractDatabaseWriter.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/AbstractDatabaseWriter.java @@ -38,6 +38,7 @@ import org.jumpmind.symmetric.io.data.DataEventType; import org.jumpmind.symmetric.io.data.IDataWriter; import org.jumpmind.symmetric.io.data.writer.Conflict.DetectConflict; +import org.jumpmind.symmetric.io.data.writer.Conflict.PingBack; import org.jumpmind.util.Statistics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -230,10 +231,20 @@ public void write(CsvData data) { rollback(); throw ex; } catch (RuntimeException ex) { + DatabaseWriterSettings writerSettings = getWriterSettings(); + Statistics batchStatistics = getStatistics().get(getBatch()); + long statementCount = batchStatistics.get(DataWriterStatisticConstants.ROWCOUNT); + long lineNumber = batchStatistics.get(DataWriterStatisticConstants.LINENUMBER); + ResolvedData resolvedData = getWriterSettings().getResolvedData(statementCount); + if (conflictResolver != null && conflictResolver.isIgnoreRow(this, data)) { statistics.get(batch).increment(DataWriterStatisticConstants.IGNOREROWCOUNT); + } else if (conflictResolver != null && resolvedData != null) { + Conflict conflict = new Conflict(); + conflict.setPingBack(PingBack.REMAINING_ROWS); + conflictResolver.attemptToResolve(resolvedData, data, this, conflict); } else { - if (filterError(data, ex)) { + if (filterError(data, ex)) { if (!(ex instanceof SqlException)) { /* * SQL exceptions should have already been logged diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/AbstractDatabaseWriterConflictResolver.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/AbstractDatabaseWriterConflictResolver.java index 1eab57e3a7..676ab45ef6 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/AbstractDatabaseWriterConflictResolver.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/AbstractDatabaseWriterConflictResolver.java @@ -227,7 +227,7 @@ protected void ignore(AbstractDatabaseWriter writer, Conflict conflict) { } } - protected void attemptToResolve(ResolvedData resolvedData, CsvData data, AbstractDatabaseWriter writer, Conflict conflict) { + public void attemptToResolve(ResolvedData resolvedData, CsvData data, AbstractDatabaseWriter writer, Conflict conflict) { if (resolvedData != null) { if (!resolvedData.isIgnoreRow()) { data.putCsvData(CsvData.ROW_DATA, resolvedData.getResolvedData()); diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/IDatabaseWriterConflictResolver.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/IDatabaseWriterConflictResolver.java index 4dd8f6d02b..fb194ac873 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/IDatabaseWriterConflictResolver.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/IDatabaseWriterConflictResolver.java @@ -30,4 +30,5 @@ public interface IDatabaseWriterConflictResolver extends IExtensionPoint { public boolean isIgnoreRow(AbstractDatabaseWriter writer, CsvData data); + public void attemptToResolve(ResolvedData resolvedData, CsvData data, AbstractDatabaseWriter writer, Conflict conflict); }