|
| 1 | +use bytes::BytesMut; |
| 2 | +use jiff_01::{ |
| 3 | + civil::{Date,DateTime,Time}, |
| 4 | + tz::TimeZone, |
| 5 | +Span,TimestampasJiffTimestamp,Zoned, |
| 6 | +}; |
| 7 | +use postgres_protocol::types; |
| 8 | +use std::error::Error; |
| 9 | + |
| 10 | +usecrate::{FromSql,IsNull,ToSql,Type}; |
| 11 | + |
| 12 | +constfnbase() ->DateTime{ |
| 13 | +DateTime::constant(2000,1,1,0,0,0,0) |
| 14 | +} |
| 15 | + |
| 16 | +impl<'a>FromSql<'a>forDateTime{ |
| 17 | +fnfrom_sql(_:&Type,raw:&[u8]) ->Result<DateTime,Box<dynError +Sync +Send>>{ |
| 18 | +let t = types::timestamp_from_sql(raw)?; |
| 19 | +Ok(base().checked_add(Span::new().microseconds(t))?) |
| 20 | +} |
| 21 | + |
| 22 | +accepts!(TIMESTAMP); |
| 23 | +} |
| 24 | + |
| 25 | +implToSqlforDateTime{ |
| 26 | +fnto_sql(&self, _:&Type,w:&mutBytesMut) ->Result<IsNull,Box<dynError +Sync +Send>>{ |
| 27 | + types::timestamp_to_sql(self.since(base())?.get_microseconds(), w); |
| 28 | +Ok(IsNull::No) |
| 29 | +} |
| 30 | + |
| 31 | +accepts!(TIMESTAMP); |
| 32 | +to_sql_checked!(); |
| 33 | +} |
| 34 | + |
| 35 | +impl<'a>FromSql<'a>forJiffTimestamp{ |
| 36 | +fnfrom_sql(type_:&Type,raw:&[u8]) ->Result<JiffTimestamp,Box<dynError +Sync +Send>>{ |
| 37 | +Ok(DateTime::from_sql(type_, raw)? |
| 38 | +.to_zoned(TimeZone::UTC)? |
| 39 | +.timestamp()) |
| 40 | +} |
| 41 | + |
| 42 | +accepts!(TIMESTAMPTZ); |
| 43 | +} |
| 44 | + |
| 45 | +implToSqlforJiffTimestamp{ |
| 46 | +fnto_sql(&self, _:&Type,w:&mutBytesMut) ->Result<IsNull,Box<dynError +Sync +Send>>{ |
| 47 | + types::timestamp_to_sql( |
| 48 | +self.since(base().to_zoned(TimeZone::UTC)?)? |
| 49 | +.get_microseconds(), |
| 50 | + w, |
| 51 | +); |
| 52 | +Ok(IsNull::No) |
| 53 | +} |
| 54 | + |
| 55 | +accepts!(TIMESTAMPTZ); |
| 56 | +to_sql_checked!(); |
| 57 | +} |
| 58 | + |
| 59 | +impl<'a>FromSql<'a>forZoned{ |
| 60 | +fnfrom_sql(type_:&Type,raw:&[u8]) ->Result<Zoned,Box<dynError +Sync +Send>>{ |
| 61 | +Ok(JiffTimestamp::from_sql(type_, raw)?.to_zoned(TimeZone::UTC)) |
| 62 | +} |
| 63 | + |
| 64 | +accepts!(TIMESTAMPTZ); |
| 65 | +} |
| 66 | + |
| 67 | +implToSqlforZoned{ |
| 68 | +fnto_sql( |
| 69 | +&self, |
| 70 | +type_:&Type, |
| 71 | +w:&mutBytesMut, |
| 72 | +) ->Result<IsNull,Box<dynError +Sync +Send>>{ |
| 73 | +self.timestamp().to_sql(type_, w) |
| 74 | +} |
| 75 | + |
| 76 | +accepts!(TIMESTAMPTZ); |
| 77 | +to_sql_checked!(); |
| 78 | +} |
| 79 | + |
| 80 | +impl<'a>FromSql<'a>forDate{ |
| 81 | +fnfrom_sql(_:&Type,raw:&[u8]) ->Result<Date,Box<dynError +Sync +Send>>{ |
| 82 | +let jd = types::date_from_sql(raw)?; |
| 83 | +Ok(base().date().checked_add(Span::new().days(jd))?) |
| 84 | +} |
| 85 | + |
| 86 | +accepts!(DATE); |
| 87 | +} |
| 88 | + |
| 89 | +implToSqlforDate{ |
| 90 | +fnto_sql(&self, _:&Type,w:&mutBytesMut) ->Result<IsNull,Box<dynError +Sync +Send>>{ |
| 91 | +let jd =self.since(base().date())?.get_days(); |
| 92 | + types::date_to_sql(jd, w); |
| 93 | +Ok(IsNull::No) |
| 94 | +} |
| 95 | + |
| 96 | +accepts!(DATE); |
| 97 | +to_sql_checked!(); |
| 98 | +} |
| 99 | + |
| 100 | +impl<'a>FromSql<'a>forTime{ |
| 101 | +fnfrom_sql(_:&Type,raw:&[u8]) ->Result<Time,Box<dynError +Sync +Send>>{ |
| 102 | +let usec = types::time_from_sql(raw)?; |
| 103 | +Ok(Time::midnight() +Span::new().microseconds(usec)) |
| 104 | +} |
| 105 | + |
| 106 | +accepts!(TIME); |
| 107 | +} |
| 108 | + |
| 109 | +implToSqlforTime{ |
| 110 | +fnto_sql(&self, _:&Type,w:&mutBytesMut) ->Result<IsNull,Box<dynError +Sync +Send>>{ |
| 111 | +let delta =self.since(Time::midnight())?; |
| 112 | + types::time_to_sql(delta.get_microseconds(), w); |
| 113 | +Ok(IsNull::No) |
| 114 | +} |
| 115 | + |
| 116 | +accepts!(TIME); |
| 117 | +to_sql_checked!(); |
| 118 | +} |