@@ -13,11 +13,8 @@ namespace turbodbc {
1313using sys_time_us = std::chrono::time_point<std::chrono::system_clock, std::chrono::microseconds>;
1414
1515// Define the epoch for timestamps and dates.
16- constexpr sys_time_us timestamp_epoch =
17- sys_time_us (std::chrono::time_point_cast<std::chrono::microseconds>(
18- std::chrono::sys_days{std::chrono::year{1970 }/1 /1 }
19- ));
20- constexpr std::chrono::sys_days date_epoch = std::chrono::sys_days{std::chrono::year{1970 }/1 /1 };
16+ constexpr sys_time_us timestamp_epoch{};
17+ constexpr std::chrono::sys_days date_epoch{};
2118
2219int64_t timestamp_to_microseconds (char const * data_pointer)
2320{
@@ -68,9 +65,9 @@ void microseconds_to_timestamp(int64_t microseconds, char * data_pointer)
6865
6966 // Fill the SQL_TIMESTAMP_STRUCT.
7067 auto & sql_ts = *reinterpret_cast <SQL_TIMESTAMP_STRUCT *>(data_pointer);
71- sql_ts.year = static_cast <SQLSMALLINT>(int (ymd.year ()));
72- sql_ts.month = static_cast <SQLUSMALLINT>(unsigned (ymd.month ()));
73- sql_ts.day = static_cast <SQLUSMALLINT>(unsigned (ymd.day ()));
68+ sql_ts.year = static_cast <SQLSMALLINT>(static_cast < int > (ymd.year ()));
69+ sql_ts.month = static_cast <SQLUSMALLINT>(static_cast < unsigned > (ymd.month ()));
70+ sql_ts.day = static_cast <SQLUSMALLINT>(static_cast < unsigned > (ymd.day ()));
7471 sql_ts.hour = static_cast <SQLUSMALLINT>(hrs.count ());
7572 sql_ts.minute = static_cast <SQLUSMALLINT>(mins.count ());
7673 sql_ts.second = static_cast <SQLUSMALLINT>(secs.count ());
@@ -80,9 +77,9 @@ void microseconds_to_timestamp(int64_t microseconds, char * data_pointer)
8077
8178void nanoseconds_to_timestamp (int64_t nanoseconds, char * data_pointer)
8279{
83- // Determine the microsecond component .
84- int64_t micros_part = nanoseconds / 1000 ;
85- sys_time_us tp = timestamp_epoch + std::chrono::microseconds (micros_part );
80+ // Create a nanoseconds duration from the input .
81+ auto ns = std::chrono:: nanoseconds(nanoseconds) ;
82+ sys_time_us tp = timestamp_epoch + std::chrono::duration_cast<std::chrono:: microseconds>(ns );
8683
8784 auto dp = std::chrono::floor<std::chrono::days>(tp);
8885 std::chrono::year_month_day ymd{dp};
@@ -95,17 +92,17 @@ void nanoseconds_to_timestamp(int64_t nanoseconds, char * data_pointer)
9592 time_of_day -= secs;
9693 auto micros = std::chrono::duration_cast<std::chrono::microseconds>(time_of_day);
9794
98- auto remainder_nanoseconds = nanoseconds % 1000 ;
95+ auto remainder = ns % std::chrono::nanoseconds ( 1000 ) ;
9996
10097 auto & sql_ts = *reinterpret_cast <SQL_TIMESTAMP_STRUCT *>(data_pointer);
101- sql_ts.year = static_cast <SQLSMALLINT>(int (ymd.year ()));
102- sql_ts.month = static_cast <SQLUSMALLINT>(unsigned (ymd.month ()));
103- sql_ts.day = static_cast <SQLUSMALLINT>(unsigned (ymd.day ()));
98+ sql_ts.year = static_cast <SQLSMALLINT>(static_cast < int > (ymd.year ()));
99+ sql_ts.month = static_cast <SQLUSMALLINT>(static_cast < unsigned > (ymd.month ()));
100+ sql_ts.day = static_cast <SQLUSMALLINT>(static_cast < unsigned > (ymd.day ()));
104101 sql_ts.hour = static_cast <SQLUSMALLINT>(hrs.count ());
105102 sql_ts.minute = static_cast <SQLUSMALLINT>(mins.count ());
106103 sql_ts.second = static_cast <SQLUSMALLINT>(secs.count ());
107104 // Combine the microsecond part (converted back to nanoseconds) with the remainder.
108- sql_ts.fraction = static_cast <SQLUINTEGER>(micros.count () * 1000 + remainder_nanoseconds );
105+ sql_ts.fraction = static_cast <SQLUINTEGER>(micros.count () * 1000 + remainder. count () );
109106}
110107
111108
@@ -127,9 +124,9 @@ void days_to_date(int64_t days, char * data_pointer)
127124 std::chrono::year_month_day ymd{dp};
128125
129126 auto & sql_date = *reinterpret_cast <SQL_DATE_STRUCT *>(data_pointer);
130- sql_date.year = static_cast <SQLSMALLINT>(int (ymd.year ()));
131- sql_date.month = static_cast <SQLUSMALLINT>(unsigned (ymd.month ()));
132- sql_date.day = static_cast <SQLUSMALLINT>(unsigned (ymd.day ()));
127+ sql_date.year = static_cast <SQLSMALLINT>(static_cast < int > (ymd.year ()));
128+ sql_date.month = static_cast <SQLUSMALLINT>(static_cast < unsigned > (ymd.month ()));
129+ sql_date.day = static_cast <SQLUSMALLINT>(static_cast < unsigned > (ymd.day ()));
133130}
134131
135132
0 commit comments