7#include <userver/storages/postgres/io/buffer_io.hpp>
8#include <userver/storages/postgres/io/buffer_io_base.hpp>
9#include <userver/storages/postgres/io/numeric_data.hpp>
10#include <userver/storages/postgres/io/type_mapping.hpp>
12#include <boost/multiprecision/cpp_dec_float.hpp>
14USERVER_NAMESPACE_BEGIN
23template <
unsigned Precision>
24struct BufferFormatter<MultiPrecision<Precision>> {
25 using Value = MultiPrecision<Precision>;
28 BufferFormatter(
const Value& val) : value{val} {}
30 template <
typename Buffer>
31 void operator()(
const UserTypes&, Buffer& buf)
const {
32 auto str_rep = value.str(std::numeric_limits<Value>::max_digits10, std::ios_base::fixed);
33 auto bin_str = detail::StringToNumericBuffer(str_rep);
34 buf.reserve(buf.size() + bin_str.size());
35 std::copy(bin_str.begin(), bin_str.end(), std::back_inserter(buf));
39template <
unsigned Precision>
40struct BufferParser<MultiPrecision<Precision>> : detail::BufferParserBase<MultiPrecision<Precision>> {
41 using BaseType = detail::BufferParserBase<MultiPrecision<Precision>>;
42 using BaseType::BaseType;
43 using NumberType = boost::multiprecision::cpp_dec_float<Precision>;
45 void operator()(
const FieldBuffer& buffer) {
46 auto str = detail::NumericBufferToString(buffer);
49 this->value = NumberType{str.c_str()};
53template <
unsigned Precision>
54struct CppToSystemPg<MultiPrecision<Precision>> : PredefinedOid<PredefinedOids::kNumeric> {};