|
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