#![allow(unsafe_code)]
use core::ffi::c_void;
use crate::panic_guard::FfiBoundary;
use crate::runtime::{EngineContext, FfiPtr};
use crate::sys;
fn result_code(result: crate::engine::EngineResult) -> i32 {
match result {
Ok(()) => 0,
Err(e) => e.to_mysql_errno(),
}
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__multi_range_read_info_const(
ctx: *mut EngineContext,
keyno: u32,
seq: *const sys::RangeSeqIf,
seq_init_param: *mut c_void,
n_ranges: u32,
cost: *const sys::CostEstimate,
out_rows: *mut u64,
) -> bool {
FfiBoundary::run_default(false, || {
let engine = unsafe { &mut *ctx }.engine_mut();
let seq = unsafe { seq.as_ref() };
let cost = unsafe { cost.as_ref() };
match engine.multi_range_read_info_const(keyno, seq, seq_init_param, n_ranges, cost) {
Some(rows) => {
if !out_rows.is_null() {
unsafe { *out_rows = rows };
}
true
}
None => false,
}
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__multi_range_read_info(
ctx: *mut EngineContext,
keyno: u32,
n_ranges: u32,
keys: u32,
cost: *const sys::CostEstimate,
out_rows: *mut u64,
) -> bool {
FfiBoundary::run_default(false, || {
let engine = unsafe { &mut *ctx }.engine_mut();
let cost = unsafe { cost.as_ref() };
match engine.multi_range_read_info(keyno, n_ranges, keys, cost) {
Some(rows) => {
if !out_rows.is_null() {
unsafe { *out_rows = rows };
}
true
}
None => false,
}
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__multi_range_read_init(
ctx: *mut EngineContext,
seq: *const sys::RangeSeqIf,
seq_init_param: *mut c_void,
n_ranges: u32,
mode: u32,
buf: *const sys::HandlerBuffer,
out_result: *mut i32,
) -> bool {
FfiBoundary::run_default(false, || {
let engine = unsafe { &mut *ctx }.engine_mut();
let seq = unsafe { seq.as_ref() };
let buf = unsafe { buf.as_ref() };
match engine.multi_range_read_init(seq, seq_init_param, n_ranges, mode, buf) {
Some(result) => {
if !out_result.is_null() {
unsafe { *out_result = result_code(result) };
}
true
}
None => false,
}
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__multi_range_read_next(
ctx: *mut EngineContext,
buf: *mut u8,
buf_len: usize,
range_info: *mut *mut c_void,
out_result: *mut i32,
) -> bool {
FfiBoundary::run_default(false, || {
let engine = unsafe { &mut *ctx }.engine_mut();
let buf = unsafe { FfiPtr::slice_mut(buf, buf_len) };
match engine.multi_range_read_next(buf, range_info) {
Some(result) => {
if !out_result.is_null() {
unsafe { *out_result = result_code(result) };
}
true
}
None => false,
}
})
}