#![allow(unsafe_code)]
use crate::engine::{RKeyFunction, RangeKey};
use crate::panic_guard::FfiBoundary;
use crate::runtime::{EngineContext, FfiPtr};
const HA_POS_ERROR: u64 = u64::MAX;
unsafe fn key_slice<'a>(key: *const u8, key_len: usize) -> &'a [u8] {
if key.is_null() {
&[][..]
} else {
unsafe { FfiPtr::slice_const(key, key_len) }
}
}
unsafe fn range_key<'a>(key: *const u8, key_len: usize, flag: i32) -> Option<RangeKey<'a>> {
if key.is_null() {
None
} else {
let bytes = unsafe { FfiPtr::slice_const(key, key_len) };
Some(RangeKey::new(bytes, RKeyFunction::from_raw(flag)))
}
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__index_read(
ctx: *mut EngineContext,
buf: *mut u8,
buf_len: usize,
key: *const u8,
key_len: usize,
find_flag: i32,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let buf = unsafe { FfiPtr::slice_mut(buf, buf_len) };
let key = unsafe { key_slice(key, key_len) };
engine.index_read(buf, key, RKeyFunction::from_raw(find_flag))
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__index_read_idx_map(
ctx: *mut EngineContext,
buf: *mut u8,
buf_len: usize,
index: u32,
key: *const u8,
key_len: usize,
find_flag: i32,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let buf = unsafe { FfiPtr::slice_mut(buf, buf_len) };
let key = unsafe { key_slice(key, key_len) };
engine.index_read_idx_map(buf, index, key, RKeyFunction::from_raw(find_flag))
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__index_read_last(
ctx: *mut EngineContext,
buf: *mut u8,
buf_len: usize,
key: *const u8,
key_len: usize,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let buf = unsafe { FfiPtr::slice_mut(buf, buf_len) };
let key = unsafe { key_slice(key, key_len) };
engine.index_read_last(buf, key)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__index_read_last_map(
ctx: *mut EngineContext,
buf: *mut u8,
buf_len: usize,
key: *const u8,
key_len: usize,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let buf = unsafe { FfiPtr::slice_mut(buf, buf_len) };
let key = unsafe { key_slice(key, key_len) };
engine.index_read_last_map(buf, key)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
#[allow(clippy::too_many_arguments)]
pub unsafe extern "C" fn rust__handler__read_range_first(
ctx: *mut EngineContext,
buf: *mut u8,
buf_len: usize,
start_key: *const u8,
start_len: usize,
start_flag: i32,
end_key: *const u8,
end_len: usize,
end_flag: i32,
eq_range: bool,
sorted: bool,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
let buf = unsafe { FfiPtr::slice_mut(buf, buf_len) };
let start = unsafe { range_key(start_key, start_len, start_flag) };
let end = unsafe { range_key(end_key, end_len, end_flag) };
engine.read_range_first(buf, start, end, eq_range, sorted)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__read_range_next(
ctx: *mut EngineContext,
buf: *mut u8,
buf_len: usize,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
engine.read_range_next(unsafe { FfiPtr::slice_mut(buf, buf_len) })
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
#[allow(clippy::too_many_arguments)]
pub unsafe extern "C" fn rust__handler__records_in_range(
ctx: *mut EngineContext,
inx: u32,
min_key: *const u8,
min_len: usize,
min_flag: i32,
max_key: *const u8,
max_len: usize,
max_flag: i32,
) -> u64 {
FfiBoundary::run_default(HA_POS_ERROR, || {
let engine = unsafe { &mut *ctx }.engine_mut();
let min = unsafe { range_key(min_key, min_len, min_flag) };
let max = unsafe { range_key(max_key, max_len, max_flag) };
match engine.records_in_range(inx, min, max) {
Some(rows) => rows,
None => HA_POS_ERROR,
}
})
}