public static int sendRewriteCmd()

in src/main/java/org/mariadb/jdbc/internal/com/send/ComQuery.java [117:259]


  public static int sendRewriteCmd(
      final PacketOutputStream pos,
      final List<byte[]> queryParts,
      int currentIndex,
      int paramCount,
      List<ParameterHolder[]> parameterList,
      boolean rewriteValues)
      throws IOException {
    pos.startPacket(0);
    pos.write(Packet.COM_QUERY);
    int index = currentIndex;
    ParameterHolder[] parameters = parameterList.get(index++);

    byte[] firstPart = queryParts.get(0);
    byte[] secondPart = queryParts.get(1);

    if (!rewriteValues) {
      // write first
      pos.write(firstPart, 0, firstPart.length);
      pos.write(secondPart, 0, secondPart.length);

      int staticLength = 1;
      for (byte[] queryPart : queryParts) {
        staticLength += queryPart.length;
      }

      for (int i = 0; i < paramCount; i++) {
        parameters[i].writeTo(pos);
        pos.write(queryParts.get(i + 2));
      }
      pos.write(queryParts.get(paramCount + 2));

      // write other, separate by ";"
      while (index < parameterList.size()) {
        parameters = parameterList.get(index);

        // check packet length so to separate in multiple packet
        int parameterLength = 0;
        boolean knownParameterSize = true;
        for (ParameterHolder parameter : parameters) {
          int paramSize = parameter.getApproximateTextProtocolLength();
          if (paramSize == -1) {
            knownParameterSize = false;
            break;
          }
          parameterLength += paramSize;
        }

        if (knownParameterSize) {
          // We know the additional query part size. This permit :
          // - to resize buffer size if needed (to avoid resize test every write)
          // - if this query will be separated in a new packet.
          if (pos.checkRemainingSize(staticLength + parameterLength)) {
            pos.write((byte) ';');
            pos.write(firstPart, 0, firstPart.length);
            pos.write(secondPart, 0, secondPart.length);
            for (int i = 0; i < paramCount; i++) {
              parameters[i].writeTo(pos);
              pos.write(queryParts.get(i + 2));
            }
            pos.write(queryParts.get(paramCount + 2));
            index++;
          } else {
            break;
          }
        } else {
          // we cannot know the additional query part size.
          pos.write(';');
          pos.write(firstPart, 0, firstPart.length);
          pos.write(secondPart, 0, secondPart.length);
          for (int i = 0; i < paramCount; i++) {
            parameters[i].writeTo(pos);
            pos.write(queryParts.get(i + 2));
          }
          pos.write(queryParts.get(paramCount + 2));
          index++;
          break;
        }
      }

    } else {
      pos.write(firstPart, 0, firstPart.length);
      pos.write(secondPart, 0, secondPart.length);
      int lastPartLength = queryParts.get(paramCount + 2).length;
      int intermediatePartLength = queryParts.get(1).length;

      for (int i = 0; i < paramCount; i++) {
        parameters[i].writeTo(pos);
        pos.write(queryParts.get(i + 2));
        intermediatePartLength += queryParts.get(i + 2).length;
      }

      while (index < parameterList.size()) {
        parameters = parameterList.get(index);

        // check packet length so to separate in multiple packet
        int parameterLength = 0;
        boolean knownParameterSize = true;
        for (ParameterHolder parameter : parameters) {
          int paramSize = parameter.getApproximateTextProtocolLength();
          if (paramSize == -1) {
            knownParameterSize = false;
            break;
          }
          parameterLength += paramSize;
        }

        if (knownParameterSize) {
          // We know the additional query part size. This permit :
          // - to resize buffer size if needed (to avoid resize test every write)
          // - if this query will be separated in a new packet.
          if (pos.checkRemainingSize(
              1 + parameterLength + intermediatePartLength + lastPartLength)) {
            pos.write((byte) ',');
            pos.write(secondPart, 0, secondPart.length);

            for (int i = 0; i < paramCount; i++) {
              parameters[i].writeTo(pos);
              byte[] addPart = queryParts.get(i + 2);
              pos.write(addPart, 0, addPart.length);
            }
            index++;
          } else {
            break;
          }
        } else {
          pos.write((byte) ',');
          pos.write(secondPart, 0, secondPart.length);

          for (int i = 0; i < paramCount; i++) {
            parameters[i].writeTo(pos);
            pos.write(queryParts.get(i + 2));
          }
          index++;
          break;
        }
      }
      pos.write(queryParts.get(paramCount + 2));
    }

    pos.flush();
    return index;
  }