1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//! Serialization to/from PostgreSQL

use diesel::deserialize::FromSql;
use diesel::deserialize::Result as DeserializeResult;
use diesel::pg::data_types::PgTime;
use diesel::pg::Pg;
use diesel::pg::PgValue;
use diesel::serialize::Output;
use diesel::serialize::Result as SerializeResult;
use diesel::serialize::ToSql;
use diesel::sql_types;

use crate::WallClockTime;

impl ToSql<sql_types::Time, Pg> for WallClockTime {
  fn to_sql<'se>(&'se self, out: &mut Output<'se, '_, Pg>) -> SerializeResult {
    let micros = self.seconds as i64 * 1_000_000 + self.micros as i64;
    ToSql::<sql_types::Time, Pg>::to_sql(&PgTime(micros), &mut out.reborrow())
  }
}

impl FromSql<sql_types::Time, Pg> for WallClockTime {
  fn from_sql(bytes: PgValue<'_>) -> DeserializeResult<Self> {
    let PgTime(offset) = FromSql::<diesel::sql_types::Time, Pg>::from_sql(bytes)?;
    Ok(Self { seconds: (offset / 1_000_000) as u32, micros: (offset % 1_000_000) as u32 })
  }
}