mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-27 20:05:10 +00:00
In order to propagate exceptions as values through the CQL layer with minimal modifications to the interfaces, a new result_message type is introduced: result_message::exception. Similarly to result_message::bounce_to_shard, this is an internal type which is supposed to be handled before being returned to the client.
98 lines
3.2 KiB
C++
98 lines
3.2 KiB
C++
|
|
/*
|
|
* Copyright (C) 2018-present ScyllaDB
|
|
*/
|
|
|
|
/*
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
#include "result_message.hh"
|
|
#include <seastar/core/print.hh>
|
|
|
|
namespace cql_transport::messages {
|
|
|
|
std::ostream& operator<<(std::ostream& os, const result_message::void_message& msg) {
|
|
fmt::print(os, "{{result_message::void}}");
|
|
return os;
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const result_message::bounce_to_shard& msg) {
|
|
fmt::print(os, "{{result_message::bounce_to_shard {}}}", msg.move_to_shard());
|
|
return os;
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const result_message::exception& msg) {
|
|
fmt::print(os, "{{result_message::exception {}}}", msg.get_exception());
|
|
return os;
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const result_message::set_keyspace& msg) {
|
|
fmt::print(os, "{{result_message::set_keyspace {}}}", msg.get_keyspace());
|
|
return os;
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const result_message::prepared::thrift& msg) {
|
|
fmt::print(os, "{{result_message::prepared::thrift {:d}}}", msg.get_id());
|
|
return os;
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const result_message::prepared::cql& msg) {
|
|
fmt::print(os, "{{result_message::prepared::cql {}}}", to_hex(msg.get_id()));
|
|
return os;
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const result_message::schema_change& msg) {
|
|
// FIXME: format contents
|
|
fmt::print(os, "{{result_message::prepared::schema_change {:p}}}", (void*)msg.get_change().get());
|
|
return os;
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const result_message::rows& msg) {
|
|
os << "{result_message::rows ";
|
|
struct visitor {
|
|
std::ostream& _os;
|
|
void start_row() { _os << "{row: "; }
|
|
void accept_value(std::optional<query::result_bytes_view> value) {
|
|
if (!value) {
|
|
_os << " null";
|
|
return;
|
|
}
|
|
_os << " ";
|
|
using boost::range::for_each;
|
|
for_each(*value, [this] (bytes_view fragment) {
|
|
_os << fragment;
|
|
});
|
|
}
|
|
void end_row() { _os << "}"; }
|
|
};
|
|
msg.rs().visit(visitor { os });
|
|
os << "}";
|
|
return os;
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const result_message& msg) {
|
|
class visitor : public result_message::visitor {
|
|
std::ostream& _os;
|
|
public:
|
|
explicit visitor(std::ostream& os) : _os(os) {}
|
|
void visit(const result_message::void_message& m) override { _os << m; };
|
|
void visit(const result_message::set_keyspace& m) override { _os << m; };
|
|
void visit(const result_message::prepared::cql& m) override { _os << m; };
|
|
void visit(const result_message::prepared::thrift& m) override { _os << m; };
|
|
void visit(const result_message::schema_change& m) override { _os << m; };
|
|
void visit(const result_message::rows& m) override { _os << m; };
|
|
void visit(const result_message::bounce_to_shard& m) override { _os << m; };
|
|
void visit(const result_message::exception& m) override { _os << m; };
|
|
};
|
|
visitor print_visitor{os};
|
|
msg.accept(print_visitor);
|
|
return os;
|
|
}
|
|
|
|
void result_message::visitor_base::visit(const result_message::exception& ex) {
|
|
ex.throw_me();
|
|
}
|
|
|
|
}
|