Path: blob/main/crates/polars-arrow/src/io/ipc/read/array/utf8.rs
6940 views
use std::io::{Read, Seek};12use polars_error::polars_err;34use super::super::read_basic::*;5use super::*;6use crate::array::Utf8Array;7use crate::buffer::Buffer;8use crate::offset::Offset;910#[allow(clippy::too_many_arguments)]11pub fn read_utf8<O: Offset, R: Read + Seek>(12field_nodes: &mut VecDeque<Node>,13dtype: ArrowDataType,14buffers: &mut VecDeque<IpcBuffer>,15reader: &mut R,16block_offset: u64,17is_little_endian: bool,18compression: Option<Compression>,19limit: Option<usize>,20scratch: &mut Vec<u8>,21) -> PolarsResult<Utf8Array<O>> {22let field_node = try_get_field_node(field_nodes, &dtype)?;2324let validity = read_validity(25buffers,26field_node,27reader,28block_offset,29is_little_endian,30compression,31limit,32scratch,33)?;3435let length = try_get_array_length(field_node, limit)?;3637let offsets: Buffer<O> = read_buffer(38buffers,391 + length,40reader,41block_offset,42is_little_endian,43compression,44scratch,45)46// Older versions of the IPC format sometimes do not report an offset47.or_else(|_| PolarsResult::Ok(Buffer::<O>::from(vec![O::default()])))?;4849let last_offset = offsets.last().unwrap().to_usize();50let values = read_buffer(51buffers,52last_offset,53reader,54block_offset,55is_little_endian,56compression,57scratch,58)?;5960Utf8Array::<O>::try_new(dtype, offsets.try_into()?, values, validity)61}6263pub fn skip_utf8(64field_nodes: &mut VecDeque<Node>,65buffers: &mut VecDeque<IpcBuffer>,66) -> PolarsResult<()> {67let _ = field_nodes.pop_front().ok_or_else(|| {68polars_err!(69oos = "IPC: unable to fetch the field for utf8. The file or stream is corrupted."70)71})?;7273let _ = buffers74.pop_front()75.ok_or_else(|| polars_err!(oos = "IPC: missing validity buffer."))?;76let _ = buffers77.pop_front()78.ok_or_else(|| polars_err!(oos = "IPC: missing offsets buffer."))?;79let _ = buffers80.pop_front()81.ok_or_else(|| polars_err!(oos = "IPC: missing values buffer."))?;82Ok(())83}848586