All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.postgresql.adba.communication.network.ParseRequest Maven / Gradle / Ivy

package org.postgresql.adba.communication.network;

import org.postgresql.adba.communication.FeFrame;
import org.postgresql.adba.communication.NetworkOutputStream;
import org.postgresql.adba.communication.NetworkRequest;
import org.postgresql.adba.communication.NetworkResponse;
import org.postgresql.adba.communication.NetworkWriteContext;
import org.postgresql.adba.communication.PreparedStatementCache;
import org.postgresql.adba.operations.helpers.ParameterHolder;
import org.postgresql.adba.operations.helpers.QueryParameter;
import org.postgresql.adba.util.BinaryHelper;

/**
 * Row operation {@link NetworkRequest}.
 * 
 * @author Daniel Sagenschneider
 */
public class ParseRequest implements NetworkRequest {

  private final Portal portal;

  public ParseRequest(Portal portal) {
    this.portal = portal;
  }

  /*
   * ================== NetworkRequest ========================
   */

  @Override
  public NetworkRequest write(NetworkWriteContext context) throws Exception {

    // Determine if already query
    Query query = portal.getQuery();
    if (query == null) {

      // Obtain the prepared statement cache
      PreparedStatementCache cache = context.getPreparedStatementCache();

      // Obtain the query
      String sql = portal.getSql();
      ParameterHolder holder = portal.getParameterHolder();
      query = cache.getQuery(sql, holder.getParamTypes());

      // Associate query to portal
      portal.setQuery(query);
    }

    // Determine if prepare query
    if ((!query.isParsed()) && (!query.isWaitingParse())) {

      // Obtain the query details
      String sql = portal.getSql();
      ParameterHolder holder = portal.getParameterHolder();

      // Send the prepare packet
      NetworkOutputStream wire = context.getOutputStream();
      wire.write(FeFrame.FrontendTag.PARSE.getByte());
      wire.initPacket();
      wire.write(query.getQueryName());
      wire.write(sql);
      wire.write(BinaryHelper.writeShort(holder.size()));
      for (QueryParameter qp : holder.parameters()) {
        wire.write(BinaryHelper.writeInt(qp.getOid()));
      }
      wire.completePacket();
    }

    // Determine if describe or bind
    return new DescribeRequest<>(portal);

  }

  @Override
  public NetworkResponse getRequiredResponse() {
    Query query = portal.getQuery();

    // Determine if waiting on parse
    if (!query.isWaitingParse()) {
      query.flagWaitingParse();
      return new ParseResponse(portal);
    }

    // Already waiting on parse
    return null;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy