mysql-server/sql/server_component/mysql_command_delegates.cc
2025-03-05 14:31:37 +07:00

176 lines
7.2 KiB
C++

/* Copyright (c) 2022, 2024, Oracle and/or its affiliates.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2.0,
* as published by the Free Software Foundation.
*
* This program is designed to work with certain software (including
* but not limited to OpenSSL) that is licensed under separate terms,
* as designated in a particular file or component or in included license
* documentation. The authors of MySQL hereby grant you an additional
* permission to link the program and your derivative works with the
* separately licensed software that they have either included with
* the program or referenced in the documentation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License, version 2.0, for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "mysql_command_delegates.h"
#include "include/my_byteorder.h"
#include "include/my_sys.h"
#include "include/my_time.h"
#include "include/mysqld_error.h"
#include "include/sql_common.h"
#include "mysql_command_services_imp.h"
#include "sql-common/my_decimal.h"
Command_delegate::Command_delegate(void *srv, SRV_CTX_H srv_ctx_h)
: m_srv(srv), m_srv_ctx_h(srv_ctx_h), m_callbacks() {
assert(srv != nullptr);
assert(m_srv_ctx_h != nullptr);
}
Command_delegate::~Command_delegate() {}
Callback_command_delegate::Callback_command_delegate(void *srv,
SRV_CTX_H srv_ctx_h)
: Command_delegate(srv, srv_ctx_h) {}
int Callback_command_delegate::start_result_metadata(
uint32_t num_cols, uint32_t flags, const CHARSET_INFO *resultcs) {
return ((class mysql_command_consumer_refs *)(m_srv))
->metadata_srv->start_result_metadata(m_srv_ctx_h, num_cols, flags,
resultcs->csname);
}
int Callback_command_delegate::field_metadata(struct st_send_field *field,
const CHARSET_INFO *charset) {
assert(field);
Field_metadata fm{field->db_name, field->table_name,
field->org_table_name, field->col_name,
field->org_col_name, field->length,
field->charsetnr, field->flags,
field->decimals, field->type};
return ((class mysql_command_consumer_refs *)(m_srv))
->metadata_srv->field_metadata(m_srv_ctx_h, &fm, charset->csname);
}
int Callback_command_delegate::end_result_metadata(uint server_status,
uint warn_count) {
return ((class mysql_command_consumer_refs *)(m_srv))
->metadata_srv->end_result_metadata(m_srv_ctx_h, server_status,
warn_count);
}
int Callback_command_delegate::start_row() {
return ((class mysql_command_consumer_refs *)(m_srv))
->row_factory_srv->start_row(m_srv_ctx_h);
}
int Callback_command_delegate::end_row() {
return ((class mysql_command_consumer_refs *)(m_srv))
->row_factory_srv->end_row(m_srv_ctx_h);
}
void Callback_command_delegate::abort_row() {
((class mysql_command_consumer_refs *)(m_srv))
->row_factory_srv->abort_row(m_srv_ctx_h);
}
ulong Callback_command_delegate::get_client_capabilities() {
unsigned long capabilities;
((class mysql_command_consumer_refs *)(m_srv))
->client_capabilities_srv->client_capabilities(m_srv_ctx_h,
&capabilities);
return capabilities;
}
/****** Getting data ******/
int Callback_command_delegate::get_null() {
return ((class mysql_command_consumer_refs *)(m_srv))
->get_null_srv->get(m_srv_ctx_h);
}
int Callback_command_delegate::get_integer(longlong value) {
return ((class mysql_command_consumer_refs *)(m_srv))
->get_integer_srv->get(m_srv_ctx_h, value);
}
int Callback_command_delegate::get_longlong(longlong value,
unsigned int unsigned_flag) {
return ((class mysql_command_consumer_refs *)(m_srv))
->get_longlong_srv->get(m_srv_ctx_h, value, unsigned_flag);
}
int Callback_command_delegate::get_decimal(const decimal_t *value) {
decimal_t *decimal = const_cast<decimal_t *>(value);
return ((class mysql_command_consumer_refs *)(m_srv))
->get_decimal_srv->get(m_srv_ctx_h,
reinterpret_cast<DECIMAL_T_H>(decimal));
}
int Callback_command_delegate::get_double(double value, unsigned int decimals) {
return ((class mysql_command_consumer_refs *)(m_srv))
->get_double_srv->get(m_srv_ctx_h, value, decimals);
}
int Callback_command_delegate::get_date(const MYSQL_TIME *value) {
MYSQL_TIME *date = const_cast<MYSQL_TIME *>(value);
return ((class mysql_command_consumer_refs *)(m_srv))
->get_date_time_srv->get_date(m_srv_ctx_h,
reinterpret_cast<MYSQL_TIME_H>(date));
}
int Callback_command_delegate::get_time(const MYSQL_TIME *value,
unsigned int precision) {
MYSQL_TIME *time = const_cast<MYSQL_TIME *>(value);
return ((class mysql_command_consumer_refs *)(m_srv))
->get_date_time_srv->get_time(
m_srv_ctx_h, reinterpret_cast<MYSQL_TIME_H>(time), precision);
}
int Callback_command_delegate::get_datetime(const MYSQL_TIME *value,
unsigned int precision) {
MYSQL_TIME *date_time = const_cast<MYSQL_TIME *>(value);
return ((class mysql_command_consumer_refs *)(m_srv))
->get_date_time_srv->get_datatime(
m_srv_ctx_h, reinterpret_cast<MYSQL_TIME_H>(date_time), precision);
}
int Callback_command_delegate::get_string(const char *const value,
size_t length,
const CHARSET_INFO *const valuecs) {
return ((class mysql_command_consumer_refs *)(m_srv))
->get_string_srv->get_string(m_srv_ctx_h, value, length, valuecs->csname);
}
void Callback_command_delegate::handle_ok(unsigned int server_status,
unsigned int statement_warn_count,
unsigned long long affected_rows,
unsigned long long last_insert_id,
const char *const message) {
((class mysql_command_consumer_refs *)(m_srv))
->error_srv->handle_ok(m_srv_ctx_h, server_status, statement_warn_count,
affected_rows, last_insert_id, message);
}
/*
Command ended with ERROR
@param sql_errno Error code
@param err_msg Error message
@param sqlstate SQL state corresponding to the error code
*/
void Callback_command_delegate::handle_error(uint sql_errno,
const char *const err_msg,
const char *const sqlstate) {
((class mysql_command_consumer_refs *)(m_srv))
->error_srv->handle_error(m_srv_ctx_h, sql_errno, err_msg, sqlstate);
}