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; }
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; }