Пример #1
0
bool ErrorResponse::decode(int version, char* buffer, size_t size) {
  char* pos = decode_int32(buffer, code_);
  pos = decode_string(pos, &message_);

  switch (code_) {
    case CQL_ERROR_UNAVAILABLE:
      pos = decode_uint16(pos, cl_);
      pos = decode_int32(pos, required_);
      decode_int32(pos, received_);
      break;
    case CQL_ERROR_READ_TIMEOUT:
      pos = decode_uint16(pos, cl_);
      pos = decode_int32(pos, received_);
      pos = decode_int32(pos, required_);
      decode_byte(pos, data_present_);
      break;
    case CQL_ERROR_WRITE_TIMEOUT:
      pos = decode_uint16(pos, cl_);
      pos = decode_int32(pos, received_);
      pos = decode_int32(pos, required_);
      decode_write_type(pos);
      break;
    case CQL_ERROR_READ_FAILURE:
      pos = decode_uint16(pos, cl_);
      pos = decode_int32(pos, received_);
      pos = decode_int32(pos, required_);
      pos = decode_int32(pos, num_failures_);
      decode_byte(pos, data_present_);
      break;
    case CQL_ERROR_FUNCTION_FAILURE:
      pos = decode_string(pos, &keyspace_);
      pos = decode_string(pos, &function_);
      decode_stringlist(pos, arg_types_);
      break;
    case CQL_ERROR_WRITE_FAILURE:
      pos = decode_uint16(pos, cl_);
      pos = decode_int32(pos, received_);
      pos = decode_int32(pos, required_);
      pos = decode_int32(pos, num_failures_);
      decode_write_type(pos);
      break;
    case CQL_ERROR_UNPREPARED:
      decode_string(pos, &prepared_id_);
      break;
    case CQL_ERROR_ALREADY_EXISTS:
      pos = decode_string(pos, &keyspace_);
      pos = decode_string(pos, &table_);
      break;
  }
  return true;
}
Пример #2
0
bool EventResponse::decode(int version, char* buffer, size_t size) {
  StringRef event_type;
  char* pos = decode_string(buffer, &event_type);

  if (event_type == "TOPOLOGY_CHANGE") {
    event_type_ = CASS_EVENT_TOPOLOGY_CHANGE;

    StringRef topology_change;
    pos = decode_string(pos, &topology_change);
    if (topology_change == "NEW_NODE") {
      topology_change_ = NEW_NODE;
    } else if (topology_change == "REMOVED_NODE") {
      topology_change_ = REMOVED_NODE;
    } else if (topology_change == "MOVED_NODE") {
      topology_change_ = MOVED_NODE;
    } else {
      return false;
    }
    decode_inet(pos, &affected_node_);
  } else if (event_type == "STATUS_CHANGE") {
    event_type_ = CASS_EVENT_STATUS_CHANGE;

    StringRef status_change;
    pos = decode_string(pos, &status_change);
    if (status_change == "UP") {
      status_change_ = UP;
    } else if (status_change == "DOWN") {
      status_change_ = DOWN;
    } else {
      return false;
    }
    decode_inet(pos, &affected_node_);
  } else if (event_type == "SCHEMA_CHANGE") {
    event_type_ = CASS_EVENT_SCHEMA_CHANGE;

    // Version 1+: <change>... (all start with change type)
    StringRef schema_change;
    pos = decode_string(pos, &schema_change);
    if (schema_change == "CREATED") {
      schema_change_ = CREATED;
    } else if (schema_change == "UPDATED") {
      schema_change_ = UPDATED;
    } else if (schema_change == "DROPPED") {
      schema_change_ = DROPPED;
    } else {
      return false;
    }

    if (version <= 2) {
      // Version 1 and 2: ...<keyspace><table> ([string][string])
      pos = decode_string(pos, &keyspace_);
      decode_string(pos, &target_);
      schema_change_target_ = target_.size() == 0 ? KEYSPACE : TABLE;
    } else {
      // Version 3+: ...<target><options>
      // <target> = [string]
      // <options> = [string] OR [string][string]

      StringRef target;
      pos = decode_string(pos, &target);
      if (target == "KEYSPACE") {
        schema_change_target_ = KEYSPACE;
      } else if (target == "TABLE") {
        schema_change_target_ = TABLE;
      } else if (target == "TYPE") {
        schema_change_target_ = TYPE;
      } else if (target == "FUNCTION") {
        schema_change_target_ = FUNCTION;
      } else if (target == "AGGREGATE") {
        schema_change_target_ = AGGREGATE;
      } else {
        return false;
      }

      pos = decode_string(pos, &keyspace_);

      if (schema_change_target_ == TABLE ||
          schema_change_target_ == TYPE) {
        decode_string(pos, &target_);
      } else if (schema_change_target_ == FUNCTION ||
                 schema_change_target_ == AGGREGATE) {
        pos = decode_string(pos, &target_);
        decode_stringlist(pos, arg_types_);
      }
    }
  } else {
    return false;
  }

  return true;
}