Skip to content

Commit 8bcac03

Browse files
authored
fix(mysql): implement type traits for chrono::DateTime<Local> (#1335)
closes #1222
1 parent be189bd commit 8bcac03

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

sqlx-core/src/mysql/types/chrono.rs

+27-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::convert::TryFrom;
22

33
use bytes::Buf;
4-
use chrono::{DateTime, Datelike, NaiveDate, NaiveDateTime, NaiveTime, Timelike, Utc};
4+
use chrono::{DateTime, Datelike, Local, NaiveDate, NaiveDateTime, NaiveTime, Timelike, Utc};
55

66
use crate::decode::Decode;
77
use crate::encode::{Encode, IsNull};
@@ -21,12 +21,14 @@ impl Type<MySql> for DateTime<Utc> {
2121
}
2222
}
2323

24+
/// Note: assumes the connection's `time_zone` is set to `+00:00` (UTC).
2425
impl Encode<'_, MySql> for DateTime<Utc> {
2526
fn encode_by_ref(&self, buf: &mut Vec<u8>) -> IsNull {
2627
Encode::<MySql>::encode(&self.naive_utc(), buf)
2728
}
2829
}
2930

31+
/// Note: assumes the connection's `time_zone` is set to `+00:00` (UTC).
3032
impl<'r> Decode<'r, MySql> for DateTime<Utc> {
3133
fn decode(value: MySqlValueRef<'r>) -> Result<Self, BoxDynError> {
3234
let naive: NaiveDateTime = Decode::<MySql>::decode(value)?;
@@ -35,6 +37,30 @@ impl<'r> Decode<'r, MySql> for DateTime<Utc> {
3537
}
3638
}
3739

40+
impl Type<MySql> for DateTime<Local> {
41+
fn type_info() -> MySqlTypeInfo {
42+
MySqlTypeInfo::binary(ColumnType::Timestamp)
43+
}
44+
45+
fn compatible(ty: &MySqlTypeInfo) -> bool {
46+
matches!(ty.r#type, ColumnType::Datetime | ColumnType::Timestamp)
47+
}
48+
}
49+
50+
/// Note: assumes the connection's `time_zone` is set to `+00:00` (UTC).
51+
impl Encode<'_, MySql> for DateTime<Local> {
52+
fn encode_by_ref(&self, buf: &mut Vec<u8>) -> IsNull {
53+
Encode::<MySql>::encode(&self.naive_utc(), buf)
54+
}
55+
}
56+
57+
/// Note: assumes the connection's `time_zone` is set to `+00:00` (UTC).
58+
impl<'r> Decode<'r, MySql> for DateTime<Local> {
59+
fn decode(value: MySqlValueRef<'r>) -> Result<Self, BoxDynError> {
60+
Ok(<DateTime<Utc> as Decode<'r, MySql>>::decode(value)?.with_timezone(&Local))
61+
}
62+
}
63+
3864
impl Type<MySql> for NaiveTime {
3965
fn type_info() -> MySqlTypeInfo {
4066
MySqlTypeInfo::binary(ColumnType::Time)

0 commit comments

Comments
 (0)