use libduckdb_sys::{
duckdb_data_chunk, duckdb_data_chunk_get_column_count, duckdb_data_chunk_get_size,
duckdb_data_chunk_get_vector, duckdb_data_chunk_set_size, duckdb_vector, idx_t,
};
use crate::chunk_writer::ChunkWriter;
use crate::vector::complex::StructVector;
use crate::vector::{StructReader, StructWriter, VectorReader, VectorWriter};
pub struct DataChunk {
raw: duckdb_data_chunk,
}
impl DataChunk {
#[inline]
#[must_use]
pub const unsafe fn from_raw(raw: duckdb_data_chunk) -> Self {
Self { raw }
}
#[inline]
#[must_use]
pub fn size(&self) -> usize {
usize::try_from(unsafe { duckdb_data_chunk_get_size(self.raw) }).unwrap_or(0)
}
#[inline]
pub unsafe fn set_size(&self, size: usize) {
unsafe { duckdb_data_chunk_set_size(self.raw, size as idx_t) };
}
#[inline]
#[must_use]
pub fn column_count(&self) -> usize {
usize::try_from(unsafe { duckdb_data_chunk_get_column_count(self.raw) }).unwrap_or(0)
}
#[inline]
#[must_use]
pub unsafe fn vector(&self, col_idx: usize) -> duckdb_vector {
unsafe { duckdb_data_chunk_get_vector(self.raw, col_idx as idx_t) }
}
pub unsafe fn writer(&self, col_idx: usize) -> VectorWriter {
let vec = unsafe { self.vector(col_idx) };
unsafe { VectorWriter::from_vector(vec) }
}
pub unsafe fn reader(&self, col_idx: usize) -> VectorReader {
unsafe { VectorReader::new(self.raw, col_idx) }
}
pub unsafe fn struct_reader(&self, col_idx: usize, field_count: usize) -> StructReader {
let vec = unsafe { self.vector(col_idx) };
unsafe { StructReader::new(vec, field_count, self.size()) }
}
pub unsafe fn struct_field_reader(&self, col_idx: usize, field_idx: usize) -> VectorReader {
let vec = unsafe { self.vector(col_idx) };
unsafe { StructVector::field_reader(vec, field_idx, self.size()) }
}
pub unsafe fn struct_writer(&self, col_idx: usize, field_count: usize) -> StructWriter {
let vec = unsafe { self.vector(col_idx) };
unsafe { StructWriter::new(vec, field_count) }
}
pub const unsafe fn into_chunk_writer(self) -> ChunkWriter {
unsafe { ChunkWriter::new(self.raw) }
}
#[inline]
#[must_use]
pub const fn as_raw(&self) -> duckdb_data_chunk {
self.raw
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn size_of_data_chunk() {
assert_eq!(
std::mem::size_of::<DataChunk>(),
std::mem::size_of::<usize>()
);
}
}