// // Copyright (c) 2019-2023 Ruben Perez Hidalgo (rubenperez038 at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef BOOST_MYSQL_IMPL_FIELD_VIEW_HPP #define BOOST_MYSQL_IMPL_FIELD_VIEW_HPP #pragma once #include #include #include #include #include #include #include #include #include #include namespace boost { namespace mysql { namespace detail { inline std::ostream& print_blob(std::ostream& os, blob_view value) { if (value.empty()) return os << "{}"; char buffer[16]{}; os << "{ "; for (std::size_t i = 0; i < value.size(); ++i) { if (i != 0) os << ", "; unsigned byte = value[i]; std::snprintf(buffer, sizeof(buffer), "0x%02x", byte); os << buffer; } os << " }"; return os; } inline std::ostream& print_time(std::ostream& os, const time& value) { // Worst-case output is 26 chars, extra space just in case char buffer[64]{}; using namespace std::chrono; const char* sign = value < microseconds(0) ? "-" : ""; auto num_micros = value % seconds(1); auto num_secs = duration_cast(value % minutes(1) - num_micros); auto num_mins = duration_cast(value % hours(1) - num_secs); auto num_hours = duration_cast(value - num_mins); snprintf( buffer, sizeof(buffer), "%s%02d:%02u:%02u.%06u", sign, static_cast(std::abs(num_hours.count())), static_cast(std::abs(num_mins.count())), static_cast(std::abs(num_secs.count())), static_cast(std::abs(num_micros.count())) ); os << buffer; return os; } inline bool blobs_equal(blob_view b1, blob_view b2) { if (b1.size() != b2.size()) return false; return b1.empty() || std::memcmp(b1.data(), b2.data(), b2.size()) == 0; } } // namespace detail } // namespace mysql } // namespace boost BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(signed char v) noexcept : ikind_(internal_kind::int64), repr_(std::int64_t(v)) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(short v) noexcept : ikind_(internal_kind::int64), repr_(std::int64_t(v)) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(int v) noexcept : ikind_(internal_kind::int64), repr_(std::int64_t(v)) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(long v) noexcept : ikind_(internal_kind::int64), repr_(std::int64_t(v)) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(long long v) noexcept : ikind_(internal_kind::int64), repr_(std::int64_t(v)) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(unsigned char v) noexcept : ikind_(internal_kind::uint64), repr_(std::uint64_t(v)) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(unsigned short v) noexcept : ikind_(internal_kind::uint64), repr_(std::uint64_t(v)) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(unsigned int v) noexcept : ikind_(internal_kind::uint64), repr_(std::uint64_t(v)) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(unsigned long v) noexcept : ikind_(internal_kind::uint64), repr_(std::uint64_t(v)) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(unsigned long long v) noexcept : ikind_(internal_kind::uint64), repr_(std::uint64_t(v)) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(string_view v) noexcept : ikind_(internal_kind::string), repr_(v) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(blob_view v) noexcept : ikind_(internal_kind::blob), repr_(v) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(float v) noexcept : ikind_(internal_kind::float_), repr_(v) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(double v) noexcept : ikind_(internal_kind::double_), repr_(v) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(const date& v) noexcept : ikind_(internal_kind::date), repr_(v) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(const datetime& v) noexcept : ikind_(internal_kind::datetime), repr_(v) { } BOOST_CXX14_CONSTEXPR boost::mysql::field_view::field_view(const time& v) noexcept : ikind_(internal_kind::time), repr_(v) { } BOOST_CXX14_CONSTEXPR inline boost::mysql::field_kind boost::mysql::field_view::kind() const noexcept { switch (ikind_) { case internal_kind::null: return field_kind::null; case internal_kind::int64: return field_kind::int64; case internal_kind::uint64: return field_kind::uint64; case internal_kind::string: return field_kind::string; case internal_kind::blob: return field_kind::blob; case internal_kind::float_: return field_kind::float_; case internal_kind::double_: return field_kind::double_; case internal_kind::date: return field_kind::date; case internal_kind::datetime: return field_kind::datetime; case internal_kind::time: return field_kind::time; case internal_kind::field_ptr: return repr_.field_ptr->kind(); // sv_offset values must be converted via offset_to_string_view before calling any other fn default: return field_kind::null; } } BOOST_CXX14_CONSTEXPR std::int64_t boost::mysql::field_view::as_int64() const { if (is_field_ptr()) return repr_.field_ptr->as(); check_kind(internal_kind::int64); return repr_.int64; } BOOST_CXX14_CONSTEXPR std::uint64_t boost::mysql::field_view::as_uint64() const { if (is_field_ptr()) return repr_.field_ptr->as(); check_kind(internal_kind::uint64); return repr_.uint64; } BOOST_CXX14_CONSTEXPR boost::mysql::string_view boost::mysql::field_view::as_string() const { if (is_field_ptr()) return repr_.field_ptr->as(); check_kind(internal_kind::string); return repr_.string; } BOOST_CXX14_CONSTEXPR boost::mysql::blob_view boost::mysql::field_view::as_blob() const { if (is_field_ptr()) return repr_.field_ptr->as(); check_kind(internal_kind::blob); return repr_.blob; } BOOST_CXX14_CONSTEXPR float boost::mysql::field_view::as_float() const { if (is_field_ptr()) return repr_.field_ptr->as(); check_kind(internal_kind::float_); return repr_.float_; } BOOST_CXX14_CONSTEXPR double boost::mysql::field_view::as_double() const { if (is_field_ptr()) return repr_.field_ptr->as(); check_kind(internal_kind::double_); return repr_.double_; } BOOST_CXX14_CONSTEXPR boost::mysql::date boost::mysql::field_view::as_date() const { if (is_field_ptr()) return repr_.field_ptr->as(); check_kind(internal_kind::date); return repr_.date_; } BOOST_CXX14_CONSTEXPR boost::mysql::datetime boost::mysql::field_view::as_datetime() const { if (is_field_ptr()) return repr_.field_ptr->as(); check_kind(internal_kind::datetime); return repr_.datetime_; } BOOST_CXX14_CONSTEXPR boost::mysql::time boost::mysql::field_view::as_time() const { if (is_field_ptr()) return repr_.field_ptr->as