Example #1
0
Client::query_result Client::submit(std::string command, std::string &message,
                                    ResultSet &rs) {
  if (m_clientFd < 0) {
    perror("Client does not connect to the server!\n");
    return Client::error;
  }
  ClientResponse *response = new ClientResponse();

  command = "#" + command;

  write(m_clientFd, command.c_str(), command.length() + 1);
  ClientLogging::log("Client: message from server!\n");
  const int maxBytes = 75536 + sizeof(int) * 2;
  char *buf = new char[maxBytes];
  memset(buf, 0, sizeof(buf));

  int receivedBytesNum;
  // compute the length of ClientResponse object
  if (-1 == recv(m_clientFd, buf, sizeof(int) + sizeof(int), MSG_WAITALL)) {
    perror("receive the length of response failed");
  }
  int status = *(int *)buf;
  int len = *((int *)buf + 1);
  ClientLogging::log(
      "the status is %d, the length of the response packet is %d.\n", status,
      len);

  if ((receivedBytesNum = recv(m_clientFd, buf + sizeof(int) + sizeof(int), len,
                               MSG_WAITALL)) < 0) {
    perror("Client: submit query error, has problem with the communication!\n");
  } else {
    ClientLogging::log("receive %d bytes from server.\n", receivedBytesNum);
  }
  assert(maxBytes >= receivedBytesNum);
  response->deserialize(buf, receivedBytesNum);
  delete buf;

  switch (response->status) {
    case ERROR: {
      message += "ERROR>" + response->content + "\n";
      return Client::error;
    }
    case OK: {
      while (response->status != ENDED) {
        switch (response->status) {
          case SCHEMASS:
            rs.schema_ = response->getSchema();
            break;
          case HEADER:
            rs.column_header_list_ = response->getAttributeName().header_list;
            break;
          case DATA:
            assert(rs.schema_ != 0);
            rs.appendNewBlock(response->getDataBlock(rs.schema_));
            break;
        }
        response = receive();
        ClientLogging::log("Message: %s\n", response->getMessage().c_str());
      }
      rs.query_time_ = atof(response->content.c_str());
      return Client::result;
    }
    case CHANGEDD: {
      message = response->content + "\n";
      return Client::message;
    }
    default: {
      printf("Unexpected response from server!n");
      message = "Unexpected response from server!\n";
      return Client::error;
    }
  }
}