boat
C++23 geospatial library
Loading...
Searching...
No Matches
query.hpp
Go to the documentation of this file.
1// Andrew Naplavkov
2
3#ifndef BOAT_DB_QUERY_HPP
4#define BOAT_DB_QUERY_HPP
5
7#include <boat/detail/unicode.hpp>
8#include <boost/algorithm/string.hpp>
9#include <functional>
10#include <generator>
11#include <vector>
12
13namespace boat::db {
14
15struct id : std::string {
16 using std::string::string;
17 explicit id(std::string name) { assign(std::move(name)); }
18};
19
20class query : std::vector<std::variant<std::string, id, variant>> {
21public:
22 query(auto&&... vals)
23 requires requires { ((*this << vals), ...); }
24 {
25 ((*this << std::forward<decltype(vals)>(vals)), ...);
26 }
27
28 query& operator<<(std::convertible_to<std::string_view> auto&& sql)
29 {
30 emplace_back(std::in_place_type<std::string>,
31 std::forward<decltype(sql)>(sql));
32 return *this;
33 }
34
35 query& operator<<(id name)
36 {
37 push_back(std::move(name));
38 return *this;
39 }
40
42 {
43 push_back(std::move(param));
44 return *this;
45 }
46
47 std::string text(char id_quote, std::string_view param_mark) const
48 {
49 auto os = std::ostringstream{};
50 os.imbue(std::locale::classic());
51 os.precision(std::numeric_limits<double>::digits10);
52 auto num_params = 0;
53 auto param_vis = overloaded{
54 [&](null) { os << "null"; },
55 [&](arithmetic auto v) { os << v; },
56 [&](std::string_view v) { os << unicode::quoted(v, '\''); },
57 [&](blob_view v) { os << "x'" << hex{v} << "'"; }};
58 auto item_vis = overloaded{
59 [&](std::string const& v) { os << v; },
60 [&](id const& v) { os << unicode::quoted(v, id_quote, id_quote); },
61 [&](variant const& v) {
62 if (param_mark.empty() or not v)
63 std::visit(param_vis, v);
64 else
65 os << boost::replace_first_copy(
66 std::string{param_mark}, "{}", to_chars(++num_params));
67 }};
68 for (auto& item : *this)
69 std::visit(item_vis, item);
70 return std::move(os).str();
71 }
72
73 std::generator<std::reference_wrapper<variant const>> params() const
74 {
75 for (auto& item : *this)
76 if (auto* ptr = std::get_if<variant>(&item); ptr and *ptr)
77 co_yield std::cref(*ptr);
78 }
79};
80
81} // namespace boat::db
82
83#endif // BOAT_DB_QUERY_HPP
query & operator<<(std::convertible_to< std::string_view > auto &&sql)
Definition query.hpp:28
std::string text(char id_quote, std::string_view param_mark) const
Definition query.hpp:47
query & operator<<(variant param)
Definition query.hpp:41
query & operator<<(id name)
Definition query.hpp:35
query(auto &&... vals)
Definition query.hpp:22
std::generator< std::reference_wrapper< variant const > > params() const
Definition query.hpp:73
Definition geometry.hpp:9
std::monostate null
Definition variant.hpp:11
Definition catalog.hpp:9
Definition blob.hpp:14
id(std::string name)
Definition query.hpp:17
Definition variant.hpp:14
Formats bytes as uppercase hex, two digits per byte.
Definition blob.hpp:75