connectorx/sources/oracle/
typesystem.rs

1use chrono::{DateTime, NaiveDateTime, Utc};
2use r2d2_oracle::oracle::sql_type::OracleType;
3
4#[derive(Copy, Clone, Debug)]
5pub enum OracleTypeSystem {
6    NumInt(bool),
7    Float(bool),
8    NumFloat(bool),
9    BinaryFloat(bool),
10    BinaryDouble(bool),
11    Blob(bool),
12    Clob(bool),
13    VarChar(bool),
14    Char(bool),
15    NVarChar(bool),
16    NChar(bool),
17    Date(bool),
18    Timestamp(bool),
19    TimestampTz(bool),
20    TimestampNano(bool),
21    TimestampTzNano(bool),
22}
23
24impl_typesystem! {
25    system = OracleTypeSystem,
26    mappings = {
27        { NumInt => i64 }
28        { Float | NumFloat | BinaryFloat | BinaryDouble => f64 }
29        { Blob => Vec<u8>}
30        { Clob | VarChar | Char | NVarChar | NChar => String }
31        { Date | Timestamp | TimestampNano => NaiveDateTime }
32        { TimestampTz | TimestampTzNano => DateTime<Utc> }
33    }
34}
35
36impl<'a> From<&'a OracleType> for OracleTypeSystem {
37    fn from(ty: &'a OracleType) -> OracleTypeSystem {
38        use OracleTypeSystem::*;
39        match ty {
40            OracleType::Number(0, 0) => NumFloat(true),
41            OracleType::Number(_, 0) => NumInt(true),
42            OracleType::Number(_, _) => NumFloat(true),
43            OracleType::Float(_) => Float(true),
44            OracleType::BinaryFloat => BinaryFloat(true),
45            OracleType::BinaryDouble => BinaryDouble(true),
46            OracleType::BLOB => Blob(true),
47            OracleType::CLOB => Clob(true),
48            OracleType::Char(_) | OracleType::Long => Char(true),
49            OracleType::NChar(_) => NChar(true),
50            OracleType::Varchar2(_) => VarChar(true),
51            OracleType::NVarchar2(_) => NVarChar(true),
52            OracleType::Date => Date(true),
53            OracleType::Timestamp(7) | OracleType::Timestamp(8) | OracleType::Timestamp(9) => {
54                TimestampNano(true)
55            }
56            OracleType::Timestamp(_) => Timestamp(true),
57            OracleType::TimestampTZ(7)
58            | OracleType::TimestampTZ(8)
59            | OracleType::TimestampTZ(9) => TimestampTzNano(true),
60            OracleType::TimestampTZ(_) => TimestampTz(true),
61            _ => unimplemented!("{}", format!("Type {:?} not implemented for oracle!", ty)),
62        }
63    }
64}