private void insertVariablesWithMultipleUpdates(final int id, final int actionId, Map<String, String> changedStateVariables) { for (Entry<String, String> entry : changedStateVariables.entrySet()) { int updated = jdbc.update(insertWorkflowInstanceStateSql() + " values (?,?,?,?)", id, actionId, entry.getKey(), entry.getValue()); if (updated != 1) { throw new IllegalStateException("Failed to insert state variable " + entry.getKey()); } } }
private void insertVariablesWithBatchUpdate(final int id, final int actionId, Map<String, String> changedStateVariables) { final Iterator<Entry<String, String>> variables = changedStateVariables.entrySet().iterator(); int[] updateStatus = jdbc.batchUpdate(insertWorkflowInstanceStateSql() + " values (?,?,?,?)", new AbstractInterruptibleBatchPreparedStatementSetter() { @Override
private int insertWorkflowInstanceWithCte(WorkflowInstance instance) { try { StringBuilder sqlb = new StringBuilder(256); sqlb.append("with wf as (" + insertWorkflowInstanceSql() + " returning id)"); Object[] instanceValues = new Object[] { instance.type, instance.rootWorkflowId, instance.parentWorkflowId, instance.parentActionId, instance.businessKey, instance.externalId, executorInfo.getExecutorGroup(), instance.status.name(), instance.state, abbreviate(instance.stateText, instanceStateTextLength), toTimestamp(instance.nextActivation) }; int pos = instanceValues.length; Object[] args = Arrays.copyOf(instanceValues, pos + instance.stateVariables.size() * 2); for (Entry<String, String> var : instance.stateVariables.entrySet()) { sqlb.append(", ins").append(pos).append(" as (").append(insertWorkflowInstanceStateSql()) .append(" select wf.id,0,?,? from wf)"); args[pos++] = var.getKey(); args[pos++] = var.getValue(); } sqlb.append(" select wf.id from wf"); return jdbc.queryForObject(sqlb.toString(), Integer.class, args); } catch (DuplicateKeyException e) { logger.warn("Failed to insert workflow instance", e); return -1; } }
private void updateWorkflowInstanceWithCTE(WorkflowInstance instance, final WorkflowInstanceAction action, Map<String, String> changedStateVariables) { int executorId = executorInfo.getExecutorId(); StringBuilder sqlb = new StringBuilder(256); sqlb.append("with wf as (").append(updateWorkflowInstanceSql()).append(" returning id), "); sqlb.append("act as (").append(insertWorkflowActionSql()).append(" select wf.id, ?, ").append(sqlVariants.actionType()) .append(", ?, ?, ?, ?, ? from wf returning id)"); // using sqlVariants.nextActivationUpdate() requires that nextActivation is added 3 times Timestamp nextActivation = toTimestamp(instance.nextActivation); Object[] fixedValues = new Object[] { instance.status.name(), instance.state, abbreviate(instance.stateText, instanceStateTextLength), nextActivation, nextActivation, nextActivation, instance.status == executing ? executorId : null, instance.retries, instance.id, executorId, action.type.name(), action.state, abbreviate(action.stateText, actionStateTextLength), action.retryNo, toTimestamp(action.executionStart), toTimestamp(action.executionEnd) }; int pos = fixedValues.length; Object[] args = Arrays.copyOf(fixedValues, pos + changedStateVariables.size() * 2); for (Entry<String, String> var : changedStateVariables.entrySet()) { sqlb.append(", ins").append(pos).append(" as (").append(insertWorkflowInstanceStateSql()) .append(" select wf.id,act.id,?,? from wf,act)"); args[pos++] = var.getKey(); args[pos++] = var.getValue(); } sqlb.append(" select act.id from act"); jdbc.queryForObject(sqlb.toString(), Integer.class, args); }