コード例 #1
0
ファイル: Insert.java プロジェクト: kringpin323/H2-Research
  private void handleOnDuplicate(DbException de) {
    if (de.getErrorCode() != ErrorCode.DUPLICATE_KEY_1) {
      throw de;
    }
    if (duplicateKeyAssignmentMap == null || duplicateKeyAssignmentMap.isEmpty()) {
      throw de;
    }

    ArrayList<String> variableNames = new ArrayList<String>(duplicateKeyAssignmentMap.size());
    for (int i = 0; i < columns.length; i++) {
      String key =
          session.getCurrentSchemaName() + "." + table.getName() + "." + columns[i].getName();
      variableNames.add(key);
      session.setVariable(key, list.get(getCurrentRowNumber() - 1)[i].getValue(session));
    }

    Update command = new Update(session);
    command.setTableFilter(new TableFilter(session, table, null, true, null));
    for (Column column : duplicateKeyAssignmentMap.keySet()) {
      command.setAssignment(column, duplicateKeyAssignmentMap.get(column));
    }

    Index foundIndex = searchForUpdateIndex();

    if (foundIndex != null) {
      command.setCondition(prepareUpdateCondition(foundIndex));
    } else {
      throw DbException.getUnsupportedException(
          "Unable to apply ON DUPLICATE KEY UPDATE, no index found!");
    }

    command.prepare();
    command.update();
    for (String variableName : variableNames) {
      session.setVariable(variableName, ValueNull.INSTANCE);
    }
  }