#![allow(unsafe_code)]
use core::ffi::c_void;
use super::report::{report_bool, report_i32};
use crate::panic_guard::FfiBoundary;
use crate::runtime::EngineContext;
use crate::sys;
unsafe extern "C" {
fn mysql__std_string__assign(s: *mut c_void, bytes: *const u8, len: usize);
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__real_row_type(
ctx: *mut EngineContext,
create_info: *const sys::HA_CREATE_INFO,
out: *mut i32,
) -> bool {
FfiBoundary::run_default(false, || {
let engine = unsafe { &mut *ctx }.engine_mut();
let create_info = unsafe { create_info.as_ref() };
report_i32(out, engine.real_row_type(create_info))
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__default_index_algorithm(
ctx: *mut EngineContext,
out: *mut i32,
) -> bool {
FfiBoundary::run_default(false, || {
report_i32(
out,
unsafe { &mut *ctx }.engine_mut().default_index_algorithm(),
)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__is_index_algorithm_supported(
ctx: *mut EngineContext,
key_alg: i32,
out: *mut bool,
) -> bool {
FfiBoundary::run_default(false, || {
let engine = unsafe { &mut *ctx }.engine_mut();
report_bool(out, engine.is_index_algorithm_supported(key_alg))
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__record_buffer_wanted(
ctx: *mut EngineContext,
max_rows: *mut u64,
) -> bool {
FfiBoundary::run_default(false, || {
match unsafe { &mut *ctx }.engine_mut().record_buffer_wanted() {
Some(n) => {
if !max_rows.is_null() {
unsafe { *max_rows = n };
}
true
}
None => false,
}
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__explain_extra(
ctx: *mut EngineContext,
out: *mut c_void,
) -> bool {
FfiBoundary::run_default(false, || {
match unsafe { &mut *ctx }.engine_mut().explain_extra() {
Some(s) => {
unsafe { mysql__std_string__assign(out, s.as_ptr(), s.len()) };
true
}
None => false,
}
})
}