oceanbase

Форк
0
/
obsm_row.cpp 
73 строки · 2.4 Кб
1
/**
2
 * Copyright (c) 2021 OceanBase
3
 * OceanBase CE is licensed under Mulan PubL v2.
4
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
5
 * You may obtain a copy of Mulan PubL v2 at:
6
 *          http://license.coscl.org.cn/MulanPubL-2.0
7
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
 * See the Mulan PubL v2 for more details.
11
 */
12

13
#include "obsm_row.h"
14

15
#include "observer/mysql/obsm_utils.h"
16
#include "common/ob_accuracy.h"
17
#include "share/schema/ob_schema_getter_guard.h"
18

19
using namespace oceanbase::share::schema;
20
using namespace oceanbase::common;
21
using namespace oceanbase::obmysql;
22

23
ObSMRow::ObSMRow(MYSQL_PROTOCOL_TYPE type,
24
                 const ObNewRow &obrow,
25
                 const ObDataTypeCastParams &dtc_params,
26
                 const common::ColumnsFieldIArray *fields,
27
                 ObSchemaGetterGuard *schema_guard,
28
                 uint64_t tenant_id)
29
    : ObMySQLRow(type),
30
      obrow_(obrow),
31
      dtc_params_(dtc_params),
32
      fields_(fields),
33
      schema_guard_(schema_guard),
34
      tenant_id_(tenant_id)
35
{
36
}
37

38
int ObSMRow::encode_cell(
39
    int64_t idx, char *buf,
40
    int64_t len, int64_t &pos, char *bitmap) const
41
{
42
  int ret = OB_SUCCESS;
43
  if (idx > get_cells_cnt() || idx < 0) {
44
    ret = OB_INVALID_ARGUMENT;
45
  } else if (is_packed_) {
46
    const ObObj *cell = &obrow_.cells_[idx];
47
    //to check is overflow
48
    if (OB_UNLIKELY(cell->get_string_len() < 0)) {
49
      ret = OB_ERR_UNEXPECTED;
50
      SQL_ENG_LOG(ERROR, "invalid obj len", K(ret), K(common::lbt()), K(cell->get_string_len()));
51
    } else if (OB_UNLIKELY((len - pos) < cell->get_string_len())) {
52
      ret = OB_SIZE_OVERFLOW;
53
    } else {
54
      MEMCPY(buf + pos, cell->get_string_ptr(), cell->get_string_len());
55
      pos += cell->get_string_len();
56
    }
57
  } else {
58
    int64_t cell_idx = OB_LIKELY(NULL != obrow_.projector_)
59
        ? obrow_.projector_[idx]
60
        : idx;
61
    const ObObj *cell = &obrow_.cells_[cell_idx];
62

63
    if (NULL == fields_) {
64
      ret = ObSMUtils::cell_str(
65
          buf, len, *cell, type_, pos, idx, bitmap, dtc_params_, NULL, NULL);
66
    } else {
67
      ret = ObSMUtils::cell_str(
68
          buf, len, *cell, type_, pos, idx, bitmap, dtc_params_, &fields_->at(idx), schema_guard_, tenant_id_);
69
    }
70
  }
71

72
  return ret;
73
}
74

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.