#![allow(unsafe_code)]
use core::ffi::c_void;
use crate::engine::{EngineError, SamplingMethod};
use crate::panic_guard::FfiBoundary;
use crate::runtime::{EngineContext, FfiPtr};
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__sample_init(
ctx: *mut EngineContext,
scan_ctx: *mut *mut c_void,
sampling_percentage: f64,
sampling_seed: i32,
sampling_method: i32,
tablesample: bool,
) -> i32 {
FfiBoundary::run_default(EngineError::Internal.to_mysql_errno(), || {
let engine = unsafe { &mut *ctx }.engine_mut();
let method = SamplingMethod::from_raw(sampling_method);
match engine.sample_init(sampling_percentage, sampling_seed, method, tablesample) {
Ok(engine_ctx) => {
if !scan_ctx.is_null() {
unsafe { *scan_ctx = engine_ctx };
}
0
}
Err(e) => e.to_mysql_errno(),
}
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__sample_next(
ctx: *mut EngineContext,
scan_ctx: *mut c_void,
buf: *mut u8,
buf_len: usize,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let buf = unsafe { FfiPtr::slice_mut(buf, buf_len) };
engine.sample_next(scan_ctx, buf)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__sample_end(
ctx: *mut EngineContext,
scan_ctx: *mut c_void,
) -> i32 {
FfiBoundary::run(|| {
unsafe { &mut *ctx }.engine_mut().sample_end(scan_ctx)
})
}