| // Copyright (c) 2011 The LevelDB Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. See the AUTHORS file for names of contributors. |
| |
| #include "common/status.h" |
| |
| #include <gen_cpp/Status_types.h> |
| #include <gen_cpp/types.pb.h> // for PStatus |
| #include <rapidjson/encodings.h> |
| #include <rapidjson/prettywriter.h> |
| #include <rapidjson/stringbuffer.h> |
| |
| #include <algorithm> |
| #include <new> |
| #include <vector> |
| |
| #include "service/backend_options.h" |
| |
| namespace doris { |
| namespace ErrorCode { |
| |
| ErrorCodeState error_states[MAX_ERROR_CODE_DEFINE_NUM]; |
| ErrorCodeInitializer error_code_init(10); |
| } // namespace ErrorCode |
| |
| void Status::to_thrift(TStatus* s) const { |
| s->error_msgs.clear(); |
| if (ok()) { |
| s->status_code = TStatusCode::OK; |
| return; |
| } |
| // Currently, there are many error codes, not defined in thrift and need pass to FE. |
| // DCHECK(_code > 0) |
| // << "The error code has to > 0 because TStatusCode need it > 0, it's actual value is " |
| // << _code; |
| s->status_code = (int16_t)_code > 0 ? (TStatusCode::type)_code : TStatusCode::INTERNAL_ERROR; |
| |
| if (_code == ErrorCode::VERSION_ALREADY_MERGED) { |
| s->status_code = TStatusCode::OLAP_ERR_VERSION_ALREADY_MERGED; |
| } else if (_code == ErrorCode::TABLE_NOT_FOUND) { |
| s->status_code = TStatusCode::TABLET_MISSING; |
| } |
| |
| s->error_msgs.push_back(fmt::format("({})[{}]{}", BackendOptions::get_localhost(), |
| code_as_string(), _err_msg ? _err_msg->_msg : "")); |
| s->__isset.error_msgs = true; |
| } |
| |
| TStatus Status::to_thrift() const { |
| TStatus s; |
| to_thrift(&s); |
| return s; |
| } |
| |
| void Status::to_protobuf(PStatus* s) const { |
| s->clear_error_msgs(); |
| s->set_status_code((int)_code); |
| if (!ok()) { |
| s->add_error_msgs(fmt::format("({})[{}]{}", BackendOptions::get_localhost(), |
| code_as_string(), _err_msg ? _err_msg->_msg : "")); |
| } |
| } |
| |
| Status& Status::prepend(std::string_view msg) { |
| if (!ok()) { |
| if (_err_msg == nullptr) { |
| _err_msg = std::make_unique<ErrMsg>(); |
| } |
| _err_msg->_msg = std::string(msg) + _err_msg->_msg; |
| } |
| return *this; |
| } |
| |
| Status& Status::append(std::string_view msg) { |
| if (!ok()) { |
| if (_err_msg == nullptr) { |
| _err_msg = std::make_unique<ErrMsg>(); |
| } |
| _err_msg->_msg.append(msg); |
| } |
| return *this; |
| } |
| |
| std::string Status::to_json() const { |
| rapidjson::StringBuffer s; |
| rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(s); |
| writer.StartObject(); |
| // status |
| writer.Key("status"); |
| writer.String(code_as_string().c_str()); |
| // msg |
| writer.Key("msg"); |
| ok() ? writer.String("OK") : writer.String(_err_msg ? _err_msg->_msg.c_str() : ""); |
| writer.EndObject(); |
| return s.GetString(); |
| } |
| |
| } // namespace doris |