@@ -71,7 +71,9 @@ class ArrowResultSetTest : public ::testing::Test {
7171 size_t bytes_per_value = std::dynamic_pointer_cast<arrow::FixedWidthType>(array->type ())->bit_width () / 8 ;
7272 auto typed_array = std::dynamic_pointer_cast<arrow::PrimitiveArray>(array);
7373 buffers.emplace_back (cpp_odbc::multi_value_buffer (bytes_per_value, size));
74- memcpy (buffers.back ().data_pointer (), typed_array->values ()->data () + (bytes_per_value * offset), bytes_per_value * size);
74+ memcpy (buffers.back ().data_pointer (),
75+ typed_array->values ()->data () + (bytes_per_value * offset),
76+ bytes_per_value * size);
7577 for (size_t i = 0 ; i < size; i++) {
7678 if (array->IsNull (i + offset)) {
7779 buffers.back ().indicator_pointer ()[i] = SQL_NULL_DATA;
@@ -84,15 +86,21 @@ class ArrowResultSetTest : public ::testing::Test {
8486 {
8587 testing::InSequence sequence;
8688 for (auto && buffers: buffers_vec) {
87- EXPECT_CALL (rs, do_get_buffers ()).WillOnce (testing::Return (buffers)).RetiresOnSaturation ();
89+ EXPECT_CALL (rs, do_get_buffers ())
90+ .WillOnce (testing::Return (buffers))
91+ .RetiresOnSaturation ();
8892 }
8993 }
9094 {
9195 testing::InSequence sequence;
9296 for (auto && buffers: buffers_vec) {
93- EXPECT_CALL (rs, do_fetch_next_batch ()).WillOnce (testing::Return (buffers[0 ].get ().number_of_elements ())).RetiresOnSaturation ();
97+ EXPECT_CALL (rs, do_fetch_next_batch ())
98+ .WillOnce (testing::Return (buffers[0 ].get ().number_of_elements ()))
99+ .RetiresOnSaturation ();
94100 }
95- EXPECT_CALL (rs, do_fetch_next_batch ()).WillOnce (testing::Return (0 )).RetiresOnSaturation ();
101+ EXPECT_CALL (rs, do_fetch_next_batch ())
102+ .WillOnce (testing::Return (0 ))
103+ .RetiresOnSaturation ();
96104 }
97105 }
98106
@@ -422,21 +430,33 @@ TEST_F(ArrowResultSetTest, MultiBatchConversionTimestamp)
422430 }
423431 } else {
424432 ASSERT_OK (builder.Append (i));
425- auto td = boost::posix_time::microseconds (i);
426- auto ts = boost::posix_time::ptime (boost::gregorian::date (1970 , 1 , 1 ), td);
433+ auto tp = std::chrono::system_clock::time_point{
434+ std::chrono::sys_days{std::chrono::year{1970 }/std::chrono::month{1 }/std::chrono::day{1 }} +
435+ std::chrono::microseconds (i)
436+ };
427437 SQL_TIMESTAMP_STRUCT* sql_ts;
428438 if (i < OUTPUT_SIZE) {
429439 sql_ts = reinterpret_cast <SQL_TIMESTAMP_STRUCT*>(buffer_1.data_pointer ()) + i;
430440 } else {
431441 sql_ts = reinterpret_cast <SQL_TIMESTAMP_STRUCT*>(buffer_1_2.data_pointer ()) + (i - OUTPUT_SIZE);
432442 }
433- sql_ts->year = ts.date ().year ();
434- sql_ts->month = ts.date ().month ();
435- sql_ts->day = ts.date ().day ();
436- sql_ts->hour = ts.time_of_day ().hours ();
437- sql_ts->minute = ts.time_of_day ().minutes ();
438- sql_ts->second = ts.time_of_day ().seconds ();
439- sql_ts->fraction = ts.time_of_day ().fractional_seconds () * 1000 ;
443+ auto dp = std::chrono::floor<std::chrono::days>(tp);
444+ std::chrono::year_month_day ymd{dp};
445+ auto tod = tp - dp;
446+ auto hrs = std::chrono::duration_cast<std::chrono::hours>(tod);
447+ tod -= hrs;
448+ auto mins = std::chrono::duration_cast<std::chrono::minutes>(tod);
449+ tod -= mins;
450+ auto secs = std::chrono::duration_cast<std::chrono::seconds>(tod);
451+ tod -= secs;
452+ auto micros = std::chrono::duration_cast<std::chrono::microseconds>(tod);
453+ sql_ts->year = static_cast <SQLSMALLINT>(int (ymd.year ()));
454+ sql_ts->month = static_cast <SQLUSMALLINT>(unsigned (ymd.month ()));
455+ sql_ts->day = static_cast <SQLUSMALLINT>(unsigned (ymd.day ()));
456+ sql_ts->hour = static_cast <SQLUSMALLINT>(hrs.count ());
457+ sql_ts->minute = static_cast <SQLUSMALLINT>(mins.count ());
458+ sql_ts->second = static_cast <SQLUSMALLINT>(secs.count ());
459+ sql_ts->fraction = static_cast <SQLUINTEGER>(micros.count () * 1000 );
440460 }
441461 }
442462 ASSERT_OK (builder.Finish (&array));
@@ -451,21 +471,33 @@ TEST_F(ArrowResultSetTest, MultiBatchConversionTimestamp)
451471 arrow::TimestampBuilder builder (arrow::timestamp (arrow::TimeUnit::MICRO), pool);
452472 for (int64_t i = 0 ; i < 2 * OUTPUT_SIZE; i++) {
453473 ASSERT_OK (builder.Append (i));
454- auto td = boost::posix_time::microseconds (i);
455- auto ts = boost::posix_time::ptime (boost::gregorian::date (1970 , 1 , 1 ), td);
474+ auto tp = std::chrono::system_clock::time_point{
475+ std::chrono::sys_days{std::chrono::year{1970 }/std::chrono::month{1 }/std::chrono::day{1 }} +
476+ std::chrono::microseconds (i)
477+ };
456478 SQL_TIMESTAMP_STRUCT* sql_ts;
457479 if (i < OUTPUT_SIZE) {
458480 sql_ts = reinterpret_cast <SQL_TIMESTAMP_STRUCT*>(buffer_2.data_pointer ()) + i;
459481 } else {
460482 sql_ts = reinterpret_cast <SQL_TIMESTAMP_STRUCT*>(buffer_2_2.data_pointer ()) + (i - OUTPUT_SIZE);
461483 }
462- sql_ts->year = ts.date ().year ();
463- sql_ts->month = ts.date ().month ();
464- sql_ts->day = ts.date ().day ();
465- sql_ts->hour = ts.time_of_day ().hours ();
466- sql_ts->minute = ts.time_of_day ().minutes ();
467- sql_ts->second = ts.time_of_day ().seconds ();
468- sql_ts->fraction = ts.time_of_day ().fractional_seconds () * 1000 ;
484+ auto dp = std::chrono::floor<std::chrono::days>(tp);
485+ std::chrono::year_month_day ymd{dp};
486+ auto tod = tp - dp;
487+ auto hrs = std::chrono::duration_cast<std::chrono::hours>(tod);
488+ tod -= hrs;
489+ auto mins = std::chrono::duration_cast<std::chrono::minutes>(tod);
490+ tod -= mins;
491+ auto secs = std::chrono::duration_cast<std::chrono::seconds>(tod);
492+ tod -= secs;
493+ auto micros = std::chrono::duration_cast<std::chrono::microseconds>(tod);
494+ sql_ts->year = static_cast <SQLSMALLINT>(int (ymd.year ()));
495+ sql_ts->month = static_cast <SQLUSMALLINT>(unsigned (ymd.month ()));
496+ sql_ts->day = static_cast <SQLUSMALLINT>(unsigned (ymd.day ()));
497+ sql_ts->hour = static_cast <SQLUSMALLINT>(hrs.count ());
498+ sql_ts->minute = static_cast <SQLUSMALLINT>(mins.count ());
499+ sql_ts->second = static_cast <SQLUSMALLINT>(secs.count ());
500+ sql_ts->fraction = static_cast <SQLUINTEGER>(micros.count () * 1000 );
469501 }
470502 ASSERT_OK (builder.Finish (&nonnull_array));
471503 }
0 commit comments