#![allow(unsafe_code)]
use core::ffi::c_void;
use crate::engine::EngineError;
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__bulk_load_check(
ctx: *mut EngineContext,
thd: *const sys::THD,
) -> bool {
FfiBoundary::run_default(false, || {
let engine = unsafe { &mut *ctx }.engine_mut();
engine.bulk_load_check(unsafe { thd.as_ref() })
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__bulk_load_available_memory(
ctx: *mut EngineContext,
thd: *const sys::THD,
) -> usize {
FfiBoundary::run_default(0, || {
let engine = unsafe { &mut *ctx }.engine_mut();
engine.bulk_load_available_memory(unsafe { thd.as_ref() })
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__bulk_load_begin(
ctx: *mut EngineContext,
thd: *const sys::THD,
data_size: usize,
memory: usize,
num_threads: usize,
) -> *mut c_void {
FfiBoundary::run_default(core::ptr::null_mut(), || {
let engine = unsafe { &mut *ctx }.engine_mut();
let thd = unsafe { thd.as_ref() };
engine.bulk_load_begin(thd, data_size, memory, num_threads)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__bulk_load_execute(
ctx: *mut EngineContext,
thd: *const sys::THD,
load_ctx: *mut c_void,
thread_idx: usize,
rows: *const sys::RowsMysql,
stat_callbacks: *const sys::BulkLoadStatCallbacks,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let thd = unsafe { thd.as_ref() };
let rows = unsafe { rows.as_ref() };
let stat_callbacks = unsafe { stat_callbacks.as_ref() };
engine.bulk_load_execute(thd, load_ctx, thread_idx, rows, stat_callbacks)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__bulk_load_end(
ctx: *mut EngineContext,
thd: *const sys::THD,
load_ctx: *mut c_void,
is_error: bool,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let thd = unsafe { thd.as_ref() };
engine.bulk_load_end(thd, load_ctx, is_error)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__load_table(
ctx: *mut EngineContext,
table: *const sys::TABLE,
skip_metadata_update: *mut bool,
) -> i32 {
FfiBoundary::run_default(EngineError::Internal.to_mysql_errno(), || {
let engine = unsafe { &mut *ctx }.engine_mut();
let table = unsafe { table.as_ref() };
match engine.load_table(table) {
Ok(skip) => {
if !skip_metadata_update.is_null() {
unsafe { *skip_metadata_update = skip };
}
0
}
Err(e) => e.to_mysql_errno(),
}
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__unload_table(
ctx: *mut EngineContext,
db_name: *const u8,
db_name_len: usize,
table_name: *const u8,
table_name_len: usize,
error_if_not_loaded: bool,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let db_name = unsafe { FfiPtr::bytes_to_str(db_name, db_name_len) }?;
let table_name = unsafe { FfiPtr::bytes_to_str(table_name, table_name_len) }?;
engine.unload_table(db_name, table_name, error_if_not_loaded)
})
}