use arrow2::array::Array;
use arrow2::datatypes::{DataType, Field};
use arrow2::ffi;
use libc::c_uint;
use log::info;
#[no_mangle]
pub extern "C" fn alloy_read_array_chunks(
arr_ptr: *const ffi::ArrowArray,
sch_ptr: *const ffi::ArrowSchema,
n_chunks: usize,
) -> c_uint {
info!("reading raw pointers passed from C ffi now...");
let mut data: Vec<Box<dyn Array>> = Vec::with_capacity(n_chunks);
unsafe {
for chunk_idx in 0..n_chunks {
let field = read_field_from_schema_ptr(&sch_ptr.add(chunk_idx).read());
let chunk = read_data_from_array_ptr(
arr_ptr.add(chunk_idx).read(),
field.data_type,
);
data.push(chunk);
}
}
data.len() as c_uint
}
pub unsafe fn read_field_from_schema_ptr(schema: &ffi::ArrowSchema) -> Field {
match ffi::import_field_from_c(schema) {
Ok(f) => f,
Err(e) => panic!("could not import Field from C ffi: {:?}", e),
}
}
pub unsafe fn read_data_from_array_ptr(
array: ffi::ArrowArray,
data_type: DataType,
) -> Box<dyn Array> {
match ffi::import_array_from_c(array, data_type) {
Ok(d) => d,
Err(e) => panic!("could not import data from C ffi: {:?}", e),
}
}