use libduckdb_sys::duckdb_vector;
use crate::interval::DuckInterval;
use crate::vector::complex::StructVector;
use crate::vector::VectorWriter;
pub struct StructWriter {
fields: Vec<VectorWriter>,
}
impl StructWriter {
pub unsafe fn new(vector: duckdb_vector, field_count: usize) -> Self {
let mut fields = Vec::with_capacity(field_count);
for idx in 0..field_count {
fields.push(unsafe { StructVector::field_writer(vector, idx) });
}
Self { fields }
}
#[mutants::skip]
#[must_use]
#[inline]
pub fn field_count(&self) -> usize {
self.fields.len()
}
#[must_use]
#[inline]
pub fn child_vector(&self, field_idx: usize) -> duckdb_vector {
self.fields[field_idx].as_raw()
}
#[must_use]
#[inline]
pub fn field_mut(&mut self, field_idx: usize) -> &mut VectorWriter {
&mut self.fields[field_idx]
}
#[must_use]
#[inline]
pub fn child_list_vector(&self, field_idx: usize) -> duckdb_vector {
self.child_vector(field_idx)
}
#[inline]
pub unsafe fn write_bool(&mut self, row: usize, field_idx: usize, value: bool) {
unsafe { self.fields[field_idx].write_bool(row, value) };
}
#[inline]
pub unsafe fn write_varchar(&mut self, row: usize, field_idx: usize, value: &str) {
unsafe { self.fields[field_idx].write_varchar(row, value) };
}
#[inline]
pub unsafe fn write_i8(&mut self, row: usize, field_idx: usize, value: i8) {
unsafe { self.fields[field_idx].write_i8(row, value) };
}
#[inline]
pub unsafe fn write_i16(&mut self, row: usize, field_idx: usize, value: i16) {
unsafe { self.fields[field_idx].write_i16(row, value) };
}
#[inline]
pub unsafe fn write_i32(&mut self, row: usize, field_idx: usize, value: i32) {
unsafe { self.fields[field_idx].write_i32(row, value) };
}
#[inline]
pub unsafe fn write_i64(&mut self, row: usize, field_idx: usize, value: i64) {
unsafe { self.fields[field_idx].write_i64(row, value) };
}
#[inline]
pub unsafe fn write_i128(&mut self, row: usize, field_idx: usize, value: i128) {
unsafe { self.fields[field_idx].write_i128(row, value) };
}
#[inline]
pub unsafe fn write_u8(&mut self, row: usize, field_idx: usize, value: u8) {
unsafe { self.fields[field_idx].write_u8(row, value) };
}
#[inline]
pub unsafe fn write_u16(&mut self, row: usize, field_idx: usize, value: u16) {
unsafe { self.fields[field_idx].write_u16(row, value) };
}
#[inline]
pub unsafe fn write_u32(&mut self, row: usize, field_idx: usize, value: u32) {
unsafe { self.fields[field_idx].write_u32(row, value) };
}
#[inline]
pub unsafe fn write_u64(&mut self, row: usize, field_idx: usize, value: u64) {
unsafe { self.fields[field_idx].write_u64(row, value) };
}
#[inline]
pub unsafe fn write_f32(&mut self, row: usize, field_idx: usize, value: f32) {
unsafe { self.fields[field_idx].write_f32(row, value) };
}
#[inline]
pub unsafe fn write_f64(&mut self, row: usize, field_idx: usize, value: f64) {
unsafe { self.fields[field_idx].write_f64(row, value) };
}
#[inline]
pub unsafe fn write_interval(&mut self, row: usize, field_idx: usize, value: DuckInterval) {
unsafe { self.fields[field_idx].write_interval(row, value) };
}
#[inline]
pub unsafe fn write_blob(&mut self, row: usize, field_idx: usize, value: &[u8]) {
unsafe { self.fields[field_idx].write_blob(row, value) };
}
#[inline]
pub unsafe fn write_uuid(&mut self, row: usize, field_idx: usize, value: i128) {
unsafe { self.fields[field_idx].write_uuid(row, value) };
}
#[inline]
pub unsafe fn write_str(&mut self, row: usize, field_idx: usize, value: &str) {
unsafe { self.write_varchar(row, field_idx, value) };
}
#[inline]
pub unsafe fn write_date(&mut self, row: usize, field_idx: usize, days_since_epoch: i32) {
unsafe { self.write_i32(row, field_idx, days_since_epoch) };
}
#[inline]
pub unsafe fn write_timestamp(
&mut self,
row: usize,
field_idx: usize,
micros_since_epoch: i64,
) {
unsafe { self.write_i64(row, field_idx, micros_since_epoch) };
}
#[inline]
pub unsafe fn write_time(&mut self, row: usize, field_idx: usize, micros_since_midnight: i64) {
unsafe { self.write_i64(row, field_idx, micros_since_midnight) };
}
#[inline]
pub unsafe fn set_null(&mut self, row: usize, field_idx: usize) {
unsafe { self.fields[field_idx].set_null(row) };
}
#[inline]
pub unsafe fn set_valid(&mut self, row: usize, field_idx: usize) {
unsafe { self.fields[field_idx].set_valid(row) };
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn struct_writer_field_count() {
let sw = StructWriter { fields: Vec::new() };
assert_eq!(sw.field_count(), 0);
}
#[test]
fn size_of_struct_writer() {
assert_eq!(
std::mem::size_of::<StructWriter>(),
3 * std::mem::size_of::<usize>()
);
}
}