Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 17 additions & 13 deletions src/value/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
// limitations under the License.

use super::bindings;
use chrono::{Datelike, Duration, NaiveDate, NaiveDateTime, NaiveTime, Timelike};
use chrono::{Datelike, Duration, NaiveDate, NaiveDateTime, NaiveTime, TimeZone, Timelike, Utc};
use std::collections::HashMap;
use std::convert::TryFrom;
use std::ffi::{CStr, CString};
Expand Down Expand Up @@ -269,7 +269,7 @@ const NSEC_IN_SEC: i64 = 1_000_000_000;
pub(crate) fn mg_value_naive_date(mg_value: *const bindings::mg_value) -> Result<NaiveDate, ()> {
let c_date = unsafe { bindings::mg_value_date(mg_value) };
let c_delta_days = unsafe { bindings::mg_date_days(c_date) };
let epoch_date = NaiveDate::from_ymd(1970, 1, 1);
let epoch_date = NaiveDate::from_ymd_opt(1970, 1, 1).unwrap();
let delta_days = Duration::days(c_delta_days);
Ok(epoch_date.checked_add_signed(delta_days).unwrap())
}
Expand All @@ -281,10 +281,7 @@ pub(crate) fn mg_value_naive_local_time(
let c_nanoseconds = unsafe { bindings::mg_local_time_nanoseconds(c_local_time) };
let seconds = u32::try_from(c_nanoseconds / NSEC_IN_SEC)?;
let nanoseconds = u32::try_from(c_nanoseconds % NSEC_IN_SEC)?;
Ok(NaiveTime::from_num_seconds_from_midnight(
seconds,
nanoseconds,
))
Ok(NaiveTime::from_num_seconds_from_midnight_opt(seconds, nanoseconds).unwrap())
}

pub(crate) fn mg_value_naive_local_date_time(
Expand All @@ -294,7 +291,10 @@ pub(crate) fn mg_value_naive_local_date_time(
let c_seconds = unsafe { bindings::mg_local_date_time_seconds(c_local_date_time) };
let c_nanoseconds = unsafe { bindings::mg_local_date_time_nanoseconds(c_local_date_time) };
let nanoseconds = u32::try_from(c_nanoseconds)?;
Ok(NaiveDateTime::from_timestamp(c_seconds, nanoseconds))
Ok(Utc
.timestamp_opt(c_seconds, nanoseconds)
.unwrap()
.naive_utc())
}

fn mg_value_datetime_zone_id(
Expand All @@ -306,9 +306,9 @@ fn mg_value_datetime_zone_id(
unsafe { bindings::mg_date_time_zone_id_timezone_name(c_datetime_zone_id) };

// Create NaiveDateTime from timestamp
let naive_datetime = match NaiveDateTime::from_timestamp_opt(c_seconds, c_nanoseconds as u32) {
Some(dt) => dt,
None => {
let naive_datetime = match Utc.timestamp_opt(c_seconds, c_nanoseconds as u32) {
chrono::LocalResult::Single(dt) => dt.naive_utc(),
_ => {
return Err(crate::error::MgError::new(
"Invalid timestamp values".to_string(),
))
Expand All @@ -319,7 +319,7 @@ fn mg_value_datetime_zone_id(
let timezone_name = if c_timezone_name_ptr.is_null() {
"UTC".to_string()
} else {
unsafe { mg_string_to_string(c_timezone_name_ptr) }
mg_string_to_string(c_timezone_name_ptr)
};

// Extract individual date/time fields
Expand Down Expand Up @@ -525,7 +525,9 @@ pub(crate) fn str_to_c_str(string: &str) -> *const std::os::raw::c_char {
}

pub(crate) fn naive_date_to_mg_date(input: &NaiveDate) -> *mut bindings::mg_date {
let unix_epoch = NaiveDate::from_ymd(1970, 1, 1).num_days_from_ce();
let unix_epoch = NaiveDate::from_ymd_opt(1970, 1, 1)
.unwrap()
.num_days_from_ce();
unsafe { bindings::mg_date_make((input.num_days_from_ce() - unix_epoch) as i64) }
}

Expand All @@ -540,7 +542,9 @@ pub(crate) fn naive_local_time_to_mg_local_time(input: &NaiveTime) -> *mut bindi
pub(crate) fn naive_local_date_time_to_mg_local_date_time(
input: &NaiveDateTime,
) -> *mut bindings::mg_local_date_time {
let unix_epoch = NaiveDate::from_ymd(1970, 1, 1).num_days_from_ce();
let unix_epoch = NaiveDate::from_ymd_opt(1970, 1, 1)
.unwrap()
.num_days_from_ce();
let days_s = days_as_seconds((input.num_days_from_ce() - unix_epoch) as i64);
let hours_s = hours_as_seconds(input.hour() as i64);
let minutes_s = minutes_as_seconds(input.minute() as i64);
Expand Down
48 changes: 37 additions & 11 deletions src/value/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,8 @@ fn from_c_mg_value_date1() {
let mg_value = unsafe { Value::from_mg_value(c_mg_value) };
assert_eq!(
Value::Date(
NaiveDate::from_ymd(1970, 1, 1)
NaiveDate::from_ymd_opt(1970, 1, 1)
.unwrap()
.checked_add_signed(Duration::days(100))
.unwrap()
),
Expand All @@ -263,7 +264,10 @@ fn from_c_mg_value_date2() {
let c_date = bindings::mg_date { days: 365 };
let c_mg_value = unsafe { bindings::mg_value_make_date(bindings::mg_date_copy(&c_date)) };
let mg_value = unsafe { Value::from_mg_value(c_mg_value) };
assert_eq!(Value::Date(NaiveDate::from_ymd(1971, 1, 1)), mg_value);
assert_eq!(
Value::Date(NaiveDate::from_ymd_opt(1971, 1, 1).unwrap()),
mg_value
);
assert_eq!(format!("{}", mg_value), "'1971-01-01'");
}

Expand All @@ -272,7 +276,10 @@ fn from_c_mg_value_date3() {
let c_date = bindings::mg_date { days: -365 };
let c_mg_value = unsafe { bindings::mg_value_make_date(bindings::mg_date_copy(&c_date)) };
let mg_value = unsafe { Value::from_mg_value(c_mg_value) };
assert_eq!(Value::Date(NaiveDate::from_ymd(1969, 1, 1)), mg_value);
assert_eq!(
Value::Date(NaiveDate::from_ymd_opt(1969, 1, 1).unwrap()),
mg_value
);
assert_eq!(format!("{}", mg_value), "'1969-01-01'");
}

Expand All @@ -285,7 +292,7 @@ fn from_c_mg_value_local_time() {
unsafe { bindings::mg_value_make_local_time(bindings::mg_local_time_copy(&c_local_time)) };
let mg_value = unsafe { Value::from_mg_value(c_mg_value) };
assert_eq!(
Value::LocalTime(NaiveTime::from_hms_micro(14, 40, 35, 851241)),
Value::LocalTime(NaiveTime::from_hms_micro_opt(14, 40, 35, 851241).unwrap()),
mg_value
);
assert_eq!(format!("{}", mg_value), "'14:40:35.851241'");
Expand All @@ -304,7 +311,12 @@ fn from_c_mg_value_local_date_time1() {
};
let mg_value = unsafe { Value::from_mg_value(c_mg_value) };
assert_eq!(
Value::LocalDateTime(NaiveDate::from_ymd(1971, 5, 16).and_hms_micro(14, 40, 35, 851241)),
Value::LocalDateTime(
NaiveDate::from_ymd_opt(1971, 5, 16)
.unwrap()
.and_hms_micro_opt(14, 40, 35, 851241)
.unwrap()
),
mg_value
);
assert_eq!(format!("{}", mg_value), "'1971-05-16 14:40:35.851241'");
Expand All @@ -323,7 +335,12 @@ fn from_c_mg_value_local_date_time2() {
};
let mg_value = unsafe { Value::from_mg_value(c_mg_value) };
assert_eq!(
Value::LocalDateTime(NaiveDate::from_ymd(1968, 8, 19).and_hms_micro(14, 40, 35, 851241)),
Value::LocalDateTime(
NaiveDate::from_ymd_opt(1968, 8, 19)
.unwrap()
.and_hms_micro_opt(14, 40, 35, 851241)
.unwrap()
),
mg_value
);
assert_eq!(format!("{}", mg_value), "'1968-08-19 14:40:35.851241'");
Expand All @@ -342,7 +359,12 @@ fn from_c_mg_value_local_date_time3() {
};
let mg_value = unsafe { Value::from_mg_value(c_mg_value) };
assert_eq!(
Value::LocalDateTime(NaiveDate::from_ymd(1969, 12, 31).and_hms_micro(23, 59, 59, 0)),
Value::LocalDateTime(
NaiveDate::from_ymd_opt(1969, 12, 31)
.unwrap()
.and_hms_micro_opt(23, 59, 59, 0)
.unwrap()
),
mg_value
);
assert_eq!(format!("{}", mg_value), "'1969-12-31 23:59:59'");
Expand Down Expand Up @@ -800,7 +822,7 @@ fn from_to_c_mg_value_string() {

#[test]
fn from_naive_date_param_to_mg_value() {
let query_param = QueryParam::Date(NaiveDate::from_ymd(1971, 1, 1));
let query_param = QueryParam::Date(NaiveDate::from_ymd_opt(1971, 1, 1).unwrap());
let c_mg_value = unsafe { *(query_param.to_c_mg_value()) };
assert_eq!(c_mg_value.type_, bindings::mg_value_type_MG_VALUE_TYPE_DATE);
let mg_value = unsafe { Value::from_mg_value(&c_mg_value) };
Expand All @@ -819,7 +841,7 @@ fn from_naive_date_param_to_mg_value() {

#[test]
fn from_naive_local_time_param_to_mg_value() {
let query_param = QueryParam::LocalTime(NaiveTime::from_hms_nano(2, 3, 4, 1234));
let query_param = QueryParam::LocalTime(NaiveTime::from_hms_nano_opt(2, 3, 4, 1234).unwrap());
let c_mg_value = unsafe { *(query_param.to_c_mg_value()) };
assert_eq!(
c_mg_value.type_,
Expand All @@ -842,8 +864,12 @@ fn from_naive_local_time_param_to_mg_value() {

#[test]
fn from_naive_local_date_time_param_to_mg_value() {
let query_param =
QueryParam::LocalDateTime(NaiveDate::from_ymd(1960, 1, 1).and_hms_nano(2, 3, 4, 1234));
let query_param = QueryParam::LocalDateTime(
NaiveDate::from_ymd_opt(1960, 1, 1)
.unwrap()
.and_hms_nano_opt(2, 3, 4, 1234)
.unwrap(),
);
let c_mg_value = unsafe { *(query_param.to_c_mg_value()) };
assert_eq!(
c_mg_value.type_,
Expand Down