connectorx/sources/oracle/
typesystem.rs1use 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}