arrow_odbc/reader/
binary.rs1use 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 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 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}