From 6aba9f6b1f23e8b3ac233c3804fc2475537809a7 Mon Sep 17 00:00:00 2001 From: Philip Marzullo Date: Fri, 5 Apr 2019 11:35:10 -0400 Subject: [PATCH 1/2] 0003899: When changing just a LOB field on SQL Server, the change is not captured by the trigger --- .../db/JdbcSymmetricDialectFactory.java | 3 +- .../db/mssql/MsSql2008SymmetricDialect.java | 22 ++++++++ .../db/mssql/MsSql2008TriggerTemplate.java | 50 +++++++++++++++++++ .../db/mssql/MsSqlTriggerTemplate.java | 2 +- 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSql2008SymmetricDialect.java create mode 100644 symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSql2008TriggerTemplate.java diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/JdbcSymmetricDialectFactory.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/JdbcSymmetricDialectFactory.java index 3d51b99637..e61103a67b 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/JdbcSymmetricDialectFactory.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/JdbcSymmetricDialectFactory.java @@ -63,6 +63,7 @@ import org.jumpmind.symmetric.db.informix.InformixSymmetricDialect; import org.jumpmind.symmetric.db.interbase.InterbaseSymmetricDialect; import org.jumpmind.symmetric.db.mariadb.MariaDBSymmetricDialect; +import org.jumpmind.symmetric.db.mssql.MsSql2008SymmetricDialect; import org.jumpmind.symmetric.db.mssql.MsSqlSymmetricDialect; import org.jumpmind.symmetric.db.mssql2000.MsSql2000SymmetricDialect; import org.jumpmind.symmetric.db.mysql.MySqlSymmetricDialect; @@ -108,7 +109,7 @@ public ISymmetricDialect create() { } else if (platform instanceof OracleDatabasePlatform) { dialect = new OracleSymmetricDialect(parameterService, platform); } else if (platform instanceof MsSql2008DatabasePlatform) { - dialect = new MsSqlSymmetricDialect(parameterService, platform); + dialect = new MsSql2008SymmetricDialect(parameterService, platform); } else if (platform instanceof MsSql2005DatabasePlatform) { dialect = new MsSqlSymmetricDialect(parameterService, platform); } else if (platform instanceof MsSql2000DatabasePlatform) { diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSql2008SymmetricDialect.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSql2008SymmetricDialect.java new file mode 100644 index 0000000000..a1e2fd1f32 --- /dev/null +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSql2008SymmetricDialect.java @@ -0,0 +1,22 @@ +package org.jumpmind.symmetric.db.mssql; + +import org.jumpmind.db.platform.IDatabasePlatform; +import org.jumpmind.symmetric.model.Trigger; +import org.jumpmind.symmetric.service.IParameterService; + +public class MsSql2008SymmetricDialect extends MsSqlSymmetricDialect { + public MsSql2008SymmetricDialect() { + super(); + } + + public MsSql2008SymmetricDialect(IParameterService parameterService, IDatabasePlatform platform) { + super(parameterService, platform); + this.triggerTemplate = new MsSql2008TriggerTemplate(this); + } + + @Override + protected String getDbSpecificDataHasChangedCondition(Trigger trigger) { + /* gets filled/replaced by trigger template as it will compare by each column */ + return "$(anyColumnChanged)"; + } +} diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSql2008TriggerTemplate.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSql2008TriggerTemplate.java new file mode 100644 index 0000000000..d2bdb5615d --- /dev/null +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSql2008TriggerTemplate.java @@ -0,0 +1,50 @@ +package org.jumpmind.symmetric.db.mssql; + +import org.jumpmind.db.model.Column; +import org.jumpmind.db.model.Table; +import org.jumpmind.symmetric.db.ISymmetricDialect; +import org.jumpmind.symmetric.io.data.DataEventType; +import org.jumpmind.symmetric.model.Channel; +import org.jumpmind.symmetric.model.Trigger; +import org.jumpmind.symmetric.model.TriggerHistory; +import org.jumpmind.util.FormatUtils; + +public class MsSql2008TriggerTemplate extends MsSqlTriggerTemplate { + public MsSql2008TriggerTemplate(ISymmetricDialect symmetricDialect) { + super(symmetricDialect); + } + + @Override + protected String replaceTemplateVariables(DataEventType dml, Trigger trigger, + TriggerHistory history, Channel channel, String tablePrefix, Table originalTable, Table table, + String defaultCatalog, String defaultSchema, String ddl) { + ddl = super.replaceTemplateVariables(dml, trigger, history, channel, tablePrefix, originalTable, table, defaultCatalog, defaultSchema, ddl); + ddl = FormatUtils.replace("anyColumnChanged", + buildColumnsAreNotEqualString(table, newTriggerValue, oldTriggerValue), ddl); + return ddl; + } + + private String buildColumnsAreNotEqualString(Table table, String table1Name, String table2Name){ + StringBuilder builder = new StringBuilder(); + + for(Column column : table.getColumns()){ + if (builder.length() > 0) { + builder.append(" or "); + } + + if(isNotComparable(column)) { + // Can't compare the value. + // Let's use the UPDATE() function to see if it showed up in the SET list of the update statement + builder.append(String.format("UPDATE(\"%1$s\")", column.getName())); + } else { + builder.append(String.format("((%1$s.\"%2$s\" IS NOT NULL AND %3$s.\"%2$s\" IS NOT NULL AND %1$s.\"%2$s\"<>%3$s.\"%2$s\") or " + + "(%1$s.\"%2$s\" IS NULL AND %3$s.\"%2$s\" IS NOT NULL) or " + + "(%1$s.\"%2$s\" IS NOT NULL AND %3$s.\"%2$s\" IS NULL))", table1Name, column.getName(), table2Name)); + } + } + if (builder.length() == 0) { + builder.append("1=1"); + } + return builder.toString(); + } +} diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlTriggerTemplate.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlTriggerTemplate.java index 411b41d799..394052ff38 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlTriggerTemplate.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mssql/MsSqlTriggerTemplate.java @@ -284,7 +284,7 @@ protected String replaceTemplateVariables(DataEventType dml, Trigger trigger, return ddl; } - private boolean isNotComparable(Column column) { + protected boolean isNotComparable(Column column) { String columnType = column.getJdbcTypeName(); return StringUtils.equalsIgnoreCase(columnType, "IMAGE") || StringUtils.equalsIgnoreCase(columnType, "TEXT") From e57a657975315871b88a756b43bba842db960d7d Mon Sep 17 00:00:00 2001 From: Philip Marzullo Date: Wed, 10 Apr 2019 15:01:11 -0400 Subject: [PATCH 2/2] 0003911: LDAP Base DN specification should be able to provide more than one LDAP tree for searching --- symmetric-assemble/src/asciidoc/configuration/ldap.ad | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/symmetric-assemble/src/asciidoc/configuration/ldap.ad b/symmetric-assemble/src/asciidoc/configuration/ldap.ad index b95002e59d..9cb77b1579 100644 --- a/symmetric-assemble/src/asciidoc/configuration/ldap.ad +++ b/symmetric-assemble/src/asciidoc/configuration/ldap.ad @@ -6,6 +6,11 @@ Configuring a <> authentication on SymmetricDS using LDAP is as simple as console.auth.ldap.baseDN:: The LDAP base DN to search for a user. [ Default: ] + +A list of base DNs can be specified by separating each entry by a pipe ("|") symbol. + +For example: + +ou=Users,o=IT,c=US,dc=corp,dc=local|ou=Users,o=Tech,c=US,dc=corp,dc=local + console.auth.ldap.host:: The LDAP server host name. [ Default: ]