Move 'now' into core, implement microsecond truncation.
This is so we don't return a more granular -- and thus subtly different -- timestamp in a TxReport than we put into the store.
This commit is contained in:
parent
55d196094a
commit
a8dcad65da
3 changed files with 25 additions and 14 deletions
|
@ -233,6 +233,28 @@ impl TypedValue {
|
|||
}
|
||||
}
|
||||
|
||||
trait MicrosecondPrecision {
|
||||
/// Truncate the provided `DateTime` to microsecond precision.
|
||||
fn microsecond_precision(self) -> Self;
|
||||
}
|
||||
|
||||
impl MicrosecondPrecision for DateTime<Utc> {
|
||||
fn microsecond_precision(self) -> DateTime<Utc> {
|
||||
let nanoseconds = self.nanosecond();
|
||||
if nanoseconds % 1000 == 0 {
|
||||
return self;
|
||||
}
|
||||
let microseconds = nanoseconds / 1000;
|
||||
let truncated = microseconds * 1000;
|
||||
self.with_nanosecond(truncated).expect("valid timestamp")
|
||||
}
|
||||
}
|
||||
|
||||
/// Return the current time as a UTC `DateTime` instance with microsecond precision.
|
||||
pub fn now() -> DateTime<Utc> {
|
||||
Utc::now().microsecond_precision()
|
||||
}
|
||||
|
||||
// We don't do From<i64> or From<Entid> 'cos it's ambiguous.
|
||||
|
||||
impl From<bool> for TypedValue {
|
||||
|
@ -245,9 +267,7 @@ impl From<bool> for TypedValue {
|
|||
/// `TypedValue::Instant`.
|
||||
impl From<DateTime<Utc>> for TypedValue {
|
||||
fn from(value: DateTime<Utc>) -> TypedValue {
|
||||
let microseconds = value.nanosecond() / 1000;
|
||||
let truncated = microseconds * 1000;
|
||||
TypedValue::Instant(value.with_nanosecond(truncated).expect("valid timestamp"))
|
||||
TypedValue::Instant(value.microsecond_precision())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,11 +28,6 @@ use std::iter::repeat;
|
|||
|
||||
use itertools::Itertools;
|
||||
|
||||
use mentat_core::{
|
||||
DateTime,
|
||||
Utc,
|
||||
};
|
||||
|
||||
pub use errors::{Error, ErrorKind, ResultExt, Result};
|
||||
|
||||
pub mod db;
|
||||
|
@ -116,8 +111,3 @@ pub fn repeat_values(values_per_tuple: usize, tuples: usize) -> String {
|
|||
let values: String = repeat(inner).take(tuples).join(", ");
|
||||
values
|
||||
}
|
||||
|
||||
/// Return the current time as a UTC `DateTime` instance.
|
||||
pub fn now() -> DateTime<Utc> {
|
||||
Utc::now()
|
||||
}
|
||||
|
|
|
@ -85,6 +85,7 @@ use mentat_core::{
|
|||
Schema,
|
||||
Utc,
|
||||
attribute,
|
||||
now,
|
||||
};
|
||||
|
||||
use mentat_core::intern_set::InternSet;
|
||||
|
@ -654,7 +655,7 @@ impl<'conn, 'a> Tx<'conn, 'a> {
|
|||
}
|
||||
}
|
||||
|
||||
tx_instant = self.tx_instant.unwrap_or(::now());
|
||||
tx_instant = self.tx_instant.unwrap_or_else(now);
|
||||
|
||||
// Transact [:db/add :db/txInstant NOW :db/tx] if it doesn't exist.
|
||||
if self.tx_instant == None {
|
||||
|
|
Loading…
Reference in a new issue