From 8dd5facce7de37cc8a97e0bfafbf47d4834b5589 Mon Sep 17 00:00:00 2001 From: jie Date: Mon, 15 Nov 2021 15:32:36 +0800 Subject: [PATCH] add db optional support --- WebApp/bserv/include/bserv/database.hpp | 41 +++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/WebApp/bserv/include/bserv/database.hpp b/WebApp/bserv/include/bserv/database.hpp index f7b88f6..6582b27 100644 --- a/WebApp/bserv/include/bserv/database.hpp +++ b/WebApp/bserv/include/bserv/database.hpp @@ -27,6 +27,7 @@ namespace bserv { const char* c_str() const { return field_.c_str(); } template Type as() const { return field_.as(); } + bool is_null() const { return field_.is_null(); } }; class db_row { @@ -160,6 +161,20 @@ namespace bserv { } }; + template + class db_value> : public db_parameter { + private: + std::optional value_; + public: + db_value(const std::optional& value) + : value_{ value } {} + std::string get_value(raw_db_transaction_type& tx) { + return value_.has_value() + ? db_value{value_.value()}.get_value(tx) + : "null"; + } + }; + template class db_value> : public db_parameter { private: @@ -243,6 +258,32 @@ namespace bserv { } }; + template + class db_field> : public db_field_holder { + public: + using db_field_holder::db_field_holder; + void add( + const db_row& row, std::size_t field_idx, + boost::json::object& obj) { + if (!row[field_idx].is_null()) { + obj[name_] = row[field_idx].as(); + } + } + }; + + template <> + class db_field> : public db_field_holder { + public: + using db_field_holder::db_field_holder; + void add( + const db_row& row, std::size_t field_idx, + boost::json::object& obj) { + if (!row[field_idx].is_null()) { + obj[name_] = row[field_idx].c_str(); + } + } + }; + } // db_internal template