Co-authored-by: hanr881 <1741282579@qq.com> Co-authored-by: haohao022 <haohaohm@outlook.com> Co-authored-by: seuwebber <webber_code@163.com>
118 lines
3.7 KiB
C++
118 lines
3.7 KiB
C++
/**
|
|
* Copyright (c) 2024 OceanBase
|
|
* OceanBase CE is licensed under Mulan PubL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PubL v2.
|
|
* You may obtain a copy of Mulan PubL v2 at:
|
|
* http://license.coscl.org.cn/MulanPubL-2.0
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
* See the Mulan PubL v2 for more details.
|
|
*/
|
|
|
|
#define USING_LOG_PREFIX PL
|
|
|
|
#include "pl/ob_pl_package_encode_info.h"
|
|
#include "lib/oblog/ob_log_module.h"
|
|
|
|
namespace oceanbase
|
|
{
|
|
using namespace common;
|
|
namespace pl
|
|
{
|
|
|
|
int ObPackageVarEncodeInfo::construct()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
CK (var_idx_ != common::OB_INVALID_INDEX);
|
|
|
|
if (OB_SUCC(ret)) {
|
|
if (encode_value_.is_null()) {
|
|
value_type_ = PackageValueType::NULL_TYPE;
|
|
value_len_ = 0;
|
|
} else if (encode_value_.is_tinyint()) {
|
|
value_type_ = PackageValueType::BOOL_TYPE;
|
|
bool val = false;
|
|
value_len_ = serialization::encoded_length(val);
|
|
} else if (encode_value_.is_hex_string()) {
|
|
value_type_ = PackageValueType::HEX_STRING_TYPE;
|
|
value_len_ = encode_value_.get_hex_string().length();
|
|
} else {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("unexpected value type", K(ret));
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObPackageVarEncodeInfo::get_serialize_size(int64_t &size)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
size = 0;
|
|
size += serialization::encoded_length(var_idx_);
|
|
size += serialization::encoded_length(value_type_);
|
|
size += serialization::encoded_length(value_len_);
|
|
size += value_len_;
|
|
|
|
return ret;
|
|
}
|
|
|
|
int ObPackageVarEncodeInfo::encode(char *dst, const int64_t dst_len, int64_t &dst_pos)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
|
|
OZ (serialization::encode(dst, dst_len, dst_pos, var_idx_));
|
|
OZ (serialization::encode(dst, dst_len, dst_pos, value_type_));
|
|
OZ (serialization::encode(dst, dst_len, dst_pos, value_len_));
|
|
if (OB_SUCC(ret)) {
|
|
if (PackageValueType::NULL_TYPE == value_type_) {
|
|
// do nothing
|
|
} else if (PackageValueType::BOOL_TYPE == value_type_) {
|
|
bool obj_val = encode_value_.get_bool();
|
|
OZ (serialization::encode(dst, dst_len, dst_pos, obj_val));
|
|
} else if (PackageValueType::HEX_STRING_TYPE == value_type_) {
|
|
CK (value_len_ == encode_value_.get_hex_string().length());
|
|
if (OB_SUCC(ret)) {
|
|
MEMCPY(dst + dst_pos, encode_value_.get_hex_string().ptr(), encode_value_.get_hex_string().length());
|
|
dst_pos += encode_value_.get_hex_string().length();
|
|
}
|
|
} else {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("unexpected value type", K(ret));
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPackageVarEncodeInfo::decode(const char *src, const int64_t src_len, int64_t &src_pos)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
|
|
OZ (serialization::decode(src, src_len, src_pos, var_idx_));
|
|
OZ (serialization::decode(src, src_len, src_pos, value_type_));
|
|
OZ (serialization::decode(src, src_len, src_pos, value_len_));
|
|
if (OB_SUCC(ret)) {
|
|
if (PackageValueType::NULL_TYPE == value_type_) {
|
|
CK (0 == value_len_);
|
|
OX (encode_value_.set_null());
|
|
} else if (PackageValueType::BOOL_TYPE == value_type_) {
|
|
bool val = false;
|
|
CK (1 == value_len_);
|
|
OZ (serialization::decode(src, src_len, src_pos, val));
|
|
OX (encode_value_.set_bool(val));
|
|
} else if (PackageValueType::HEX_STRING_TYPE == value_type_) {
|
|
// shallow copy
|
|
OX (encode_value_.set_hex_string(ObString(value_len_, src + src_pos)));
|
|
OX (src_pos += value_len_);
|
|
} else {
|
|
ret = OB_ERR_UNEXPECTED;
|
|
LOG_WARN("unexpected value type", K(ret));
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
} // end namespace pl
|
|
} // end namespace oceanbase
|