@@ -8,7 +8,7 @@ use std::os::raw as libc;
88use std:: { ptr, mem, slice} ;
99
1010use mysql:: Mysql ;
11- use types:: { ToSql , ToSqlOutput , FromSql , IsNull , Timestamp , Time , Date } ;
11+ use types:: { ToSql , ToSqlOutput , FromSql , IsNull , Timestamp , Time , Date , Datetime } ;
1212
1313macro_rules! mysql_time_impls {
1414 ( $ty: ty) => {
@@ -41,10 +41,24 @@ macro_rules! mysql_time_impls {
4141 }
4242}
4343
44+ mysql_time_impls ! ( Datetime ) ;
45+ primitive_impls ! ( Datetime -> NaiveDateTime ) ;
4446mysql_time_impls ! ( Timestamp ) ;
4547mysql_time_impls ! ( Time ) ;
4648mysql_time_impls ! ( Date ) ;
4749
50+ impl ToSql < Datetime , Mysql > for NaiveDateTime {
51+ fn to_sql < W : Write > ( & self , out : & mut ToSqlOutput < W , Mysql > ) -> Result < IsNull , Box < Error +Send +Sync > > {
52+ <NaiveDateTime as ToSql < Timestamp , Mysql > >:: to_sql ( self , out)
53+ }
54+ }
55+
56+ impl FromSql < Datetime , Mysql > for NaiveDateTime {
57+ fn from_sql ( bytes : Option < & [ u8 ] > ) -> Result < Self , Box < Error +Send +Sync > > {
58+ <NaiveDateTime as FromSql < Timestamp , Mysql > >:: from_sql ( bytes)
59+ }
60+ }
61+
4862impl ToSql < Timestamp , Mysql > for NaiveDateTime {
4963 fn to_sql < W : Write > ( & self , out : & mut ToSqlOutput < W , Mysql > ) -> Result < IsNull , Box < Error +Send +Sync > > {
5064 let mut mysql_time: ffi:: MYSQL_TIME = unsafe { mem:: zeroed ( ) } ;
@@ -134,7 +148,7 @@ mod tests {
134148 use expression:: dsl:: { sql, now} ;
135149 use prelude:: * ;
136150 use select;
137- use types:: { Date , Time , Timestamp } ;
151+ use types:: { Date , Time , Timestamp , Datetime } ;
138152
139153 fn connection ( ) -> MysqlConnection {
140154 dotenv ( ) . ok ( ) ;
@@ -152,6 +166,8 @@ mod tests {
152166 let time = NaiveDate :: from_ymd ( 1970 , 1 , 1 ) . and_hms ( 0 , 0 , 0 ) ;
153167 let query = select ( sql :: < Timestamp > ( "CAST('1970-01-01' AS DATETIME)" ) . eq ( time) ) ;
154168 assert ! ( query. get_result:: <bool >( & connection) . unwrap( ) ) ;
169+ let query = select ( sql :: < Datetime > ( "CAST('1970-01-01' AS DATETIME)" ) . eq ( time) ) ;
170+ assert ! ( query. get_result:: <bool >( & connection) . unwrap( ) ) ;
155171 }
156172
157173 #[ test]
@@ -161,6 +177,9 @@ mod tests {
161177 let epoch_from_sql = select ( sql :: < Timestamp > ( "CAST('1970-01-01' AS DATETIME)" ) )
162178 . get_result ( & connection) ;
163179 assert_eq ! ( Ok ( time) , epoch_from_sql) ;
180+ let epoch_from_sql = select ( sql :: < Datetime > ( "CAST('1970-01-01' AS DATETIME)" ) )
181+ . get_result ( & connection) ;
182+ assert_eq ! ( Ok ( time) , epoch_from_sql) ;
164183 }
165184
166185 #[ test]
0 commit comments