Example #1
0
  /**
   * 判断返回的数据是否是当前命令的结束包。 当前全部连接都全部返回以后则表示当前命令完全结束。
   *
   * @param conn
   * @param buffer
   * @return
   */
  protected CommandStatus checkResponseCompleted(Connection conn, byte[] buffer) {
    boolean isCompleted = false;
    ConnectionStatuts connStatus = connStatusMap.get(conn);
    if (connStatus == null) {
      CommandMessageHandler.logger.error(
          "connection Status not Found, byffer=" + StringUtil.dumpAsHex(buffer, buffer.length));
    }
    try {
      connStatus.buffers.add(buffer);
      isCompleted = connStatus.isCompleted(buffer);
      /**
       * 如果是多个连接的,需要将数据缓存起来,等待命令全部完成以后,将数据进行组装,然后发送到客户端 {@link
       * #CommandMessageHandler.mergeMessageToClient}
       */
      if (isCompleted) {
        // set last insert id to client connection;
        if (conn != source) {
          if (connStatus.packetIndex == 0 && MysqlPacketBuffer.isOkPacket(buffer)) {
            if (statment instanceof InsertStatement && currentCommand.isMain()) {
              OkPacket packet = new OkPacket();
              packet.init(buffer, conn);
              if (packet.insertId > 0) {
                source.setLastInsertId(packet.insertId);
              }
            }
          }
        }

        boolean isAllCompleted =
            currentCommand.getCompletedCount().incrementAndGet() == connStatusMap.size();
        if (isAllCompleted) {
          connStatus.isMerged = true;
        }
        if (isAllCompleted) {
          if (CommandMessageHandler.logger.isDebugEnabled()) {
            Packet packet = null;
            if (MysqlPacketBuffer.isErrorPacket(buffer)) {
              packet = new ErrorPacket();
            } else if (MysqlPacketBuffer.isEofPacket(buffer)) {
              packet = new EOFPacket();
            } else if (MysqlPacketBuffer.isOkPacket(buffer)) {
              packet = new OkPacket();
            }
            packet.init(buffer, conn);
            CommandMessageHandler.logger.debug("returned Packet:" + packet);
          }
          return CommandStatus.AllCompleted;

        } else {
          return CommandStatus.ConnectionCompleted;
        }
      } else {
        return CommandStatus.ConnectionNotComplete;
      }
    } finally {
      connStatus.packetIndex++;
    }
  }
Example #2
0
 public void clearAllBuffer() {
   Collection<ConnectionStatuts> collection = connStatusMap.values();
   for (ConnectionStatuts status : collection) {
     status.clearBuffer();
   }
 }