Skip to main content

arrow_odbc/reader/
binary.rs

1use std::{convert::TryInto, sync::Arc};
2
3use arrow::array::{ArrayRef, BinaryBuilder, FixedSizeBinaryBuilder};
4use odbc_api::buffers::{AnySlice, BufferDesc};
5
6use super::{MappingError, ReadStrategy};
7
8pub struct Binary {
9    /// Maximum length in bytes of elements
10    max_len: usize,
11}
12
13impl Binary {
14    pub fn new(max_len: usize) -> Self {
15        Self { max_len }
16    }
17}
18
19impl ReadStrategy for Binary {
20    fn buffer_desc(&self) -> BufferDesc {
21        BufferDesc::Binary {
22            max_bytes: self.max_len,
23        }
24    }
25
26    fn fill_arrow_array(&self, column_view: AnySlice) -> Result<ArrayRef, MappingError> {
27        let view = column_view.as_bin_view().unwrap();
28        let mut builder = BinaryBuilder::new();
29        for value in view.iter() {
30            if let Some(bytes) = value {
31                builder.append_value(bytes);
32            } else {
33                builder.append_null();
34            }
35        }
36        Ok(Arc::new(builder.finish()))
37    }
38}
39
40pub struct FixedSizedBinary {
41    /// Length in bytes of elements
42    len: u32,
43}
44
45impl FixedSizedBinary {
46    pub fn new(len: u32) -> Self {
47        Self { len }
48    }
49}
50
51impl ReadStrategy for FixedSizedBinary {
52    fn buffer_desc(&self) -> BufferDesc {
53        BufferDesc::Binary {
54            max_bytes: self.len as usize,
55        }
56    }
57
58    fn fill_arrow_array(&self, column_view: AnySlice) -> Result<ArrayRef, MappingError> {
59        let view = column_view.as_bin_view().unwrap();
60        let mut builder = FixedSizeBinaryBuilder::new(self.len.try_into().unwrap());
61        for value in view.iter() {
62            if let Some(bytes) = value {
63                builder.append_value(bytes).unwrap();
64            } else {
65                builder.append_null();
66            }
67        }
68        Ok(Arc::new(builder.finish()))
69    }
70}