Skip to content

Commit

Permalink
Merge pull request #48 from woehrl01/change_sqlite
Browse files Browse the repository at this point in the history
0003079 - Add capture only changes support for SQLite
  • Loading branch information
chenson42 committed Apr 28, 2017
2 parents 9e8bedd + 7dd1f2e commit 0978636
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 1 deletion.
Expand Up @@ -30,6 +30,7 @@
import org.jumpmind.symmetric.common.ParameterConstants;
import org.jumpmind.symmetric.common.TableConstants;
import org.jumpmind.symmetric.db.AbstractSymmetricDialect;
import org.jumpmind.symmetric.model.Trigger;
import org.jumpmind.symmetric.service.IContextService;
import org.jumpmind.symmetric.service.IParameterService;
import org.jumpmind.symmetric.service.impl.ContextService;
Expand Down Expand Up @@ -116,6 +117,12 @@ public boolean isClobSyncSupported() {
public boolean isTransactionIdOverrideSupported() {
return false;
}

@Override
protected String getDbSpecificDataHasChangedCondition(Trigger trigger) {
/* gets filled/replaced by trigger template as it will compare by each column */
return "$(anyColumnChanged)";
}

@Override
public void truncateTable(String tableName) {
Expand Down
Expand Up @@ -24,9 +24,16 @@

import java.util.HashMap;

import org.jumpmind.db.model.Column;
import org.jumpmind.db.model.Table;
import org.jumpmind.symmetric.common.ParameterConstants;
import org.jumpmind.symmetric.db.AbstractSymmetricDialect;
import org.jumpmind.symmetric.db.AbstractTriggerTemplate;
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 SqliteTriggerTemplate extends AbstractTriggerTemplate {

Expand Down Expand Up @@ -73,7 +80,7 @@ public SqliteTriggerTemplate(AbstractSymmetricDialect symmetricDialect) {
.put("updateTriggerTemplate",
"create trigger $(triggerName) after update on $(schemaName)$(tableName) \n"
+ "for each row \n"
+ " when ($(syncOnUpdateCondition) and $(syncOnIncomingBatchCondition)) \n"
+ " when ($(syncOnUpdateCondition) and $(syncOnIncomingBatchCondition)) and ($(dataHasChangedCondition)) \n"
+ " begin \n"
+ " insert into $(defaultCatalog)$(prefixName)_data (table_name, event_type, trigger_hist_id, pk_data, row_data, old_data, channel_id, transaction_id, source_node_id, external_data, create_time) \n"
+ " values( \n" + " '$(targetTableName)', \n" + " 'U', \n"
Expand Down Expand Up @@ -103,4 +110,35 @@ public SqliteTriggerTemplate(AbstractSymmetricDialect symmetricDialect) {

// formatter:on
}

@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 ");
}

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();
}
}

0 comments on commit 0978636

Please sign in to comment.