connectorx/transports/
oracle_arrow.rs

1use crate::{
2    destinations::arrow::{
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 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        { Float[f64]                 => Float64[f64]               | conversion none }
35        { BinaryFloat[f64]           => Float64[f64]               | conversion none }
36        { BinaryDouble[f64]          => Float64[f64]               | conversion none }
37        { NumInt[i64]                => Int64[i64]                 | conversion auto }
38        { Blob[Vec<u8>]              => LargeBinary[Vec<u8>]       | conversion auto }
39        { Clob[String]               => LargeUtf8[String]          | conversion none }
40        { VarChar[String]            => LargeUtf8[String]          | conversion auto }
41        { Char[String]               => LargeUtf8[String]          | conversion none }
42        { NVarChar[String]           => LargeUtf8[String]          | conversion none }
43        { NChar[String]              => LargeUtf8[String]          | conversion none }
44        { Date[NaiveDateTime]        => Date64Micro[NaiveDateTimeWrapperMicro]  | conversion option }
45        { Timestamp[NaiveDateTime]   => Date64Micro[NaiveDateTimeWrapperMicro]  | conversion none }
46        { TimestampNano[NaiveDateTime]   => Date64[NaiveDateTime]      | conversion auto }
47        { TimestampTz[DateTime<Utc>] => DateTimeTz[DateTimeWrapperMicro]        | conversion option }
48        { TimestampTzNano[DateTime<Utc>] => DateTimeTz[DateTime<Utc>]  | conversion auto }
49    }
50);
51
52impl TypeConversion<NaiveDateTime, NaiveDateTimeWrapperMicro> for OracleArrowTransport {
53    fn convert(val: NaiveDateTime) -> NaiveDateTimeWrapperMicro {
54        NaiveDateTimeWrapperMicro(val)
55    }
56}
57
58impl TypeConversion<DateTime<Utc>, DateTimeWrapperMicro> for OracleArrowTransport {
59    fn convert(val: DateTime<Utc>) -> DateTimeWrapperMicro {
60        DateTimeWrapperMicro(val)
61    }
62}