1007 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1007 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * Copyright (c) 2021 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 SHARE
 | 
						|
#include "share/ob_inner_table_operator.h"
 | 
						|
#include "lib/string/ob_sql_string.h"
 | 
						|
#include "lib/oblog/ob_log_module.h"
 | 
						|
#include "lib/utility/ob_macro_utils.h"
 | 
						|
#include "common/ob_smart_var.h"
 | 
						|
 | 
						|
using namespace oceanbase;
 | 
						|
using namespace common;
 | 
						|
using namespace share;
 | 
						|
using namespace sqlclient;
 | 
						|
 | 
						|
/**
 | 
						|
 * ------------------------------ObIInnerTableKey---------------------
 | 
						|
 */
 | 
						|
int ObIInnerTableKey::build_pkey_predicates(ObSqlString &predicates) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObDMLSqlSplicer dml;
 | 
						|
  if (OB_FAIL(fill_pkey_dml(dml))) {
 | 
						|
    LOG_WARN("failed to fill pkey dml", K(ret));
 | 
						|
  } else if (OB_FAIL(dml.splice_predicates(predicates))) {
 | 
						|
    LOG_WARN("failed to splice predicates", K(ret), K(this));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * ------------------------------ObIInnerTableCol---------------------
 | 
						|
 */
 | 
						|
int ObIInnerTableCol::set_column_name(const char *name)
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (OB_ISNULL(name)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("invalid name", K(ret), KP(name));
 | 
						|
  } else if (OB_FAIL(name_.assign(name))) {
 | 
						|
    LOG_WARN("failed to assign name", K(ret), K(name));
 | 
						|
  }
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
const char *ObIInnerTableCol::get_column_name() const
 | 
						|
{
 | 
						|
  return name_.ptr();
 | 
						|
}
 | 
						|
 | 
						|
int ObIInnerTableCol::build_predicates(ObSqlString &predicates) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObDMLSqlSplicer dml;
 | 
						|
  if (OB_FAIL(fill_value_dml(dml))) {
 | 
						|
    LOG_WARN("failed to fill value dml", K(ret));
 | 
						|
  } else if (OB_FAIL(dml.splice_predicates(predicates))) {
 | 
						|
    LOG_WARN("failed to splice predicates", K(ret), K(this));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * ------------------------------ObIInnerTableRow---------------------
 | 
						|
 */
 | 
						|
int ObIInnerTableRow::build_assignments(ObSqlString &assignments) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObDMLSqlSplicer dml;
 | 
						|
  if (OB_FAIL(fill_dml(dml))) {
 | 
						|
    LOG_WARN("failed to fill dml", K(ret));
 | 
						|
  } else if (OB_FAIL(dml.splice_assignments(assignments))) {
 | 
						|
    LOG_WARN("failed to splice assignments", K(ret), K(this));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * ------------------------------ObInnerTableOperator---------------------
 | 
						|
 */
 | 
						|
ObInnerTableOperator::ObInnerTableOperator()
 | 
						|
  : is_inited_(false), table_name_(), exec_tenant_id_provider_(nullptr), group_id_(0)
 | 
						|
{
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
ObInnerTableOperator::~ObInnerTableOperator()
 | 
						|
{
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::init(
 | 
						|
    const char *tname, const ObIExecTenantIdProvider &exec_tenant_id_provider,
 | 
						|
    const int32_t group_id)
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (IS_INIT) {
 | 
						|
    ret = OB_INIT_TWICE;
 | 
						|
    LOG_WARN("ObInnerTableOperator init twice", K(ret));
 | 
						|
  } else if (OB_ISNULL(tname) || group_id < 0) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("empty table name", K(ret), K(tname), K(group_id));
 | 
						|
  } else if (OB_FAIL(table_name_.assign(tname))) {
 | 
						|
    LOG_WARN("failed to assign table name", K(ret), K(tname));
 | 
						|
  } else {
 | 
						|
    exec_tenant_id_provider_ = &exec_tenant_id_provider;
 | 
						|
    group_id_ = group_id;
 | 
						|
    is_inited_ = true;
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
uint64_t ObInnerTableOperator::get_exec_tenant_id() const
 | 
						|
{
 | 
						|
  uint64_t tenant_id = OB_INVALID_TENANT_ID;
 | 
						|
  if (OB_NOT_NULL(exec_tenant_id_provider_)) {
 | 
						|
    tenant_id = exec_tenant_id_provider_->get_exec_tenant_id();
 | 
						|
  }
 | 
						|
  return tenant_id;
 | 
						|
}
 | 
						|
 | 
						|
const char *ObInnerTableOperator::get_table_name() const
 | 
						|
{
 | 
						|
  return table_name_.ptr();
 | 
						|
}
 | 
						|
 | 
						|
const ObIExecTenantIdProvider *ObInnerTableOperator::get_exec_tenant_id_provider() const
 | 
						|
{
 | 
						|
  return exec_tenant_id_provider_;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::lock_row(
 | 
						|
    ObMySQLTransaction &trans, const ObIInnerTableKey &key) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key));
 | 
						|
  } else if (OB_FAIL(do_lock_row_(trans, key))) {
 | 
						|
    LOG_WARN("failed to lock row", K(ret), K(key));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::get_row(
 | 
						|
    ObISQLClient &proxy, const bool need_lock, const ObIInnerTableKey &key,
 | 
						|
    ObIInnerTableRow &row) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key));
 | 
						|
  } else if (OB_FAIL(do_get_row_(proxy, need_lock, key, row))) {
 | 
						|
    LOG_WARN("failed to get row", K(ret), K(need_lock), K(key));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::insert_row(ObISQLClient &proxy, const ObIInnerTableRow &row,
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!row.is_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("row not valid", K(ret), K(row));
 | 
						|
  } else if (OB_FAIL(do_insert_row_(proxy, row, affected_rows))) {
 | 
						|
    LOG_WARN("failed to insert row", K(ret), K(row));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::update_row(ObISQLClient &proxy, const ObIInnerTableRow &row,
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!row.is_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("row not valid", K(ret), K(row));
 | 
						|
  } else if (OB_FAIL(do_update_row_(proxy, row, affected_rows))) {
 | 
						|
    LOG_WARN("failed to update row", K(ret), K(row));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::insert_or_update_row(ObISQLClient &proxy, const ObIInnerTableRow &row,
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!row.is_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("row not valid", K(ret), K(row));
 | 
						|
  } else if (OB_FAIL(do_insert_or_update_row_(proxy, row, affected_rows))) {
 | 
						|
    LOG_WARN("failed to insert or update row", K(ret), K(row));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::delete_row(ObISQLClient &proxy, const ObIInnerTableKey &key, int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key));
 | 
						|
  } else if (OB_FAIL(do_delete_row_(proxy, key, affected_rows))) {
 | 
						|
    LOG_WARN("failed to delete row", K(ret), K(key));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::get_column(
 | 
						|
    ObISQLClient &proxy, const bool need_lock, const ObIInnerTableKey &key, 
 | 
						|
    ObIInnerTableCol &col) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
 | 
						|
  const char *column_name = col.get_column_name();
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(col), K(need_lock));
 | 
						|
  } else if (OB_ISNULL(column_name)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("empty column_name", K(ret), K(key), K(col), K(need_lock));
 | 
						|
  } else if (OB_FAIL(do_get_column_(proxy, need_lock, key, col))) {
 | 
						|
    LOG_WARN("failed to get column", K(ret), K(key), K(col), K(need_lock));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::get_int_column(
 | 
						|
    ObISQLClient &proxy, const bool need_lock, const ObIInnerTableKey &key, 
 | 
						|
    const char *column_name, int64_t &value) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(column_name), K(need_lock));
 | 
						|
  } else if (OB_ISNULL(column_name)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("empty column_name", K(ret), K(key), K(column_name), K(need_lock));
 | 
						|
  } else if (OB_FAIL(do_get_int_column_(proxy, need_lock, key, column_name, value))) {
 | 
						|
    LOG_WARN("failed to get int column", K(ret), K(key), K(column_name), K(need_lock));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::get_string_column(
 | 
						|
    common::ObISQLClient &proxy, const bool need_lock, const ObIInnerTableKey &key, 
 | 
						|
    const char *column_name, StringValueType &value) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(column_name), K(need_lock));
 | 
						|
  } else if (OB_ISNULL(column_name)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("empty column_name", K(ret), K(key), K(column_name), K(need_lock));
 | 
						|
  } else if (OB_FAIL(do_get_string_column_(proxy, need_lock, key, column_name, value))) {
 | 
						|
    LOG_WARN("failed to get string column", K(ret), K(key), K(column_name), K(need_lock));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::increase_column_by(
 | 
						|
    common::ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const char *column_name, const int64_t value,
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_ISNULL(column_name)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("empty column name", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_FAIL(do_increase_column_by_(proxy, key, column_name, value, affected_rows))) {
 | 
						|
    LOG_WARN("fail to increase column", K(ret), K(key), K(column_name), K(value));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::increase_column_by_one(
 | 
						|
    common::ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const char *column_name, int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  return increase_column_by(proxy, key, column_name, 1LL, affected_rows);
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::update_column(
 | 
						|
    ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const char *assignments/* c1=v1, c2=v2 */, int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(assignments));
 | 
						|
  } else if (OB_ISNULL(assignments)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("invalid assignments", K(ret), K(key), K(assignments));
 | 
						|
  } else if (OB_FAIL(do_update_column_(proxy, key, assignments, affected_rows))) {
 | 
						|
    LOG_WARN("fail to increase column", K(ret), K(key), K(assignments));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::update_column(
 | 
						|
    ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const ObIInnerTableCol &col, int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString predicates;
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(col));
 | 
						|
  }  else if (OB_FAIL(col.build_predicates(predicates))) {
 | 
						|
    LOG_WARN("failed to build predicates", K(ret), K(key), K(col));
 | 
						|
  } else if (OB_FAIL(do_update_column_(proxy, key, predicates.ptr(), affected_rows))) {
 | 
						|
    LOG_WARN("fail to increase column", K(ret), K(key), K(predicates));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::update_int_column(
 | 
						|
    common::ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const char *column_name, const int64_t value,
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_ISNULL(column_name)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("column_name not valid", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_FAIL(sql.assign_fmt("%s=%ld", column_name, value))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_FAIL(do_update_column_(proxy, key, sql.ptr(), affected_rows))) {
 | 
						|
    LOG_WARN("fail to update column", K(ret), K(key), K(column_name), K(value));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::update_uint_column(
 | 
						|
    common::ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const char *column_name, const uint64_t value,
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_ISNULL(column_name)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("column_name not valid", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_FAIL(sql.assign_fmt("%s=%lu", column_name, value))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_FAIL(do_update_column_(proxy, key, sql.ptr(), affected_rows))) {
 | 
						|
    LOG_WARN("fail to update column", K(ret), K(key), K(column_name), K(value));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::update_string_column(
 | 
						|
    ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const char *column_name, const char *value, int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_ISNULL(column_name)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("invalid column_name", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_ISNULL(value)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("invalid value", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_FAIL(sql.assign_fmt("%s='%s'", column_name, value))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_FAIL(do_update_column_(proxy, key, sql.ptr(), affected_rows))) {
 | 
						|
    LOG_WARN("fail to update column", K(ret), K(key), K(column_name), K(value));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::compare_and_swap(
 | 
						|
    ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const char *assignments/* eg, c1=v1, c2=v2 */, const char *predicates/* c3=v3 AND c4=v4 */,
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(assignments), K(predicates));
 | 
						|
  } else if (OB_ISNULL(assignments)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("invalid assignments", K(ret), K(key), K(assignments), K(predicates));
 | 
						|
  } else if (OB_ISNULL(predicates)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("invalid predicates", K(ret), K(key), K(assignments), K(predicates));
 | 
						|
  } else if (OB_FAIL(do_compare_and_swap_(proxy, key, assignments, predicates, affected_rows))) {
 | 
						|
    LOG_WARN("fail to compare_and_swap", K(ret), K(key), K(assignments), K(predicates));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::compare_and_swap(
 | 
						|
    ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const char *column_name, const int64_t old_value, 
 | 
						|
    const int64_t new_value, int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
  ObSqlString predicates;
 | 
						|
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  } else if (OB_ISNULL(column_name)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("invalid column_name", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  } else if (OB_FAIL(sql.assign_fmt("%s=%ld", column_name, new_value))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  } else if (OB_FAIL(predicates.assign_fmt("%s=%ld", column_name, old_value))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  } else if (OB_FAIL(do_compare_and_swap_(proxy, key, sql.ptr(), predicates.ptr(), affected_rows))) {
 | 
						|
    LOG_WARN("fail to update column", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::compare_and_swap(
 | 
						|
      common::ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
      const char *column_name, const char *old_value, 
 | 
						|
      const char *new_value, int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
  ObSqlString predicates;
 | 
						|
 | 
						|
  if (IS_NOT_INIT) {
 | 
						|
    ret = OB_NOT_INIT;
 | 
						|
    LOG_WARN("ObInnerTableOperator not init", K(ret));
 | 
						|
  } else if (!key.is_pkey_valid()) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("key not valid", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  } else if (OB_ISNULL(column_name)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("invalid column_name", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  } else if (OB_ISNULL(old_value)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("invalid old_value", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  } else if (OB_ISNULL(new_value)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("invalid new_value", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  } else if (OB_FAIL(sql.assign_fmt("%s='%s'", column_name, new_value))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  } else if (OB_FAIL(predicates.assign_fmt("%s='%s'", column_name, old_value))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  } else if (OB_FAIL(do_compare_and_swap_(proxy, key, sql.ptr(), predicates.ptr(), affected_rows))) {
 | 
						|
    LOG_WARN("fail to update column", K(ret), K(key), K(column_name), K(old_value), K(new_value));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_lock_row_(
 | 
						|
    ObMySQLTransaction &trans, const ObIInnerTableKey &key) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
  ObSqlString predicates;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
 | 
						|
  if (OB_FAIL(key.build_pkey_predicates(predicates))) {
 | 
						|
    LOG_WARN("fail to fill predicates", K(ret), K(this), K(key));
 | 
						|
  } else if (OB_FAIL(sql.assign_fmt("select * from %s where %s for update", tname, predicates.ptr()))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(predicates));
 | 
						|
  } else {
 | 
						|
    HEAP_VAR(ObMySQLProxy::ReadResult, res) {
 | 
						|
      ObMySQLResult *result = NULL;
 | 
						|
      if (OB_FAIL(trans.read(res, exec_tenant_id, sql.ptr()))) {
 | 
						|
        LOG_WARN("failed to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_ISNULL(result = res.get_result())) {
 | 
						|
        ret = OB_ERR_UNEXPECTED;
 | 
						|
        LOG_WARN("result is null", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_FAIL(result->next())) {
 | 
						|
        if (OB_ITER_END == ret) {
 | 
						|
          ret = OB_ENTRY_NOT_EXIST;
 | 
						|
          LOG_WARN("row not exist, cannot lock", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
        } else {
 | 
						|
          LOG_WARN("get next failed", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
        }
 | 
						|
      } else {
 | 
						|
        // lock successfully.
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_get_row_(
 | 
						|
    ObISQLClient &proxy, const bool need_lock, const ObIInnerTableKey &key, ObIInnerTableRow &row) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
  ObSqlString predicates;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
 | 
						|
  if (OB_FAIL(sql.assign_fmt("select * from %s", tname))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key));
 | 
						|
  } else if (OB_FAIL(key.build_pkey_predicates(predicates))) {
 | 
						|
    LOG_WARN("fail to fill predicates", K(ret), K(key));
 | 
						|
  } else if (OB_FAIL(sql.append_fmt(" where %s", predicates.ptr()))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(sql), K(predicates));
 | 
						|
  } else if (need_lock && OB_FAIL(sql.append_fmt(" for update"))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(key));
 | 
						|
  } else {
 | 
						|
    HEAP_VAR(ObMySQLProxy::ReadResult, res) {
 | 
						|
      ObMySQLResult *result = NULL;
 | 
						|
      if (OB_FAIL(proxy.read(res, exec_tenant_id, sql.ptr()))) {
 | 
						|
        LOG_WARN("failed to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_ISNULL(result = res.get_result())) {
 | 
						|
        ret = OB_ERR_UNEXPECTED;
 | 
						|
        LOG_WARN("result is null", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_FAIL(parse_one_row_(*result, row))) {
 | 
						|
        LOG_WARN("failed to parse row", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_ITER_END != result->next()) {
 | 
						|
        ret = OB_ERR_UNEXPECTED;
 | 
						|
        LOG_WARN("multi value exist", K(ret), K(sql), K(exec_tenant_id), K(row));
 | 
						|
      } else {
 | 
						|
        ret = OB_SUCCESS;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_insert_row_(ObISQLClient &proxy, const ObIInnerTableRow &row,
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObDMLSqlSplicer dml;
 | 
						|
  ObSqlString sql;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
 | 
						|
  if (OB_FAIL(row.fill_dml(dml))) {
 | 
						|
    LOG_WARN("fail to fill dml", K(ret), K(this), K(row));
 | 
						|
  } else if (OB_FAIL(dml.splice_insert_sql(tname, sql))) {
 | 
						|
    LOG_WARN("failed to splice insert sql", K(ret), K(this), K(row));
 | 
						|
  } else if (OB_FAIL(proxy.write(exec_tenant_id, sql.ptr(), group_id_, affected_rows))) {
 | 
						|
    LOG_WARN("fail to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
  } else {
 | 
						|
    LOG_INFO("insert one row", K(row), K(affected_rows), K(sql));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_update_row_(ObISQLClient &proxy, const ObIInnerTableRow &row,
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObDMLSqlSplicer dml;
 | 
						|
  ObSqlString sql;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
 | 
						|
  if (OB_FAIL(row.fill_dml(dml))) {
 | 
						|
    LOG_WARN("fail to fill dml", K(ret), K(this), K(row));
 | 
						|
  } else if (OB_FAIL(dml.splice_update_sql(tname, sql))) {
 | 
						|
    LOG_WARN("failed to splice update sql", K(ret), K(this), K(row));
 | 
						|
  } else if (OB_FAIL(proxy.write(exec_tenant_id, sql.ptr(), group_id_, affected_rows))) {
 | 
						|
    LOG_WARN("fail to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
  } else {
 | 
						|
    LOG_INFO("update one row", K(row), K(affected_rows), K(sql));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_insert_or_update_row_(ObISQLClient &proxy, const ObIInnerTableRow &row,
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObDMLSqlSplicer dml;
 | 
						|
  ObSqlString sql;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
 | 
						|
  if (OB_FAIL(row.fill_dml(dml))) {
 | 
						|
    LOG_WARN("fail to fill dml", K(ret), K(this), K(row));
 | 
						|
  } else if (OB_FAIL(dml.splice_insert_update_sql(tname, sql))) {
 | 
						|
    LOG_WARN("failed to splice insert update sql", K(ret), K(this), K(row));
 | 
						|
  } else if (OB_FAIL(proxy.write(exec_tenant_id, sql.ptr(), group_id_, affected_rows))) {
 | 
						|
    LOG_WARN("fail to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
  } else {
 | 
						|
    LOG_INFO("insert/update one row", K(row), K(affected_rows), K(sql));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_delete_row_(
 | 
						|
    ObISQLClient &proxy, const ObIInnerTableKey &key, int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObDMLSqlSplicer dml;
 | 
						|
  ObSqlString sql;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
 | 
						|
  if (OB_FAIL(key.fill_pkey_dml(dml))) {
 | 
						|
    LOG_WARN("fail to fill pkey dml", K(ret), K(this), K(key));
 | 
						|
  } else if (OB_FAIL(dml.splice_delete_sql(tname, sql))) {
 | 
						|
    LOG_WARN("failed to splice delete sql", K(ret), K(this), K(key));
 | 
						|
  } else if (OB_FAIL(proxy.write(exec_tenant_id, sql.ptr(), group_id_, affected_rows))) {
 | 
						|
    LOG_WARN("fail to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
  } else {
 | 
						|
    LOG_INFO("delete one row", K(key), K(affected_rows), K(sql));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_get_column_(
 | 
						|
    ObISQLClient &proxy, const bool need_lock, const ObIInnerTableKey &key, 
 | 
						|
    ObIInnerTableCol &col) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
  ObSqlString predicates;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
  const char *column_name = col.get_column_name();
 | 
						|
 | 
						|
  if (OB_ISNULL(column_name)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("invalid col", K(ret), K(key), K(col), K(need_lock));
 | 
						|
  } else if (OB_FAIL(sql.assign_fmt("select %s from %s", column_name, tname))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(col), K(need_lock));
 | 
						|
  } else if (OB_FAIL(key.build_pkey_predicates(predicates))) {
 | 
						|
    LOG_WARN("fail to fill predicates", K(ret), K(key), K(col), K(need_lock));
 | 
						|
  } else if (OB_FAIL(sql.append_fmt(" where %s", predicates.ptr()))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(sql), K(predicates));
 | 
						|
  } else if (need_lock && OB_FAIL(sql.append_fmt(" for update"))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(key), K(col), K(need_lock));
 | 
						|
  } else {
 | 
						|
    HEAP_VAR(ObMySQLProxy::ReadResult, res) {
 | 
						|
      ObMySQLResult *result = NULL;
 | 
						|
      if (OB_FAIL(proxy.read(res, exec_tenant_id, sql.ptr(), group_id_))) {
 | 
						|
        LOG_WARN("failed to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_ISNULL(result = res.get_result())) {
 | 
						|
        ret = OB_ERR_UNEXPECTED;
 | 
						|
        LOG_WARN("result is null", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_FAIL(parse_one_column_(*result, col))) {
 | 
						|
        LOG_WARN("failed to parse one column", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_ITER_END != result->next()) {
 | 
						|
        ret = OB_ERR_UNEXPECTED;
 | 
						|
        LOG_WARN("multi value exist", K(ret), K(sql), K(exec_tenant_id), K(col));
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_get_int_column_(
 | 
						|
    ObISQLClient &proxy, const bool need_lock, const ObIInnerTableKey &key,
 | 
						|
    const char *column_name, int64_t &value) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
  ObSqlString predicates;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
 | 
						|
  if (OB_FAIL(sql.assign_fmt("select %s from %s", column_name, tname))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(this), K(key), K(column_name));
 | 
						|
  } else if (OB_FAIL(key.build_pkey_predicates(predicates))) {
 | 
						|
    LOG_WARN("fail to fill predicates", K(ret), K(this), K(key), K(column_name));
 | 
						|
  } else if (OB_FAIL(sql.append_fmt(" where %s", predicates.ptr()))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(sql), K(predicates));
 | 
						|
  } else if (need_lock && OB_FAIL(sql.append_fmt(" for update"))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(this), K(key), K(column_name));
 | 
						|
  } else {
 | 
						|
    HEAP_VAR(ObMySQLProxy::ReadResult, res) {
 | 
						|
      ObMySQLResult *result = NULL;
 | 
						|
      if (OB_FAIL(proxy.read(res, exec_tenant_id, sql.ptr(), group_id_))) {
 | 
						|
        LOG_WARN("failed to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_ISNULL(result = res.get_result())) {
 | 
						|
        ret = OB_ERR_UNEXPECTED;
 | 
						|
        LOG_WARN("result is null", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_FAIL(parse_one_column_(*result, column_name, value))) {
 | 
						|
        LOG_WARN("failed to parse one column", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_ITER_END != result->next()) {
 | 
						|
        ret = OB_ERR_UNEXPECTED;
 | 
						|
        LOG_WARN("multi value exist", K(ret), K(sql), K(exec_tenant_id), K(value));
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_get_string_column_(
 | 
						|
    common::ObISQLClient &proxy, 
 | 
						|
    const bool need_lock, 
 | 
						|
    const ObIInnerTableKey &key,
 | 
						|
    const char *column_name,
 | 
						|
    StringValueType &value) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
  ObSqlString predicates;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
 | 
						|
  if (OB_FAIL(sql.assign_fmt("select %s from %s", column_name, tname))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(this), K(key), K(column_name));
 | 
						|
  } else if (OB_FAIL(key.build_pkey_predicates(predicates))) {
 | 
						|
    LOG_WARN("fail to fill predicates", K(ret), K(this), K(key), K(column_name));
 | 
						|
  } else if (OB_FAIL(sql.append_fmt(" where %s", predicates.ptr()))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(sql), K(predicates));
 | 
						|
  } else if (need_lock && OB_FAIL(sql.append_fmt(" for update"))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(this), K(key), K(column_name));
 | 
						|
  } else {
 | 
						|
    HEAP_VAR(ObMySQLProxy::ReadResult, res) {
 | 
						|
      ObMySQLResult *result = NULL;
 | 
						|
      if (OB_FAIL(proxy.read(res, exec_tenant_id, sql.ptr(), group_id_))) {
 | 
						|
        LOG_WARN("failed to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_ISNULL(result = res.get_result())) {
 | 
						|
        ret = OB_ERR_UNEXPECTED;
 | 
						|
        LOG_WARN("result is null", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_FAIL(parse_one_column_(*result, column_name, value))) {
 | 
						|
        LOG_WARN("failed to parse one column", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
      } else if (OB_ITER_END != result->next()) {
 | 
						|
        ret = OB_ERR_UNEXPECTED;
 | 
						|
        LOG_WARN("multi value exist", K(ret), K(sql), K(exec_tenant_id), K(value));
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_increase_column_by_(
 | 
						|
    common::ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const char *column_name, const int64_t value,
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
  ObSqlString predicates;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
 | 
						|
  if (OB_FAIL(sql.assign_fmt("update %s set %s=%s+%ld", tname, column_name, column_name, value))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_FAIL(key.build_pkey_predicates(predicates))) {
 | 
						|
    LOG_WARN("fail to fill predicates", K(ret), K(key), K(column_name), K(value));
 | 
						|
  } else if (OB_FAIL(sql.append_fmt(" where %s", predicates.ptr()))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(sql), K(predicates));
 | 
						|
  } else if (OB_FAIL(proxy.write(exec_tenant_id, sql.ptr(), group_id_, affected_rows))) {
 | 
						|
    LOG_WARN("fail to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
  } else {
 | 
						|
    LOG_INFO("update one column", K(key), K(column_name), K(value), K(affected_rows), K(sql));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_update_column_(
 | 
						|
    common::ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const char *assignments /* c1=v1, c2=v2 */, int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
  ObSqlString predicates;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
 | 
						|
  if (OB_ISNULL(assignments)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("assignments not valid ", K(ret), K(key), K(assignments));
 | 
						|
  } else if (OB_FAIL(sql.assign_fmt("update %s set %s", tname, assignments))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(assignments));
 | 
						|
  } else if (OB_FAIL(key.build_pkey_predicates(predicates))) {
 | 
						|
    LOG_WARN("fail to fill predicates", K(ret), K(key), K(assignments));
 | 
						|
  } else if (OB_FAIL(sql.append_fmt(" where %s", predicates.ptr()))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(sql), K(predicates));
 | 
						|
  } else if (OB_FAIL(proxy.write(exec_tenant_id, sql.ptr(), group_id_, affected_rows))) {
 | 
						|
    LOG_WARN("fail to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
  } else {
 | 
						|
    LOG_INFO("update one column", K(key), K(assignments), K(affected_rows), K(sql));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::do_compare_and_swap_(
 | 
						|
    common::ObISQLClient &proxy, const ObIInnerTableKey &key, 
 | 
						|
    const char *assignments/* c1=v1, c2=v2 */, const char *predicates/* c3=v3 AND c4=v4 */, 
 | 
						|
    int64_t &affected_rows) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  ObSqlString sql;
 | 
						|
  ObSqlString pkey_predicates;
 | 
						|
 | 
						|
  const uint64_t exec_tenant_id = get_exec_tenant_id();
 | 
						|
  const char *tname = get_table_name();
 | 
						|
 | 
						|
  if (OB_ISNULL(assignments)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("assignments not valid ", K(ret), K(key), K(assignments), K(predicates));
 | 
						|
  } else if (OB_ISNULL(predicates)) {
 | 
						|
    ret = OB_INVALID_ARGUMENT;
 | 
						|
    LOG_WARN("predicates not valid ", K(ret), K(key), K(assignments), K(predicates));
 | 
						|
  } else if (OB_FAIL(sql.assign_fmt("update %s set %s", tname, assignments))) {
 | 
						|
    LOG_WARN("fail to assign sql", K(ret), K(key), K(assignments), K(predicates));
 | 
						|
  } else if (OB_FAIL(key.build_pkey_predicates(pkey_predicates))) {
 | 
						|
    LOG_WARN("fail to fill pkey_predicates", K(ret), K(key), K(assignments), K(predicates));
 | 
						|
  } else if (OB_FAIL(sql.append_fmt(" where %s", pkey_predicates.ptr()))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(sql), K(pkey_predicates));
 | 
						|
  } else if (OB_FAIL(sql.append_fmt(" and %s", predicates))) {
 | 
						|
    LOG_WARN("failed to append sql", K(ret), K(sql), K(assignments), K(predicates));
 | 
						|
  } else if (OB_FAIL(proxy.write(exec_tenant_id, sql.ptr(), group_id_, affected_rows))) {
 | 
						|
    LOG_WARN("fail to exec sql", K(ret), K(sql), K(exec_tenant_id));
 | 
						|
  } else {
 | 
						|
    LOG_INFO("compare and swap one column", K(key), K(assignments), K(predicates), K(affected_rows), K(sql));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::parse_one_row_(sqlclient::ObMySQLResult &result, ObIInnerTableRow &row) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (OB_FAIL(result.next())) {
 | 
						|
    if (OB_ITER_END == ret) {
 | 
						|
      ret = OB_ENTRY_NOT_EXIST;
 | 
						|
    }
 | 
						|
    LOG_WARN("no row exist", K(ret));
 | 
						|
  } else if (OB_FAIL(row.parse_from(result))) {
 | 
						|
    LOG_WARN("failed to parse row", K(ret));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::parse_one_column_(
 | 
						|
    sqlclient::ObMySQLResult &result, const char *column_name, int64_t &value) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (OB_FAIL(result.next())) {
 | 
						|
    if (OB_ITER_END == ret) {
 | 
						|
      ret = OB_ENTRY_NOT_EXIST;
 | 
						|
    }
 | 
						|
    LOG_WARN("no row exist", K(ret));
 | 
						|
  } else {
 | 
						|
    EXTRACT_INT_FIELD_MYSQL(result, column_name, value, int64_t);
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::parse_one_column_(
 | 
						|
    ObMySQLResult &result, const char *column_name, StringValueType &value) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (OB_FAIL(result.next())) {
 | 
						|
    if (OB_ITER_END == ret) {
 | 
						|
      ret = OB_ENTRY_NOT_EXIST;
 | 
						|
    }
 | 
						|
    LOG_WARN("no row exist", K(ret));
 | 
						|
  } else {
 | 
						|
    ObString field;
 | 
						|
    EXTRACT_VARCHAR_FIELD_MYSQL(result, column_name, field);
 | 
						|
    if (OB_FAIL(ret)) {
 | 
						|
    } else if (OB_FAIL(value.assign(field))) {
 | 
						|
      LOG_WARN("failed to assign value", K(ret), K(field));
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
int ObInnerTableOperator::parse_one_column_(
 | 
						|
    ObMySQLResult &result, ObIInnerTableCol &col) const
 | 
						|
{
 | 
						|
  int ret = OB_SUCCESS;
 | 
						|
  if (OB_FAIL(result.next())) {
 | 
						|
    if (OB_ITER_END == ret) {
 | 
						|
      ret = OB_ENTRY_NOT_EXIST;
 | 
						|
    }
 | 
						|
    LOG_WARN("no row exist", K(ret));
 | 
						|
  } else if (OB_FAIL(col.parse_value_from(result))) {
 | 
						|
    LOG_WARN("failed to parse col", K(ret));
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 |