diff --git a/doc_test_utils/Cargo.toml b/doc_test_utils/Cargo.toml index 35b44de..59b457c 100644 --- a/doc_test_utils/Cargo.toml +++ b/doc_test_utils/Cargo.toml @@ -9,6 +9,6 @@ rust-version = "1.65" [dependencies] neo4j = { path = "../neo4j" } -env_logger = "0.10.0" -log = "0.4.20" +env_logger = "0.10.2" +log = "0.4.21" named-lock = "0.3.0" diff --git a/neo4j/Cargo.toml b/neo4j/Cargo.toml index ee8d111..f9be806 100644 --- a/neo4j/Cargo.toml +++ b/neo4j/Cargo.toml @@ -22,27 +22,27 @@ _internal_testkit_backend = [] [dependencies] atomic_refcell = "0.1.13" -chrono = "0.4.31" -chrono-tz = "0.8.4" +chrono = "0.4.37" +chrono-tz = "0.8.6" duplicate = "1.0.0" -enum_dispatch = "0.3.12" +enum_dispatch = "0.3.13" itertools = "0.11.0" -log = "0.4.20" +log = "0.4.21" mockall_double = "0.3.1" parking_lot = "0.12.1" rand = "0.8.5" -rustls = "0.22.1" +rustls = "0.22.3" rustls-native-certs = "0.7.0" -rustls-pemfile = "2.0.0" -rustls-pki-types = "1.0.0" -socket2 = "0.5.5" -thiserror = "1.0.51" +rustls-pemfile = "2.1.2" +rustls-pki-types = "1.4.1" +socket2 = "0.5.6" +thiserror = "1.0.58" uriparse = "0.6.4" usize_cast = "1.1.0" [dev-dependencies] doc_test_utils = { path = "../doc_test_utils" } -env_logger = "0.10.1" +env_logger = "0.10.2" lazy_static = "1.4.0" mockall = "0.12.1" rstest = "0.18.2" diff --git a/neo4j/src/driver/io/bolt/bolt4x4/translator.rs b/neo4j/src/driver/io/bolt/bolt4x4/translator.rs index 54eed80..8b2d0c8 100644 --- a/neo4j/src/driver/io/bolt/bolt4x4/translator.rs +++ b/neo4j/src/driver/io/bolt/bolt4x4/translator.rs @@ -15,7 +15,7 @@ use std::collections::VecDeque; use std::str::FromStr; -use chrono::{LocalResult, NaiveDateTime, Offset, TimeZone}; +use chrono::{LocalResult, Offset, TimeZone}; use usize_cast::IntoIsize; use super::super::bolt5x0::Bolt5x0StructTranslator; @@ -23,7 +23,7 @@ use super::super::bolt_common::*; use super::super::{BoltStructTranslator, BoltStructTranslatorWithUtcPatch}; use crate::driver::io::bolt::PackStreamSerializer; use crate::value::graph::{Node, Path, Relationship, UnboundRelationship}; -use crate::value::time::{FixedOffset, Tz}; +use crate::value::time::{local_date_time_from_timestamp, FixedOffset, Tz}; use crate::value::{BrokenValue, BrokenValueInner, ValueReceive, ValueSend}; const TAG_NODE: u8 = b'N'; @@ -247,7 +247,7 @@ impl BoltStructTranslator for Bolt4x4StructTranslator { }; nanoseconds = nanoseconds.rem_euclid(1_000_000_000); let nanoseconds = nanoseconds as u32; - let dt = match NaiveDateTime::from_timestamp_opt(seconds, nanoseconds) { + let dt = match local_date_time_from_timestamp(seconds, nanoseconds) { Some(dt) => dt, None => return failed_struct("DateTime out of bounds"), }; @@ -290,7 +290,7 @@ impl BoltStructTranslator for Bolt4x4StructTranslator { }; nanoseconds = nanoseconds.rem_euclid(1_000_000_000); let nanoseconds = nanoseconds as u32; - let dt = match NaiveDateTime::from_timestamp_opt(seconds, nanoseconds) { + let dt = match local_date_time_from_timestamp(seconds, nanoseconds) { Some(dt) => dt, None => return failed_struct("DateTimeZoneId out of bounds"), }; diff --git a/neo4j/src/driver/io/bolt/bolt5x0/translator.rs b/neo4j/src/driver/io/bolt/bolt5x0/translator.rs index 8b53d48..761a28d 100644 --- a/neo4j/src/driver/io/bolt/bolt5x0/translator.rs +++ b/neo4j/src/driver/io/bolt/bolt5x0/translator.rs @@ -26,7 +26,9 @@ use crate::value::spatial::{ Cartesian2D, Cartesian3D, SRID_CARTESIAN_2D, SRID_CARTESIAN_3D, SRID_WGS84_2D, SRID_WGS84_3D, WGS84_2D, WGS84_3D, }; -use crate::value::time::{Date, Duration, FixedOffset, LocalDateTime, LocalTime, Time, Tz}; +use crate::value::time::{ + local_date_time_from_timestamp, Date, Duration, FixedOffset, LocalTime, Time, Tz, +}; use crate::value::{BrokenValue, BrokenValueInner, ValueReceive, ValueSend}; #[derive(Debug, Default)] @@ -148,7 +150,7 @@ impl BoltStructTranslator for Bolt5x0StructTranslator { Ok(()) } ValueSend::LocalDateTime(dt) => { - let seconds = dt.timestamp(); + let seconds = dt.and_utc().timestamp(); let nanoseconds = dt.nanosecond(); if nanoseconds >= 1_000_000_000 { return Err( @@ -462,7 +464,7 @@ impl BoltStructTranslator for Bolt5x0StructTranslator { Some(tz) => tz, None => return failed_struct("DateTime tz_offset out of bounds"), }; - let utc_dt = match LocalDateTime::from_timestamp_opt(seconds, nanoseconds) { + let utc_dt = match local_date_time_from_timestamp(seconds, nanoseconds) { Some(dt) => dt, None => return failed_struct("DateTime out of bounds"), }; @@ -496,7 +498,7 @@ impl BoltStructTranslator for Bolt5x0StructTranslator { )); } }; - let utc_dt = match LocalDateTime::from_timestamp_opt(seconds, nanoseconds) { + let utc_dt = match local_date_time_from_timestamp(seconds, nanoseconds) { Some(dt) => dt, None => return failed_struct("DateTimeZoneId out of bounds"), }; @@ -518,7 +520,7 @@ impl BoltStructTranslator for Bolt5x0StructTranslator { }; nanoseconds = nanoseconds.rem_euclid(1_000_000_000); let nanoseconds = nanoseconds as u32; - let dt = match LocalDateTime::from_timestamp_opt(seconds, nanoseconds) { + let dt = match local_date_time_from_timestamp(seconds, nanoseconds) { Some(dt) => dt, None => return failed_struct("LocalDateTime out of bounds"), }; diff --git a/neo4j/src/value/time.rs b/neo4j/src/value/time.rs index a46779e..a0972d9 100644 --- a/neo4j/src/value/time.rs +++ b/neo4j/src/value/time.rs @@ -70,3 +70,7 @@ impl Duration { self.name } } + +pub(crate) fn local_date_time_from_timestamp(secs: i64, nsecs: u32) -> Option { + chrono::DateTime::from_timestamp(secs, nsecs).map(|dt| dt.naive_utc()) +} diff --git a/testkit_backend/Cargo.toml b/testkit_backend/Cargo.toml index 55d947f..a6262f8 100644 --- a/testkit_backend/Cargo.toml +++ b/testkit_backend/Cargo.toml @@ -9,14 +9,14 @@ edition = "2021" neo4j = { path = "../neo4j", features = ["_internal_testkit_backend"] } atomic_refcell = "0.1.13" -base64 = "0.21.5" -chrono = "0.4.31" +base64 = "0.21.7" +chrono = "0.4.37" fern = "0.6.2" flume = "0.11.0" -itertools = "0.12.0" +itertools = "0.12.1" lazy-regex = "3.1.0" -log = "0.4.20" -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" -snowflaked = "1.0.2" -thiserror = "1.0.51" +log = "0.4.21" +serde = { version = "1.0.197", features = ["derive"] } +serde_json = "1.0.115" +snowflaked = "1.0.3" +thiserror = "1.0.58"