Path: blob/main/crates/polars-arrow/src/io/ipc/read/array/binview.rs
8415 views
use std::io::{Read, Seek};12use polars_buffer::Buffer;3use polars_error::polars_err;4use polars_utils::bool::UnsafeBool;56use super::super::read_basic::*;7use super::*;8use crate::array::{ArrayRef, BinaryViewArrayGeneric, View, ViewType};910#[allow(clippy::too_many_arguments)]11pub fn read_binview<T: ViewType + ?Sized, R: Read + Seek>(12field_nodes: &mut VecDeque<Node>,13variadic_buffer_counts: &mut VecDeque<usize>,14dtype: ArrowDataType,15buffers: &mut VecDeque<IpcBuffer>,16reader: &mut R,17block_offset: u64,18is_little_endian: bool,19compression: Option<Compression>,20limit: Option<usize>,21scratch: &mut Vec<u8>,22checked: UnsafeBool,23) -> PolarsResult<ArrayRef> {24let field_node = try_get_field_node(field_nodes, &dtype)?;2526let validity = read_validity(27buffers,28field_node,29reader,30block_offset,31is_little_endian,32compression,33limit,34scratch,35)?;3637let length = try_get_array_length(field_node, limit)?;38let views: Buffer<View> = read_buffer(39buffers,40length,41reader,42block_offset,43is_little_endian,44compression,45scratch,46)?;4748let n_variadic = variadic_buffer_counts.pop_front().ok_or_else(49|| polars_err!(ComputeError: "IPC: unable to fetch the variadic buffers\n\nThe file or stream is corrupted.")50)?;5152let variadic_buffers = (0..n_variadic)53.map(|_| {54read_bytes(55buffers,56reader,57block_offset,58is_little_endian,59compression,60scratch,61)62})63.collect::<PolarsResult<Vec<Buffer<u8>>>>()?;6465if *checked {66BinaryViewArrayGeneric::<T>::try_new(dtype, views, Buffer::from(variadic_buffers), validity)67.map(|arr| arr.boxed())68} else {69unsafe {70Ok(BinaryViewArrayGeneric::<T>::new_unchecked_unknown_md(71dtype,72views,73Buffer::from(variadic_buffers),74validity,75None,76)77.boxed())78}79}80}8182pub fn skip_binview(83field_nodes: &mut VecDeque<Node>,84buffers: &mut VecDeque<IpcBuffer>,85variadic_buffer_counts: &mut VecDeque<usize>,86) -> PolarsResult<()> {87let _ = field_nodes.pop_front().ok_or_else(|| {88polars_err!(89oos = "IPC: unable to fetch the field for utf8. The file or stream is corrupted."90)91})?;9293let _ = buffers94.pop_front()95.ok_or_else(|| polars_err!(oos = "IPC: missing validity buffer."))?;9697let _ = buffers98.pop_front()99.ok_or_else(|| polars_err!(oos = "IPC: missing views buffer."))?;100101let n_variadic = variadic_buffer_counts.pop_front().ok_or_else(102|| polars_err!(ComputeError: "IPC: unable to fetch the variadic buffers\n\nThe file or stream is corrupted.")103)?;104105for _ in 0..n_variadic {106let _ = buffers107.pop_front()108.ok_or_else(|| polars_err!(oos = "IPC: missing variadic buffer"))?;109}110Ok(())111}112113114