pub(crate) mod from_arrow;
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) enum MssqlCell<'a> {
Bit(Option<bool>),
TinyInt(Option<u8>),
SmallInt(Option<i16>),
Int(Option<i32>),
BigInt(Option<i64>),
Decimal(Option<MssqlDecimal>),
Date(Option<MssqlDate>),
Time(Option<MssqlTime>),
DateTime2(Option<MssqlDateTime2>),
DateTimeOffset(Option<MssqlDateTimeOffset>),
Real(Option<f32>),
Float(Option<f64>),
NVarChar(Option<&'a str>),
VarBinary(Option<&'a [u8]>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct MssqlDecimal {
unscaled: i128,
scale: u8,
}
impl MssqlDecimal {
pub(crate) const fn new(unscaled: i128, scale: u8) -> Self {
Self { unscaled, scale }
}
pub(crate) const fn unscaled(self) -> i128 {
self.unscaled
}
pub(crate) const fn scale(self) -> u8 {
self.scale
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct MssqlDate {
days: u32,
}
impl MssqlDate {
pub(crate) const fn new(days: u32) -> Self {
Self { days }
}
pub(crate) const fn days(self) -> u32 {
self.days
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct MssqlDateTime2 {
date: MssqlDate,
time: MssqlTime,
}
impl MssqlDateTime2 {
pub(crate) const fn new(date: MssqlDate, time: MssqlTime) -> Self {
Self { date, time }
}
pub(crate) const fn date(self) -> MssqlDate {
self.date
}
pub(crate) const fn time(self) -> MssqlTime {
self.time
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct MssqlDateTimeOffset {
datetime2: MssqlDateTime2,
offset_minutes: i16,
}
impl MssqlDateTimeOffset {
pub(crate) const fn new(datetime2: MssqlDateTime2, offset_minutes: i16) -> Self {
Self {
datetime2,
offset_minutes,
}
}
pub(crate) const fn datetime2(self) -> MssqlDateTime2 {
self.datetime2
}
pub(crate) const fn offset_minutes(self) -> i16 {
self.offset_minutes
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct MssqlTime {
increments: u64,
scale: u8,
}
impl MssqlTime {
pub(crate) const fn new(increments: u64, scale: u8) -> Self {
Self { increments, scale }
}
pub(crate) const fn increments(self) -> u64 {
self.increments
}
pub(crate) const fn scale(self) -> u8 {
self.scale
}
}
#[cfg(test)]
mod tests {
use super::{MssqlDate, MssqlDateTime2, MssqlDateTimeOffset, MssqlTime};
#[test]
fn datetimeoffset_exposes_datetime_and_offset_components() {
let datetime2 = MssqlDateTime2::new(MssqlDate::new(719_163), MssqlTime::new(1, 7));
let datetimeoffset = MssqlDateTimeOffset::new(datetime2, -840);
assert_eq!(datetimeoffset.datetime2(), datetime2);
assert_eq!(datetimeoffset.offset_minutes(), -840);
}
}