#include <cstring>
#include "binding.hpp"
#include "rust_callbacks.hpp"
#include "sql/handler.h"
#include "sql/opt_costconstants.h"
namespace {
bool rusty_hton_is_dict_readonly() { return rust__hton__is_dict_readonly(); }
bool rusty_hton_rm_tmp_tables(handlerton *, THD *thd, List<LEX_STRING> *) {
return rust__hton__rm_tmp_tables(static_cast<const void *>(thd));
}
void rusty_hton_replace_native_transaction_in_thd(THD *thd, void *new_trx_arg,
void **ptr_trx_arg) {
rust__hton__replace_native_transaction_in_thd(static_cast<const void *>(thd),
new_trx_arg, ptr_trx_arg);
}
bool rusty_hton_rotate_encryption_master_key() {
return rust__hton__rotate_encryption_master_key();
}
bool rusty_hton_redo_log_set_state(THD *thd, bool enable) {
return rust__hton__redo_log_set_state(static_cast<const void *>(thd), enable);
}
void rusty_hton_post_ddl(THD *thd) {
rust__hton__post_ddl(static_cast<const void *>(thd));
}
void rusty_hton_post_recover() { rust__hton__post_recover(); }
int rusty_hton_push_to_engine(THD *thd, AccessPath *query, JOIN *join) {
return rust__hton__push_to_engine(static_cast<const void *>(thd),
static_cast<const void *>(query),
static_cast<const void *>(join));
}
class RustySECostConstants : public SE_cost_constants {
public:
RustySECostConstants(Optimizer opt, double mem_cost, double io_cost)
: SE_cost_constants(opt) {
update({"memory_block_read_cost", 22}, mem_cost);
update({"io_block_read_cost", 18}, io_cost);
}
};
bool rusty_hton_get_index_column_cardinality(
const char *db_name, const char *table_name, const char *index_name,
uint index_ordinal_position, uint column_ordinal_position,
dd::Object_id se_private_id, ulonglong *cardinality) {
if (!db_name || !table_name || !index_name || !cardinality) return true;
uint64_t card = 0;
if (rust__hton__get_index_column_cardinality(
reinterpret_cast<const uint8_t *>(db_name), std::strlen(db_name),
reinterpret_cast<const uint8_t *>(table_name), std::strlen(table_name),
reinterpret_cast<const uint8_t *>(index_name), std::strlen(index_name),
static_cast<uint32_t>(index_ordinal_position),
static_cast<uint32_t>(column_ordinal_position),
static_cast<uint64_t>(se_private_id), &card)) {
return true;
}
*cardinality = static_cast<ulonglong>(card);
return false;
}
bool rusty_hton_get_table_statistics(const char *db_name,
const char *table_name,
dd::Object_id se_private_id,
const dd::Properties &,
const dd::Properties &, uint flags,
ha_statistics *stats) {
if (!db_name || !table_name || !stats) return true;
return rust__hton__get_table_statistics(
reinterpret_cast<const uint8_t *>(db_name), std::strlen(db_name),
reinterpret_cast<const uint8_t *>(table_name), std::strlen(table_name),
static_cast<uint64_t>(se_private_id), static_cast<uint32_t>(flags),
static_cast<void *>(stats));
}
bool rusty_hton_get_tablespace_statistics(const char *tablespace_name,
const char *file_name,
const dd::Properties &,
ha_tablespace_statistics *stats) {
if (!tablespace_name || !file_name || !stats) return true;
return rust__hton__get_tablespace_statistics(
reinterpret_cast<const uint8_t *>(tablespace_name),
std::strlen(tablespace_name),
reinterpret_cast<const uint8_t *>(file_name), std::strlen(file_name),
static_cast<void *>(stats));
}
SE_cost_constants *rusty_hton_get_cost_constants(uint storage_category) {
double mem_cost = 0.0;
double io_cost = 0.0;
if (!rust__hton__get_cost_constants(static_cast<uint32_t>(storage_category),
&mem_cost, &io_cost)) {
return nullptr;
}
if (mem_cost <= 0.0 || io_cost <= 0.0) {
return nullptr;
}
return new RustySECostConstants(Optimizer::kOriginal, mem_cost, io_cost);
}
}
extern "C" void mysql__hton__set_table_statistics(
void *stats_void, uint64_t records, uint64_t data_file_length,
uint64_t max_data_file_length, uint64_t index_file_length,
uint64_t max_index_file_length, uint64_t delete_length,
uint64_t auto_increment_value, uint64_t deleted, uint64_t mean_rec_length,
int64_t create_time, uint64_t check_time, uint64_t update_time,
uint32_t block_size) {
if (!stats_void) return;
auto *stats = static_cast<ha_statistics *>(stats_void);
stats->records = static_cast<ha_rows>(records);
stats->data_file_length = data_file_length;
stats->max_data_file_length = max_data_file_length;
stats->index_file_length = index_file_length;
stats->max_index_file_length = max_index_file_length;
stats->delete_length = delete_length;
stats->auto_increment_value = auto_increment_value;
stats->deleted = static_cast<ha_rows>(deleted);
stats->mean_rec_length = static_cast<ulong>(mean_rec_length);
stats->create_time = static_cast<time_t>(create_time);
stats->check_time = static_cast<ulong>(check_time);
stats->update_time = static_cast<ulong>(update_time);
stats->block_size = block_size;
}
extern "C" void mysql__hton__set_tablespace_statistics(
void *stats_void, uint64_t id, uint64_t logfile_group_number,
uint64_t free_extents, uint64_t total_extents, uint64_t extent_size,
uint64_t initial_size, uint64_t maximum_size, uint64_t autoextend_size,
uint64_t version, uint64_t data_free) {
if (!stats_void) return;
auto *stats = static_cast<ha_tablespace_statistics *>(stats_void);
stats->m_id = id;
stats->m_logfile_group_number = logfile_group_number;
stats->m_free_extents = free_extents;
stats->m_total_extents = total_extents;
stats->m_extent_size = extent_size;
stats->m_initial_size = initial_size;
stats->m_maximum_size = maximum_size;
stats->m_autoextend_size = autoextend_size;
stats->m_version = version;
stats->m_data_free = data_free;
}
void rusty_hton_wire_misc(handlerton *hton) {
hton->is_dict_readonly = rusty_hton_is_dict_readonly;
hton->rm_tmp_tables = rusty_hton_rm_tmp_tables;
hton->post_ddl = rusty_hton_post_ddl;
hton->post_recover = rusty_hton_post_recover;
hton->push_to_engine = rusty_hton_push_to_engine;
hton->get_cost_constants = rusty_hton_get_cost_constants;
hton->get_table_statistics = rusty_hton_get_table_statistics;
hton->get_index_column_cardinality = rusty_hton_get_index_column_cardinality;
hton->get_tablespace_statistics = rusty_hton_get_tablespace_statistics;
}
void rusty_hton_wire_encryption(handlerton *hton) {
hton->rotate_encryption_master_key = rusty_hton_rotate_encryption_master_key;
}
void rusty_hton_wire_redo_log_set_state(handlerton *hton) {
hton->redo_log_set_state = rusty_hton_redo_log_set_state;
}