Path: blob/main/crates/polars-arrow/src/io/ipc/read/array/binary.rs
6940 views
use std::collections::VecDeque;1use std::io::{Read, Seek};23use polars_error::{PolarsResult, polars_err};45use super::super::read_basic::*;6use super::super::{Compression, IpcBuffer, Node};7use crate::array::BinaryArray;8use crate::buffer::Buffer;9use crate::datatypes::ArrowDataType;10use crate::io::ipc::read::array::{try_get_array_length, try_get_field_node};11use crate::offset::Offset;1213#[allow(clippy::too_many_arguments)]14pub fn read_binary<O: Offset, R: Read + Seek>(15field_nodes: &mut VecDeque<Node>,16dtype: ArrowDataType,17buffers: &mut VecDeque<IpcBuffer>,18reader: &mut R,19block_offset: u64,20is_little_endian: bool,21compression: Option<Compression>,22limit: Option<usize>,23scratch: &mut Vec<u8>,24) -> PolarsResult<BinaryArray<O>> {25let field_node = try_get_field_node(field_nodes, &dtype)?;2627let validity = read_validity(28buffers,29field_node,30reader,31block_offset,32is_little_endian,33compression,34limit,35scratch,36)?;3738let length = try_get_array_length(field_node, limit)?;3940let offsets: Buffer<O> = read_buffer(41buffers,421 + length,43reader,44block_offset,45is_little_endian,46compression,47scratch,48)49// Older versions of the IPC format sometimes do not report an offset50.or_else(|_| PolarsResult::Ok(Buffer::<O>::from(vec![O::default()])))?;5152let last_offset = offsets.last().unwrap().to_usize();53let values = read_buffer(54buffers,55last_offset,56reader,57block_offset,58is_little_endian,59compression,60scratch,61)?;6263BinaryArray::<O>::try_new(dtype, offsets.try_into()?, values, validity)64}6566pub fn skip_binary(67field_nodes: &mut VecDeque<Node>,68buffers: &mut VecDeque<IpcBuffer>,69) -> PolarsResult<()> {70let _ = field_nodes.pop_front().ok_or_else(|| {71polars_err!(72oos = "IPC: unable to fetch the field for binary. The file or stream is corrupted."73)74})?;7576let _ = buffers77.pop_front()78.ok_or_else(|| polars_err!(oos = "IPC: missing validity buffer."))?;79let _ = buffers80.pop_front()81.ok_or_else(|| polars_err!(oos = "IPC: missing offsets buffer."))?;82let _ = buffers83.pop_front()84.ok_or_else(|| polars_err!(oos = "IPC: missing values buffer."))?;85Ok(())86}878889