Skip to content
Open
Show file tree
Hide file tree
Changes from 3 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
5 changes: 5 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ Version history / changelog

From version 2.0.0, turbodbc adapts semantic versioning.

Version 5.2.0
--------------------

* Drop ``boost``, use C++20

Version 5.1.1, 5.1.2
--------------------

Expand Down
2 changes: 1 addition & 1 deletion cpp/turbodbc/Library/src/cursor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#include <cpp_odbc/statement.h>
#include <cpp_odbc/error.h>

#include <boost/variant/get.hpp>
#include <variant>
#include <sqlext.h>
#include <stdexcept>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <turbodbc/descriptions/boolean_description.h>

#include <boost/variant/get.hpp>
#include <variant>
#include <sqlext.h>

namespace turbodbc {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#include <sqlext.h>

#include <boost/variant/get.hpp>
#include <variant>
#include <cstring>

namespace turbodbc {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#include <sqlext.h>

#include <boost/variant/get.hpp>
#include <variant>
#include <cstring>

namespace turbodbc {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#include <sqlext.h>

#include <boost/variant/get.hpp>
#include <variant>
#include <cstring>

namespace turbodbc {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <turbodbc/descriptions/string_description.h>

#include <boost/variant/get.hpp>
#include <variant>

#include <sqlext.h>
#include <cstring>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#include <sqlext.h>

#include <boost/variant/get.hpp>
#include <variant>
#include <cstring>

namespace turbodbc {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <turbodbc/descriptions/unicode_description.h>

#include <boost/variant/get.hpp>
#include <variant>

#ifdef _WIN32
#include <windows.h>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <turbodbc/field_translators/boolean_translator.h>

#include <boost/variant/get.hpp>
#include <variant>


namespace turbodbc { namespace field_translators {
Expand Down
11 changes: 8 additions & 3 deletions cpp/turbodbc/Library/src/field_translators/date_translator.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <turbodbc/field_translators/date_translator.h>

#include <boost/variant/get.hpp>
#include <chrono>

#include <sql.h>

Expand All @@ -13,8 +13,13 @@ date_translator::~date_translator() = default;

field date_translator::do_make_field(char const * data_pointer) const
{
auto const date = reinterpret_cast<SQL_DATE_STRUCT const *>(data_pointer);
return {boost::gregorian::date(date->year, date->month, date->day)};
auto const sql_date = reinterpret_cast<SQL_DATE_STRUCT const *>(data_pointer);
std::chrono::year_month_day ymd{
std::chrono::year{sql_date->year},
std::chrono::month{sql_date->month},
std::chrono::day{sql_date->day}
};
return {ymd};
}


Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <turbodbc/field_translators/float64_translator.h>

#include <boost/variant/get.hpp>
#include <variant>
#include <sqlext.h>

namespace turbodbc { namespace field_translators {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <turbodbc/field_translators/int64_translator.h>

#include <boost/variant/get.hpp>
#include <variant>
#include <sqlext.h>

namespace turbodbc { namespace field_translators {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <turbodbc/field_translators/string_translator.h>

#include <boost/variant/get.hpp>
#include <variant>

#include <stdexcept>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include <turbodbc/field_translators/timestamp_translator.h>

#include <boost/variant/get.hpp>
#include <chrono>

#include <sql.h>

Expand All @@ -13,14 +13,24 @@ timestamp_translator::~timestamp_translator() = default;

field timestamp_translator::do_make_field(char const * data_pointer) const
{
auto const ts = reinterpret_cast<SQL_TIMESTAMP_STRUCT const *>(data_pointer);
// map SQL nanosecond precision to posix_time microsecond precision
int64_t const adjusted_fraction = ts->fraction / 1000;
return {boost::posix_time::ptime{
{static_cast<short unsigned int>(ts->year), ts->month, ts->day},
{ts->hour, ts->minute, ts->second, adjusted_fraction}
}
};
auto const ts = reinterpret_cast<SQL_TIMESTAMP_STRUCT const *>(data_pointer);
int64_t const adjusted_fraction = ts->fraction / 1000;

std::chrono::year_month_day ymd{
std::chrono::year{ts->year},
std::chrono::month{ts->month},
std::chrono::day{ts->day}
};
std::chrono::sys_days sd{ymd};

auto time_of_day = std::chrono::hours(ts->hour)
+ std::chrono::minutes(ts->minute)
+ std::chrono::seconds(ts->second)
+ std::chrono::microseconds(adjusted_fraction);

std::chrono::system_clock::time_point tp = sd + time_of_day;

return {tp};
}

} }
12 changes: 7 additions & 5 deletions cpp/turbodbc/Library/src/make_description.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
#include <turbodbc/descriptions.h>
#include <sqlext.h>

#include <boost/variant/apply_visitor.hpp>
#include <chrono>
#include <variant>

#include <stdexcept>
#include <sstream>
#include <algorithm>

#include <cmath> // for std::ceil

namespace turbodbc {

Expand Down Expand Up @@ -64,7 +66,7 @@ std::unique_ptr<description const> make_decimal_description(cpp_odbc::column_des

using description_ptr = description const *;

struct description_by_value : public boost::static_visitor<description_ptr> {
struct description_by_value {
description_ptr operator()(int64_t const &) const
{
return new integer_description;
Expand All @@ -80,12 +82,12 @@ struct description_by_value : public boost::static_visitor<description_ptr> {
return new boolean_description;
}

description_ptr operator()(boost::gregorian::date const &) const
description_ptr operator()(std::chrono::year_month_day const &) const
{
return new date_description;
}

description_ptr operator()(boost::posix_time::ptime const &) const
description_ptr operator()(std::chrono::system_clock::time_point const &) const
{
return new timestamp_description;
}
Expand Down Expand Up @@ -164,7 +166,7 @@ std::unique_ptr<description const> make_description(cpp_odbc::column_description

std::unique_ptr<description const> make_description(field const & value)
{
return std::unique_ptr<description const>(boost::apply_visitor(description_by_value{}, value));
return std::unique_ptr<description const>(std::visit(description_by_value{}, value));
}

std::unique_ptr<description const> make_description(type_code type, std::size_t size)
Expand Down
64 changes: 35 additions & 29 deletions cpp/turbodbc/Library/src/parameter_sets/set_field.cpp
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
#include <turbodbc/parameter_sets/set_field.h>

#include <boost/variant/static_visitor.hpp>
#include <boost/variant/apply_visitor.hpp>

#include <variant>
#include <cstring>
#include <chrono>
#include <sql.h>

namespace turbodbc {

namespace {

std::size_t const size_not_important = 0;

class is_suitable_for : public boost::static_visitor<bool> {
class is_suitable_for {
public:
is_suitable_for(parameter const & param) :
parameter_(param)
Expand All @@ -28,11 +29,11 @@ namespace {
return parameter_.is_suitable_for(type_code::floating_point, size_not_important);
}

bool operator()(boost::posix_time::ptime const &) const {
bool operator()(std::chrono::system_clock::time_point const &) const {
return parameter_.is_suitable_for(type_code::timestamp, size_not_important);
}

bool operator()(boost::gregorian::date const &) const {
bool operator()(std::chrono::year_month_day const &) const {
return parameter_.is_suitable_for(type_code::date, size_not_important);
}

Expand All @@ -45,7 +46,7 @@ namespace {
};


class set_field_for : public boost::static_visitor<> {
class set_field_for {
public:
set_field_for(cpp_odbc::writable_buffer_element & destination) :
destination_(destination)
Expand All @@ -65,36 +66,41 @@ namespace {

void operator()(double const & value)
{
*reinterpret_cast<double *>(destination_.data_pointer) = boost::get<double>(value);
*reinterpret_cast<double *>(destination_.data_pointer) = value;
destination_.indicator = sizeof(double);
}

void operator()(boost::posix_time::ptime const & value)
void operator()(std::chrono::system_clock::time_point const & value)
{
auto const & date = value.date();
auto const & time = value.time_of_day();
auto destination = reinterpret_cast<SQL_TIMESTAMP_STRUCT *>(destination_.data_pointer);

destination->year = date.year();
destination->month = date.month();
destination->day = date.day();
destination->hour = time.hours();
destination->minute = time.minutes();
destination->second = time.seconds();
// map posix_time microsecond precision to SQL nanosecond precision
destination->fraction = time.fractional_seconds() * 1000;
auto tp = value;
auto dp = std::chrono::floor<std::chrono::days>(tp);
std::chrono::year_month_day ymd{dp};
auto time_of_day = tp - dp;
auto hrs = std::chrono::duration_cast<std::chrono::hours>(time_of_day);
time_of_day -= hrs;
auto mins = std::chrono::duration_cast<std::chrono::minutes>(time_of_day);
time_of_day -= mins;
auto secs = std::chrono::duration_cast<std::chrono::seconds>(time_of_day);
time_of_day -= secs;
auto micros = std::chrono::duration_cast<std::chrono::microseconds>(time_of_day);

auto destination = reinterpret_cast<SQL_TIMESTAMP_STRUCT *>(destination_.data_pointer);
destination->year = static_cast<SQLSMALLINT>(int(ymd.year()));
destination->month = static_cast<SQLUSMALLINT>(unsigned(ymd.month()));
destination->day = static_cast<SQLUSMALLINT>(unsigned(ymd.day()));
destination->hour = static_cast<SQLUSMALLINT>(hrs.count());
destination->minute = static_cast<SQLUSMALLINT>(mins.count());
destination->second = static_cast<SQLUSMALLINT>(secs.count());
destination->fraction = static_cast<SQLUINTEGER>(micros.count() * 1000);
destination_.indicator = sizeof(SQL_TIMESTAMP_STRUCT);
}

void operator()(boost::gregorian::date const & value)
void operator()(std::chrono::year_month_day const & value)
{
auto destination = reinterpret_cast<SQL_DATE_STRUCT *>(destination_.data_pointer);

destination->year = value.year();
destination->month = value.month();
destination->day = value.day();

destination->year = static_cast<SQLSMALLINT>(int(value.year()));
destination->month = static_cast<SQLUSMALLINT>(unsigned(value.month()));
destination->day = static_cast<SQLUSMALLINT>(unsigned(value.day()));
destination_.indicator = sizeof(SQL_DATE_STRUCT);
}

Expand All @@ -114,13 +120,13 @@ namespace {

bool parameter_is_suitable_for(parameter const & param, field const & value)
{
return boost::apply_visitor(is_suitable_for(param), value);
return std::visit(is_suitable_for(param), value);
}

void set_field(field const & value, cpp_odbc::writable_buffer_element & destination)
{
set_field_for visitor(destination);
boost::apply_visitor(visitor, value);
std::visit(visitor, value);
}

void set_null(cpp_odbc::writable_buffer_element & destination)
Expand Down
3 changes: 2 additions & 1 deletion cpp/turbodbc/Library/src/result_sets/bound_result_set.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <turbodbc/buffer_size.h>

#include <sqlext.h>
#include <variant>

namespace turbodbc { namespace result_sets {

Expand All @@ -21,7 +22,7 @@ namespace {
descriptions.push_back(make_description(from_db, options));
}

return boost::apply_visitor(turbodbc::determine_rows_to_buffer(descriptions), options.read_buffer_size);
return std::visit(turbodbc::determine_rows_to_buffer(descriptions), options.read_buffer_size);
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#include <turbodbc/buffer_size.h>

#include <boost/variant.hpp>
#include <variant>
#include <sqlext.h>

#include <future>
Expand Down Expand Up @@ -41,7 +41,7 @@ namespace {

turbodbc::options options_with_half_read_buffer(turbodbc::options options)
{
options.read_buffer_size = boost::apply_visitor(halve_buffer_size(), options.read_buffer_size);
options.read_buffer_size = std::visit(halve_buffer_size(), options.read_buffer_size);
return options;
}

Expand Down
Loading