Skip to content

Commit

Permalink
Add time crate support
Browse files Browse the repository at this point in the history
  • Loading branch information
pbzweihander committed Mar 25, 2024
1 parent bfe457c commit bd69769
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 25 deletions.
1 change: 1 addition & 0 deletions influxdb/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
Expand Down
53 changes: 28 additions & 25 deletions influxdb/src/query/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
//! ```

use chrono::prelude::{DateTime, TimeZone, Utc};
use std::convert::TryInto;

pub mod consts;
mod line_proto_term;
Expand All @@ -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::*;
Expand All @@ -59,30 +73,7 @@ impl fmt::Display for Timestamp {

impl From<Timestamp> for DateTime<Utc> {
fn from(ts: Timestamp) -> DateTime<Utc> {
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)
}
}

Expand All @@ -95,6 +86,18 @@ where
}
}

impl From<Timestamp> for time::OffsetDateTime {
fn from(value: Timestamp) -> Self {
time::OffsetDateTime::from_unix_timestamp_nanos(value.nanos() as i128).unwrap()
}
}

impl From<time::OffsetDateTime> 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,
Expand Down

0 comments on commit bd69769

Please sign in to comment.