Skip to main content

connectorx/transports/
oracle_arrow.rs

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