| 
1 | 1 | use crate::*;  | 
2 | 2 | use std::rc::Rc;  | 
3 | 3 | use std::slice::Iter;  | 
 | 4 | +use strum::{Display, FromRepr, IntoStaticStr};  | 
4 | 5 | 
 
  | 
5 | 6 | // https://github.com/crossdb-org/crossdb/blob/main/include/crossdb.h  | 
6 |  | -#[derive(Debug, Clone, Copy)]  | 
 | 7 | +#[derive(Debug, Clone, Copy, PartialEq, Eq, Display, IntoStaticStr, FromRepr)]  | 
 | 8 | +#[repr(u32)]  | 
7 | 9 | pub enum DataType {  | 
8 |  | -    Null,  | 
9 |  | -    TinyInt,  | 
10 |  | -    SmallInt,  | 
11 |  | -    Int,  | 
12 |  | -    BigInt,  | 
13 |  | -    UTinyInt,  | 
14 |  | -    USmallInt,  | 
15 |  | -    UInt,  | 
16 |  | -    UBigInt,  | 
17 |  | -    Float,  | 
18 |  | -    Double,  | 
19 |  | -    Timestamp,  | 
20 |  | -    Char,  | 
21 |  | -    Binary,  | 
22 |  | -    VChar,  | 
23 |  | -    VBinary,  | 
24 |  | -    Bool,  | 
25 |  | -    Max,  | 
26 |  | -}  | 
27 |  | - | 
28 |  | -impl Display for DataType {  | 
29 |  | -    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {  | 
30 |  | -        match self {  | 
31 |  | -            DataType::Null => write!(f, "NULL"),  | 
32 |  | -            DataType::TinyInt => write!(f, "TINYINT"),  | 
33 |  | -            DataType::SmallInt => write!(f, "SMALLINT"),  | 
34 |  | -            DataType::Int => write!(f, "INT"),  | 
35 |  | -            DataType::BigInt => write!(f, "BIGINT"),  | 
36 |  | -            DataType::UTinyInt => write!(f, "UTINYINT"),  | 
37 |  | -            DataType::USmallInt => write!(f, "USMALLINT"),  | 
38 |  | -            DataType::UInt => write!(f, "UINT"),  | 
39 |  | -            DataType::UBigInt => write!(f, "UBIGINT"),  | 
40 |  | -            DataType::Float => write!(f, "FLOAT"),  | 
41 |  | -            DataType::Double => write!(f, "DOUBLE"),  | 
42 |  | -            DataType::Timestamp => write!(f, "TIMESTAMP"),  | 
43 |  | -            DataType::Char => write!(f, "CHAR"),  | 
44 |  | -            DataType::Binary => write!(f, "BINARY"),  | 
45 |  | -            DataType::VChar => write!(f, "VCHAR"),  | 
46 |  | -            DataType::VBinary => write!(f, "VBINARY"),  | 
47 |  | -            DataType::Bool => write!(f, "BOOL"),  | 
48 |  | -            DataType::Max => write!(f, "MAX"),  | 
49 |  | -        }  | 
50 |  | -    }  | 
 | 10 | +    #[strum(serialize = "NULL")]  | 
 | 11 | +    Null = xdb_type_t_XDB_TYPE_NULL,  | 
 | 12 | +    #[strum(serialize = "TINYINT")]  | 
 | 13 | +    TinyInt = xdb_type_t_XDB_TYPE_TINYINT,  | 
 | 14 | +    #[strum(serialize = "SMALLINT")]  | 
 | 15 | +    SmallInt = xdb_type_t_XDB_TYPE_SMALLINT,  | 
 | 16 | +    #[strum(serialize = "INT")]  | 
 | 17 | +    Int = xdb_type_t_XDB_TYPE_INT,  | 
 | 18 | +    #[strum(serialize = "BIGINT")]  | 
 | 19 | +    BigInt = xdb_type_t_XDB_TYPE_BIGINT,  | 
 | 20 | +    #[strum(serialize = "UTINYINT")]  | 
 | 21 | +    UTinyInt = xdb_type_t_XDB_TYPE_UTINYINT,  | 
 | 22 | +    #[strum(serialize = "USMALLINT")]  | 
 | 23 | +    USmallInt = xdb_type_t_XDB_TYPE_USMALLINT,  | 
 | 24 | +    #[strum(serialize = "UINT")]  | 
 | 25 | +    UInt = xdb_type_t_XDB_TYPE_UINT,  | 
 | 26 | +    #[strum(serialize = "UBIGINT")]  | 
 | 27 | +    UBigInt = xdb_type_t_XDB_TYPE_UBIGINT,  | 
 | 28 | +    #[strum(serialize = "FLOAT")]  | 
 | 29 | +    Float = xdb_type_t_XDB_TYPE_FLOAT,  | 
 | 30 | +    #[strum(serialize = "DOUBLE")]  | 
 | 31 | +    Double = xdb_type_t_XDB_TYPE_DOUBLE,  | 
 | 32 | +    #[strum(serialize = "TIMESTAMP")]  | 
 | 33 | +    Timestamp = xdb_type_t_XDB_TYPE_TIMESTAMP,  | 
 | 34 | +    #[strum(serialize = "CHAR")]  | 
 | 35 | +    Char = xdb_type_t_XDB_TYPE_CHAR,  | 
 | 36 | +    #[strum(serialize = "BINARY")]  | 
 | 37 | +    Binary = xdb_type_t_XDB_TYPE_BINARY,  | 
 | 38 | +    #[strum(serialize = "VCHAR")]  | 
 | 39 | +    VChar = xdb_type_t_XDB_TYPE_VCHAR,  | 
 | 40 | +    #[strum(serialize = "VBINARY")]  | 
 | 41 | +    VBinary = xdb_type_t_XDB_TYPE_VBINARY,  | 
 | 42 | +    #[strum(serialize = "BOOL")]  | 
 | 43 | +    Bool = xdb_type_t_XDB_TYPE_BOOL,  | 
 | 44 | +    #[strum(serialize = "INET")]  | 
 | 45 | +    Inet = xdb_type_t_XDB_TYPE_INET,  | 
 | 46 | +    #[strum(serialize = "MAC")]  | 
 | 47 | +    Mac = xdb_type_t_XDB_TYPE_MAC,  | 
 | 48 | +    #[strum(serialize = "MAX")]  | 
 | 49 | +    Max = xdb_type_t_XDB_TYPE_MAX,  | 
51 | 50 | }  | 
52 | 51 | 
 
  | 
53 | 52 | impl DataType {  | 
54 |  | -    #[allow(non_upper_case_globals)]  | 
55 | 53 |     unsafe fn from_meta(meta: u64, col: u16) -> Self {  | 
56 | 54 |         let t = xdb_column_type(meta, col);  | 
57 |  | -        match t {  | 
58 |  | -            xdb_type_t_XDB_TYPE_NULL => Self::Null,  | 
59 |  | -            xdb_type_t_XDB_TYPE_TINYINT => Self::TinyInt,  | 
60 |  | -            xdb_type_t_XDB_TYPE_SMALLINT => Self::SmallInt,  | 
61 |  | -            xdb_type_t_XDB_TYPE_INT => Self::Int,  | 
62 |  | -            xdb_type_t_XDB_TYPE_BIGINT => Self::BigInt,  | 
63 |  | -            xdb_type_t_XDB_TYPE_UTINYINT => Self::UTinyInt,  | 
64 |  | -            xdb_type_t_XDB_TYPE_USMALLINT => Self::USmallInt,  | 
65 |  | -            xdb_type_t_XDB_TYPE_UINT => Self::UInt,  | 
66 |  | -            xdb_type_t_XDB_TYPE_UBIGINT => Self::UBigInt,  | 
67 |  | -            xdb_type_t_XDB_TYPE_FLOAT => Self::Float,  | 
68 |  | -            xdb_type_t_XDB_TYPE_DOUBLE => Self::Double,  | 
69 |  | -            xdb_type_t_XDB_TYPE_TIMESTAMP => Self::Timestamp,  | 
70 |  | -            xdb_type_t_XDB_TYPE_CHAR => Self::Char,  | 
71 |  | -            xdb_type_t_XDB_TYPE_BINARY => Self::Binary,  | 
72 |  | -            xdb_type_t_XDB_TYPE_VCHAR => Self::VChar,  | 
73 |  | -            xdb_type_t_XDB_TYPE_VBINARY => Self::VBinary,  | 
74 |  | -            xdb_type_t_XDB_TYPE_BOOL => Self::Bool,  | 
75 |  | -            xdb_type_t_XDB_TYPE_MAX => Self::Max,  | 
76 |  | -            _ => unreachable!(),  | 
 | 55 | +        match Self::from_repr(t) {  | 
 | 56 | +            Some(t) => t,  | 
 | 57 | +            None => unreachable!(),  | 
77 | 58 |         }  | 
78 | 59 |     }  | 
79 | 60 | }  | 
 | 
0 commit comments