From bd69769dc7a80dd8f15fc75c53b022324f543442 Mon Sep 17 00:00:00 2001 From: pbzweihander Date: Mon, 25 Mar 2024 10:49:31 +0900 Subject: [PATCH] Add time crate support --- influxdb/Cargo.toml | 1 + influxdb/src/query/mod.rs | 53 +++++++++++++++++++++------------------ 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/influxdb/Cargo.toml b/influxdb/Cargo.toml index fec3c09..ffca9ae 100644 --- a/influxdb/Cargo.toml +++ b/influxdb/Cargo.toml @@ -24,6 +24,7 @@ serde = { version = "1.0.186", optional = true } serde_derive = { version = "1.0.186", optional = true } serde_json = { version = "1.0.48", optional = true } thiserror = "1.0" +time = "0.3.34" [features] default = ["serde", "reqwest-client-rustls"] diff --git a/influxdb/src/query/mod.rs b/influxdb/src/query/mod.rs index 02163c7..0dcdf49 100644 --- a/influxdb/src/query/mod.rs +++ b/influxdb/src/query/mod.rs @@ -21,7 +21,6 @@ //! ``` use chrono::prelude::{DateTime, TimeZone, Utc}; -use std::convert::TryInto; pub mod consts; mod line_proto_term; @@ -47,6 +46,21 @@ pub enum Timestamp { Hours(u128), } +impl Timestamp { + pub fn nanos(&self) -> u128 { + match self { + Timestamp::Hours(h) => { + h * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLIS_PER_SECOND * NANOS_PER_MILLI + } + Timestamp::Minutes(m) => m * SECONDS_PER_MINUTE * MILLIS_PER_SECOND * NANOS_PER_MILLI, + Timestamp::Seconds(s) => s * MILLIS_PER_SECOND * NANOS_PER_MILLI, + Timestamp::Milliseconds(millis) => millis * NANOS_PER_MILLI, + Timestamp::Microseconds(micros) => micros * NANOS_PER_MICRO, + Timestamp::Nanoseconds(nanos) => *nanos, + } + } +} + impl fmt::Display for Timestamp { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use Timestamp::*; @@ -59,30 +73,7 @@ impl fmt::Display for Timestamp { impl From for DateTime { fn from(ts: Timestamp) -> DateTime { - match ts { - Timestamp::Hours(h) => { - let nanos = - h * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLIS_PER_SECOND * NANOS_PER_MILLI; - Utc.timestamp_nanos(nanos.try_into().unwrap()) - } - Timestamp::Minutes(m) => { - let nanos = m * SECONDS_PER_MINUTE * MILLIS_PER_SECOND * NANOS_PER_MILLI; - Utc.timestamp_nanos(nanos.try_into().unwrap()) - } - Timestamp::Seconds(s) => { - let nanos = s * MILLIS_PER_SECOND * NANOS_PER_MILLI; - Utc.timestamp_nanos(nanos.try_into().unwrap()) - } - Timestamp::Milliseconds(millis) => { - let nanos = millis * NANOS_PER_MILLI; - Utc.timestamp_nanos(nanos.try_into().unwrap()) - } - Timestamp::Nanoseconds(nanos) => Utc.timestamp_nanos(nanos.try_into().unwrap()), - Timestamp::Microseconds(micros) => { - let nanos = micros * NANOS_PER_MICRO; - Utc.timestamp_nanos(nanos.try_into().unwrap()) - } - } + Utc.timestamp_nanos(ts.nanos() as i64) } } @@ -95,6 +86,18 @@ where } } +impl From for time::OffsetDateTime { + fn from(value: Timestamp) -> Self { + time::OffsetDateTime::from_unix_timestamp_nanos(value.nanos() as i128).unwrap() + } +} + +impl From for Timestamp { + fn from(value: time::OffsetDateTime) -> Self { + Timestamp::Nanoseconds(value.unix_timestamp_nanos() as u128) + } +} + pub trait Query { /// Builds valid InfluxSQL which can be run against the Database. /// In case no fields have been specified, it will return an error,