connectorx/transports/
oracle_arrowstream.rs

1use crate::{
2    destinations::arrowstream::{
3        typesystem::{ArrowTypeSystem, DateTimeWrapperMicro, NaiveDateTimeWrapperMicro},
4        ArrowDestination, ArrowDestinationError,
5    },
6    impl_transport,
7    sources::oracle::{OracleSource, OracleSourceError, OracleTypeSystem},
8    typesystem::TypeConversion,
9};
10use chrono::{DateTime, NaiveDateTime, Utc};
11use rust_decimal::Decimal;
12use thiserror::Error;
13
14#[derive(Error, Debug)]
15pub enum OracleArrowTransportError {
16    #[error(transparent)]
17    Source(#[from] OracleSourceError),
18
19    #[error(transparent)]
20    Destination(#[from] ArrowDestinationError),
21
22    #[error(transparent)]
23    ConnectorX(#[from] crate::errors::ConnectorXError),
24}
25
26pub struct OracleArrowTransport;
27
28impl_transport!(
29    name = OracleArrowTransport,
30    error = OracleArrowTransportError,
31    systems = OracleTypeSystem => ArrowTypeSystem,
32    route = OracleSource => ArrowDestination,
33    mappings = {
34        { NumFloat[f64]                     => Float64[f64]                             | conversion auto }
35        { NumDecimal[Decimal]               => Decimal[Decimal]                         | conversion auto }
36        { Float[f64]                        => Float64[f64]                             | conversion none }
37        { BinaryFloat[f64]                  => Float64[f64]                             | conversion none }
38        { BinaryDouble[f64]                 => Float64[f64]                             | conversion none }
39        { NumInt[i64]                       => Int64[i64]                               | conversion auto }
40        { Blob[Vec<u8>]                     => LargeBinary[Vec<u8>]                     | conversion auto }
41        { Clob[String]                      => LargeUtf8[String]                        | conversion none }
42        { VarChar[String]                   => LargeUtf8[String]                        | conversion auto }
43        { Char[String]                      => LargeUtf8[String]                        | conversion none }
44        { NVarChar[String]                  => LargeUtf8[String]                        | conversion none }
45        { NChar[String]                     => LargeUtf8[String]                        | conversion none }
46        { Date[NaiveDateTime]               => Date64Micro[NaiveDateTimeWrapperMicro]   | conversion option }
47        { Timestamp[NaiveDateTime]          => Date64Micro[NaiveDateTimeWrapperMicro]   | conversion none }
48        { TimestampNano[NaiveDateTime]      => Date64[NaiveDateTime]                    | conversion auto }
49        { TimestampTz[DateTime<Utc>]        => DateTimeTz[DateTimeWrapperMicro]         | conversion option }
50        { TimestampTzNano[DateTime<Utc>]    => DateTimeTz[DateTime<Utc>]                | conversion auto }
51    }
52);
53
54impl TypeConversion<NaiveDateTime, NaiveDateTimeWrapperMicro> for OracleArrowTransport {
55    fn convert(val: NaiveDateTime) -> NaiveDateTimeWrapperMicro {
56        NaiveDateTimeWrapperMicro(val)
57    }
58}
59
60impl TypeConversion<DateTime<Utc>, DateTimeWrapperMicro> for OracleArrowTransport {
61    fn convert(val: DateTime<Utc>) -> DateTimeWrapperMicro {
62        DateTimeWrapperMicro(val)
63    }
64}