Files
oceanbase/src/pl/ob_pl_package_encode_info.cpp
obdev 25853927c6 [FEAT MERGE]pl dev 435bp1
Co-authored-by: hanr881 <1741282579@qq.com>
Co-authored-by: haohao022 <haohaohm@outlook.com>
Co-authored-by: seuwebber <webber_code@163.com>
2025-02-10 17:16:20 +00:00

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