#[derive(Clone, Debug)]
pub struct TypeId {
base_type_id: BaseTypeId,
nullable: bool,
}
impl TypeId {
#[inline]
pub(crate) fn new(base_type_id: BaseTypeId, nullable: bool) -> TypeId {
TypeId {
base_type_id,
nullable,
}
}
pub fn base_type_id(&self) -> &BaseTypeId {
&self.base_type_id
}
pub fn is_nullable(&self) -> bool {
self.nullable
}
pub(crate) fn as_tuple(&self) -> (&BaseTypeId, bool) {
(&self.base_type_id, self.nullable)
}
#[allow(clippy::identity_op)]
pub(crate) fn type_code(&self) -> u8 {
0_u8 + if self.nullable { 128 } else { 0 }
+ self.base_type_id.type_code()
}
}
impl std::fmt::Display for TypeId {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(
fmt,
"{}{}",
if self.nullable { "Nullable " } else { "" },
self.base_type_id
)?;
Ok(())
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum BaseTypeId {
#[doc(hidden)]
NOTHING,
TINYINT,
SMALLINT,
INT,
BIGINT,
DECIMAL,
REAL,
DOUBLE,
CHAR,
VARCHAR,
NCHAR,
NVARCHAR,
BINARY,
VARBINARY,
CLOB,
NCLOB,
BLOB,
BOOLEAN,
STRING,
NSTRING,
BSTRING,
SMALLDECIMAL,
TEXT,
SHORTTEXT,
LONGDATE,
SECONDDATE,
DAYDATE,
SECONDTIME,
}
impl From<u8> for BaseTypeId {
fn from(id: u8) -> BaseTypeId {
match id {
0 => BaseTypeId::NOTHING,
1 => BaseTypeId::TINYINT,
2 => BaseTypeId::SMALLINT,
3 => BaseTypeId::INT,
4 => BaseTypeId::BIGINT,
5 => BaseTypeId::DECIMAL,
6 => BaseTypeId::REAL,
7 => BaseTypeId::DOUBLE,
8 => BaseTypeId::CHAR,
9 => BaseTypeId::VARCHAR,
10 => BaseTypeId::NCHAR,
11 => BaseTypeId::NVARCHAR,
12 => BaseTypeId::BINARY,
13 => BaseTypeId::VARBINARY,
25 => BaseTypeId::CLOB,
26 => BaseTypeId::NCLOB,
27 => BaseTypeId::BLOB,
28 => BaseTypeId::BOOLEAN,
29 => BaseTypeId::STRING,
30 => BaseTypeId::NSTRING,
33 => BaseTypeId::BSTRING,
47 => BaseTypeId::SMALLDECIMAL,
51 => BaseTypeId::TEXT,
52 => BaseTypeId::SHORTTEXT,
61 => BaseTypeId::LONGDATE,
62 => BaseTypeId::SECONDDATE,
63 => BaseTypeId::DAYDATE,
64 => BaseTypeId::SECONDTIME,
_ => panic!("Illegal BaseTypeId"),
}
}
}
impl BaseTypeId {
pub(crate) fn type_code(&self) -> u8 {
match &self {
BaseTypeId::NOTHING => 0,
BaseTypeId::TINYINT => 1,
BaseTypeId::SMALLINT => 2,
BaseTypeId::INT => 3,
BaseTypeId::BIGINT => 4,
BaseTypeId::DECIMAL => 5,
BaseTypeId::REAL => 6,
BaseTypeId::DOUBLE => 7,
BaseTypeId::CHAR => 8,
BaseTypeId::VARCHAR => 9,
BaseTypeId::NCHAR => 10,
BaseTypeId::NVARCHAR => 11,
BaseTypeId::BINARY => 12,
BaseTypeId::VARBINARY => 13,
BaseTypeId::CLOB => 25,
BaseTypeId::NCLOB => 26,
BaseTypeId::BLOB => 27,
BaseTypeId::BOOLEAN => 28,
BaseTypeId::STRING => 29,
BaseTypeId::NSTRING => 30,
BaseTypeId::BSTRING => 33,
BaseTypeId::SMALLDECIMAL => 47,
BaseTypeId::TEXT => 51,
BaseTypeId::SHORTTEXT => 52,
BaseTypeId::LONGDATE => 61,
BaseTypeId::SECONDDATE => 62,
BaseTypeId::DAYDATE => 63,
BaseTypeId::SECONDTIME => 64,
}
}
}
impl std::fmt::Display for BaseTypeId {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(
fmt,
"{}",
match self {
BaseTypeId::NOTHING => "NOTHING",
BaseTypeId::TINYINT => "TINYINT",
BaseTypeId::SMALLINT => "SMALLINT",
BaseTypeId::INT => "INT",
BaseTypeId::BIGINT => "BIGINT",
BaseTypeId::DECIMAL => "DECIMAL",
BaseTypeId::REAL => "REAL",
BaseTypeId::DOUBLE => "DOUBLE",
BaseTypeId::CHAR => "CHAR",
BaseTypeId::VARCHAR => "VARCHAR",
BaseTypeId::NCHAR => "NCHAR",
BaseTypeId::NVARCHAR => "NVARCHAR",
BaseTypeId::BINARY => "BINARY",
BaseTypeId::VARBINARY => "VARBINARY",
BaseTypeId::CLOB => "CLOB",
BaseTypeId::NCLOB => "NCLOB",
BaseTypeId::BLOB => "BLOB",
BaseTypeId::BOOLEAN => "BOOLEAN",
BaseTypeId::STRING => "STRING",
BaseTypeId::NSTRING => "NSTRING",
BaseTypeId::BSTRING => "BSTRING",
BaseTypeId::SMALLDECIMAL => "SMALLDECIMAL",
BaseTypeId::TEXT => "TEXT",
BaseTypeId::SHORTTEXT => "SHORTTEXT",
BaseTypeId::LONGDATE => "LONGDATE",
BaseTypeId::SECONDDATE => "SECONDDATE",
BaseTypeId::DAYDATE => "DAYDATE",
BaseTypeId::SECONDTIME => "SECONDTIME",
}
)?;
Ok(())
}
}