#![allow(unsafe_code)]
use crate::engine::ResetCachedState;
use crate::panic_guard::FfiBoundary;
use crate::runtime::{EngineContext, FfiPtr};
use crate::sys;
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__delete_table(
ctx: *mut EngineContext,
name: *const u8,
name_len: usize,
table_def: *const sys::DdTable,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let name = unsafe { FfiPtr::bytes_to_str(name, name_len) }?;
let table_def = unsafe { table_def.as_ref() };
engine.delete_table(name, table_def)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__rename_table(
ctx: *mut EngineContext,
from: *const u8,
from_len: usize,
to: *const u8,
to_len: usize,
from_def: *const sys::DdTable,
to_def: *const sys::DdTable,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let from = unsafe { FfiPtr::bytes_to_str(from, from_len) }?;
let to = unsafe { FfiPtr::bytes_to_str(to, to_len) }?;
let from_def = unsafe { from_def.as_ref() };
let to_def = unsafe { to_def.as_ref() };
engine.rename_table(from, to, from_def, to_def)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__drop_table(
ctx: *mut EngineContext,
name: *const u8,
name_len: usize,
) {
FfiBoundary::run_void(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let name = match unsafe { FfiPtr::bytes_to_str(name, name_len) } {
Ok(s) => s,
Err(_) => {
tracing::warn!("drop_table: invalid utf-8 in table name");
return;
}
};
engine.drop_table(name);
});
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__truncate(
ctx: *mut EngineContext,
table_def: *const sys::DdTable,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let table_def = unsafe { table_def.as_ref() };
engine.truncate(table_def)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__change_table_ptr(
ctx: *mut EngineContext,
table: *const sys::TABLE,
share: *const sys::TABLE_SHARE,
) {
FfiBoundary::run_void(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let table = unsafe { table.as_ref() };
let share = unsafe { share.as_ref() };
engine.change_table_ptr(table, share);
});
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__get_se_private_data(
ctx: *mut EngineContext,
dd_table: *const sys::DdTable,
reset: bool,
) -> bool {
FfiBoundary::run_default(false, || {
let engine = unsafe { &mut *ctx }.engine_mut();
let dd_table = unsafe { dd_table.as_ref() };
engine.se_private_data(dd_table, ResetCachedState::from(reset))
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__get_extra_columns_and_keys(
ctx: *mut EngineContext,
create_info: *const sys::HA_CREATE_INFO,
create_list: *const sys::ListCreateField,
key_info: *const sys::KEY,
key_count: u32,
table_obj: *const sys::DdTable,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let create_info = unsafe { create_info.as_ref() };
let create_list = unsafe { create_list.as_ref() };
let key_info = unsafe { key_info.as_ref() };
let table_obj = unsafe { table_obj.as_ref() };
engine.extra_columns_and_keys(create_info, create_list, key_info, key_count, table_obj)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__upgrade_table(
ctx: *mut EngineContext,
thd: *const sys::THD,
dbname: *const u8,
dbname_len: usize,
table_name: *const u8,
table_name_len: usize,
dd_table: *const sys::DdTable,
) -> bool {
FfiBoundary::run_default(true, || {
let engine = unsafe { &mut *ctx }.engine_mut();
let thd = unsafe { thd.as_ref() };
let dd_table = unsafe { dd_table.as_ref() };
let dbname = match unsafe { FfiPtr::bytes_to_str(dbname, dbname_len) } {
Ok(s) => s,
Err(_) => {
tracing::warn!("upgrade_table: invalid utf-8 in dbname");
return true;
}
};
let table_name = match unsafe { FfiPtr::bytes_to_str(table_name, table_name_len) } {
Ok(s) => s,
Err(_) => {
tracing::warn!("upgrade_table: invalid utf-8 in table name");
return true;
}
};
match engine.upgrade_table(thd, dbname, table_name, dd_table) {
Ok(()) => false,
Err(_) => true,
}
})
}