Skip to content

Commit

Permalink
0005586: Trigger creation fails when 2 new triggers have trigger IDs
Browse files Browse the repository at this point in the history
that are identical when shortened
# Conflicts:
#	symmetric-core/src/main/java/org/jumpmind/symmetric/service/ITriggerRouterService.java
#	symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/TriggerRouterService.java

# Conflicts:
#	symmetric-core/src/main/java/org/jumpmind/symmetric/service/ITriggerRouterService.java
  • Loading branch information
Philip Marzullo committed Nov 15, 2022
1 parent 2ea95b2 commit 8659d6f
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 10 deletions.
Expand Up @@ -207,7 +207,7 @@ public TriggerHistory getNewestTriggerHistoryForTrigger(String triggerId, String
public Trigger getTriggerById(String triggerId, boolean refreshCache);

public String getTriggerName(DataEventType dml, int maxTriggerNameLength, Trigger trigger, Table table,
List<TriggerHistory> activeTriggerHistories, TriggerHistory oldhist);
List<TriggerHistory> activeTriggerHistories, TriggerHistory oldhist, List<String> triggerNamesGeneratedThisSession);

public void insert(TriggerHistory newAuditRecord);

Expand Down
Expand Up @@ -3157,12 +3157,13 @@ private TriggerHistory findOrCreateTriggerHistory(String tableName, int triggerH
triggerHistory = new TriggerHistory(table, trigger, engine.getSymmetricDialect().getTriggerTemplate());
triggerHistory.setTriggerHistoryId(isExistingTriggerHist ? 0 : triggerHistId);
triggerHistory.setLastTriggerBuildReason(TriggerReBuildReason.TRIGGER_HIST_MISSING);
List<String> triggerNamesGeneratedThisSession = new ArrayList<String>();
triggerHistory.setNameForInsertTrigger(engine.getTriggerRouterService().getTriggerName(DataEventType.INSERT,
symmetricDialect.getMaxTriggerNameLength(), trigger, table, activeTriggerHistories, null));
symmetricDialect.getMaxTriggerNameLength(), trigger, table, activeTriggerHistories, null, triggerNamesGeneratedThisSession));
triggerHistory.setNameForUpdateTrigger(engine.getTriggerRouterService().getTriggerName(DataEventType.UPDATE,
symmetricDialect.getMaxTriggerNameLength(), trigger, table, activeTriggerHistories, null));
symmetricDialect.getMaxTriggerNameLength(), trigger, table, activeTriggerHistories, null, triggerNamesGeneratedThisSession));
triggerHistory.setNameForDeleteTrigger(engine.getTriggerRouterService().getTriggerName(DataEventType.DELETE,
symmetricDialect.getMaxTriggerNameLength(), trigger, table, activeTriggerHistories, null));
symmetricDialect.getMaxTriggerNameLength(), trigger, table, activeTriggerHistories, null, triggerNamesGeneratedThisSession));
log.warn("Could not find trigger history {} for table {} for data_id {}. Generating a new trigger history row.",
triggerHistId, tableName, dataId);
engine.getTriggerRouterService().insert(triggerHistory);
Expand Down
Expand Up @@ -347,7 +347,7 @@ public Map<Long, TriggerHistory> getHistoryRecords() {
}

protected boolean isTriggerNameInUse(List<TriggerHistory> activeTriggerHistories, Trigger trigger, String triggerName,
TriggerHistory oldhist) {
TriggerHistory oldhist, List<String> triggerNamesGeneratedThisSession) {
synchronized (activeTriggerHistories) {
for (TriggerHistory triggerHistory : activeTriggerHistories) {
if ((!triggerHistory.getTriggerId().equals(trigger.getTriggerId()) ||
Expand All @@ -360,6 +360,9 @@ protected boolean isTriggerNameInUse(List<TriggerHistory> activeTriggerHistories
}
}
}
if (triggerNamesGeneratedThisSession.contains(triggerName)) {
return true;
}
return false;
}

Expand Down Expand Up @@ -1820,6 +1823,7 @@ public void run() {
private Map<String, List<TriggerTableSupportingInfo>> getTriggerToTableSupportingInfo(List<Trigger> triggers, List<TriggerHistory> activeTriggerHistories,
boolean useTableCache) {
Map<String, List<TriggerTableSupportingInfo>> triggerToTableSupportingInfo = new HashMap<String, List<TriggerTableSupportingInfo>>();
List<String> triggerNamesGeneratedThisSession = new ArrayList<String>();
for (final Trigger trigger : triggers) {
List<TriggerTableSupportingInfo> triggerTableSupportingInfoList = new ArrayList<TriggerTableSupportingInfo>();
Set<Table> tables = getTablesForTrigger(trigger, triggers, useTableCache);
Expand Down Expand Up @@ -1849,15 +1853,18 @@ private Map<String, List<TriggerTableSupportingInfo>> getTriggerToTableSupportin
String deleteTriggerName = null;
if (trigger.isSyncOnInsert()) {
insertTriggerName = getTriggerName(DataEventType.INSERT,
maxTriggerNameLength, trigger, modifiedTable, activeTriggerHistories, latestHistoryBeforeRebuild).toUpperCase();
maxTriggerNameLength, trigger, modifiedTable, activeTriggerHistories, latestHistoryBeforeRebuild, triggerNamesGeneratedThisSession).toUpperCase();
triggerNamesGeneratedThisSession.add(insertTriggerName);
}
if (trigger.isSyncOnUpdate()) {
updateTriggerName = getTriggerName(DataEventType.UPDATE,
maxTriggerNameLength, trigger, modifiedTable, activeTriggerHistories, latestHistoryBeforeRebuild).toUpperCase();
maxTriggerNameLength, trigger, modifiedTable, activeTriggerHistories, latestHistoryBeforeRebuild, triggerNamesGeneratedThisSession).toUpperCase();
triggerNamesGeneratedThisSession.add(updateTriggerName);
}
if (trigger.isSyncOnDelete()) {
deleteTriggerName = getTriggerName(DataEventType.DELETE,
maxTriggerNameLength, trigger, modifiedTable, activeTriggerHistories, latestHistoryBeforeRebuild).toUpperCase();
maxTriggerNameLength, trigger, modifiedTable, activeTriggerHistories, latestHistoryBeforeRebuild, triggerNamesGeneratedThisSession).toUpperCase();
triggerNamesGeneratedThisSession.add(deleteTriggerName);
}
TriggerTableSupportingInfo triggerTableSupportingInfo = new TriggerTableSupportingInfo(trigger.getTriggerId(), insertTriggerName,
updateTriggerName, deleteTriggerName, latestHistoryBeforeRebuild, modifiedTable);
Expand Down Expand Up @@ -2253,7 +2260,7 @@ protected TriggerHistory rebuildTriggerIfNecessary(StringBuilder sqlBuffer,
}

public String getTriggerName(DataEventType dml, int maxTriggerNameLength, Trigger trigger,
Table table, List<TriggerHistory> activeTriggerHistories, TriggerHistory oldhist) {
Table table, List<TriggerHistory> activeTriggerHistories, TriggerHistory oldhist, List<String> triggerNamesGeneratedThisSession) {
String triggerName = null;
switch (dml) {
case INSERT:
Expand Down Expand Up @@ -2307,7 +2314,7 @@ public String getTriggerName(DataEventType dml, int maxTriggerNameLength, Trigge
maxTriggerNameLength });
}
int duplicateCount = 0;
while (isTriggerNameInUse(activeTriggerHistories, trigger, triggerName, oldhist)) {
while (isTriggerNameInUse(activeTriggerHistories, trigger, triggerName, oldhist, triggerNamesGeneratedThisSession)) {
duplicateCount++;
String duplicateSuffix = Integer.toString(duplicateCount);
if (triggerName.length() + duplicateSuffix.length() > maxTriggerNameLength) {
Expand Down

0 comments on commit 8659d6f

Please sign in to comment.