use libduckdb_sys::duckdb_validity_row_is_valid;
use crate::{
Result,
error::duckdb_failure_from_message,
ffi::{duckdb_vector, duckdb_vector_get_validity},
};
mod array;
mod flat;
mod list;
mod r#struct;
pub use array::ArrayVector;
pub use flat::{FlatVector, Inserter};
pub use list::ListVector;
pub use r#struct::StructVector;
fn try_vector_row_is_null(ptr: duckdb_vector, row: u64, capacity: usize) -> Result<bool> {
let row_index = usize::try_from(row)
.map_err(|_| duckdb_failure_from_message(format!("row index {row} exceeds usize range")))?;
if row_index >= capacity {
return Err(duckdb_failure_from_message(format!(
"row index {row} exceeds vector capacity {capacity}"
)));
}
let valid = unsafe {
let validity = duckdb_vector_get_validity(ptr);
if validity.is_null() {
return Ok(false);
}
duckdb_validity_row_is_valid(validity, row)
};
Ok(!valid)
}
fn vector_row_is_null(ptr: duckdb_vector, row: u64, capacity: usize) -> bool {
try_vector_row_is_null(ptr, row, capacity).unwrap_or_else(|err| panic!("{err}"))
}
#[cfg(test)]
mod tests;