content: /*
   * Copyright (C) 2016-2023 ActionTech.
   * based on code by MyCATCopyrightHolder Copyright (c) 2013, OpenCloudDB/MyCAT.
   * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher.
   */
  package com.actiontech.dble.net.mysql;
  
  import com.actiontech.dble.backend.mysql.BufferUtil;
  import com.actiontech.dble.backend.mysql.MySQLMessage;
  import com.actiontech.dble.net.service.AbstractService;
  
  import java.nio.ByteBuffer;
  
  /**
   * From server to client after command, if no error and result set -- that is,
   * if the command was a query which returned a result set. The Result Set Header
   * Packet is the first of several, possibly many, packets that the server sends
   * for result sets. The order of packets for a result set is:
   * <p>
   * <pre>
   * (Result Set Header Packet)   the number of columns
   * (Field Packets)              column descriptors
   * (EOF Packet)                 marker: end of Field Packets
   * (Row Data Packets)           row contents
   * (EOF Packet)                 marker: end of Data Packets
   *
   * Bytes                        Name
   * -----                        ----
   * 1-9   (Length-Coded-Binary)  field_count
   * 1-9   (Length-Coded-Binary)  extra
   *
   * @see http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Result_Set_Header_Packet
   * </pre>
   *
   * @author mycat
   */
  public class ResultSetHeaderPacket extends MySQLPacket {
  
      private int fieldCount;
      private long extra;
  
      public void read(byte[] data) {
          MySQLMessage mm = new MySQLMessage(data);
          this.packetLength = mm.readUB3();
          this.packetId = mm.read();
          this.fieldCount = (int) mm.readLength();
          if (mm.hasRemaining()) {
              this.extra = mm.readLength();
          }
      }
  
      @Override
      public ByteBuffer write(ByteBuffer buffer, AbstractService service, boolean writeSocketIfFull) {
          int size = calcPacketSize();
          buffer = service.checkWriteBuffer(buffer, PACKET_HEADER_SIZE + size, writeSocketIfFull);
          BufferUtil.writeUB3(buffer, size);
          buffer.put(packetId);
          BufferUtil.writeLength(buffer, fieldCount);
          if (extra > 0) {
              BufferUtil.writeLength(buffer, extra);
          }
          return buffer;
      }
  
  
      @Override
      public int calcPacketSize() {
          int size = BufferUtil.getLength(fieldCount);
          if (extra > 0) {
              size += BufferUtil.getLength(extra);
          }
          return size;
      }
  
      @Override
      protected String getPacketInfo() {
          return "MySQL ResultSetHeader Packet";
      }
  
  
      public int getFieldCount() {
          return fieldCount;
      }
  
      public void setFieldCount(int fieldCount) {
          this.fieldCount = fieldCount;
      }
  
      public long getExtra() {
          return extra;
      }
  
      public void setExtra(long extra) {
          this.extra = extra;
      }
  
      @Override
      public boolean isEndOfQuery() {
          return false;
      }
  }
  