ODB: сопоставление типов PostgreSQL Numeric с C++ int со специализацией value_traitsC++

Программы на C++. Форум разработчиков
Anonymous
ODB: сопоставление типов PostgreSQL Numeric с C++ int со специализацией value_traits

Сообщение Anonymous »

Я пытаюсь создать класс ODB для следующей таблицы базы данных PostgreSQL:

Код: Выделить всё

CREATE TABLE person
(name          VARCHAR(10)   NOT NULL,
birthday      DATE          NOT NULL,
street        VARCHAR(200)  NOT NULL,
house_number  NUMERIC(3)    NOT NULL,
zip           CHAR(5)       NOT NULL,
city          VARCHAR(100)  NOT NULL,
CONSTRAINT person_pk        PRIMARY KEY (name, birthday)
);
Я создал следующий эквивалентный класс ODB:

Код: Выделить всё

class person {
public:
person() = default;

person(const PersonId& id, const string& street, int house_number, const string& zip, const string& city)
: id_(id), street_(street), house_number_(house_number), zip_(zip), city_(city) {}

const PersonId& id() const { return id_; }
void id(const PersonId& id) { id_ = id; }

const string& street() const { return street_; }
void street(const string& street) { street_ = street; }

int house_number() const { return house_number_; }
void house_number(int house_number) {house_number_ = house_number; }

const string& zip() const { return zip_; }
void zip(const string& zip) { zip_ = zip; }

const string& city() const { return city_; }
void city(const string& city) { city_ = city; }

private:
#pragma db column("")
#pragma db id
PersonId id_;

string street_;

#pragma db type("NUMERIC(3)")
int house_number_;

string zip_;
string city_;

};

В документации ODB указано, что используемый тип данных PostgreSQL «Числовой» для house_number «ограничен предоставлением двоичного буфера, содержащего двоичное представление значения». То есть его нельзя напрямую сопоставить с int C++. Вместо этого мне нужно создать специализацию value_trait, которая реализует преобразование между PostgreSQL Numeric и C++ int. Поэтому я попытался реализовать следующий value_trait:

Код: Выделить всё

namespace odb {
namespace pgsql {
template 
struct value_traits
{
using image_type = details::buffer;

using query_type = int;

static void set_image(image_type& image, std::size_t& size, bool& is_null, const int& value)
{
is_null = false;

std::string s = std::to_string(value);
size = sizeof(int);

std::cout persist(new_person) я получаю следующую ошибку:
08P01: ОШИБКА: в сообщении осталось недостаточно данных.
КОНТЕКСТ: безымянный параметр портала $4.
Параметр $4 относится к house_number. Кто-нибудь знает, в чем здесь проблема?
Спасибо за помощь. уже в вперед!
При печати значения изображения в функции set_image() на консоль печатается правильное значение. 

Подробнее здесь: [url]https://stackoverflow.com/questions/79345402/odb-type-mapping-postgresql-numeric-to-c-int-with-value-traits-specialization[/url]

Вернуться в «C++»