use crate::error::{QuickDbError, QuickDbResult};
use crate::model::{FieldType, conversion::ToDataValue};
use crate::types::{DataValue, DatabaseType};
pub fn convert_datetime_with_tz_aware<T: std::fmt::Debug + ToDataValue>(
value: &T,
timezone_offset: &str,
db_type: Option<DatabaseType>,
) -> QuickDbResult<DataValue> {
let db_type = db_type.expect("严重错误:无法确定数据库类型!这表明框架内部存在严重问题!");
match db_type {
DatabaseType::SQLite => {
let utc_result = crate::convert_string_to_datetime_with_tz(value, timezone_offset)?;
match utc_result {
DataValue::DateTime(dt) => {
let timestamp = dt.timestamp();
Ok(DataValue::Int(timestamp))
}
other => Ok(other), }
}
_ => {
convert_datetime_with_tz_general(value, timezone_offset)
}
}
}
fn convert_datetime_with_tz_general<T: std::fmt::Debug + ToDataValue>(
value: &T,
timezone_offset: &str,
) -> QuickDbResult<DataValue> {
let data_value = value.to_data_value();
match data_value {
DataValue::DateTime(dt) => {
Ok(DataValue::DateTime(dt))
}
DataValue::String(s) => {
crate::convert_string_to_datetime_with_tz(value, timezone_offset)
}
_ => {
Ok(data_value)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use chrono::Utc;
#[test]
fn test_database_aware_conversion() {
let dt = Utc::now();
let result = convert_datetime_with_tz_aware(&dt, "+08:00", Some(DatabaseType::MySQL));
assert!(result.is_ok());
let result = convert_datetime_with_tz_aware(&dt, "-05:00", Some(DatabaseType::SQLite));
assert!(result.is_ok());
let result = convert_datetime_with_tz_aware(&dt, "+09:00", Some(DatabaseType::PostgreSQL));
assert!(result.is_ok());
let result = convert_datetime_with_tz_aware(&dt, "-08:00", Some(DatabaseType::MongoDB));
assert!(result.is_ok());
}
#[test]
#[should_panic(expected = "严重错误:无法确定数据库类型")]
fn test_database_aware_conversion_panic_on_none() {
let dt = Utc::now();
convert_datetime_with_tz_aware(&dt, "+00:00", None);
}
}