boat
C++23 geospatial library
Loading...
Searching...
No Matches
catalog.hpp
Go to the documentation of this file.
1// Andrew Naplavkov
2
3#ifndef BOAT_SQL_CATALOG_HPP
4#define BOAT_SQL_CATALOG_HPP
5
6#include <boat/db/catalog.hpp>
7#include <boat/sql/detail/exec.hpp>
8
9namespace boat::sql {
10
12class catalog : public db::catalog {
13 inline static auto err = std::logic_error{"sql"};
14
15 auto& dial() { return dialects::find(command->dbms()); }
16
17public:
18 std::unique_ptr<db::command> command;
19
20 std::vector<db::source> sources() override { return {}; }
21
22 std::vector<db::layer> layers() override
23 {
24 return {std::from_range,
25 command->exec(dial().layers()) | db::view<db::layer>};
26 }
27
28 db::table get_table(std::string_view schema_name,
29 std::string_view table_name) override
30 {
31 auto scm = current_schema_or(*command, schema_name);
32 auto ret = db::table{
33 .dbms{command->dbms()},
34 .schema_name{scm},
35 .table_name{table_name},
36 .columns{
37 std::from_range,
38 command->exec(dial().columns(scm, table_name)) |
40 std::views::transform(adaptors::parse(command->dbms()))},
41 .index_keys{std::from_range,
42 command->exec(dial().index_keys(scm, table_name)) |
44 std::ranges::sort(ret.index_keys, {}, [](auto& key) {
45 return std::tuple{
46 !key.primary, key.schema_name, key.index_name, key.ordinal};
47 });
48 return ret;
49 }
50
51 db::rowset select(db::table const& tbl, db::page const& rq) override
52 {
53 return command->exec(dial().select(tbl, rq));
54 }
55
56 db::rowset select(db::table const& tbl, db::bbox const& rq) override
57 {
58 return command->exec(dial().select(tbl, rq));
59 }
60
61 void insert( //
62 db::table const& tbl,
63 db::rowset const& rs,
64 std::stop_token tok = {}) override
65 {
66 if (rs.empty())
67 return;
68 check(!rs.columns.empty(), "no columns");
69 auto cols = std::vector<std::unique_ptr<adaptors::adaptor>>{};
70 for (auto& col : rs.columns)
71 cols.push_back(adaptors::make(tbl.dbms, find(tbl.columns, col)));
72 for (auto&& rows :
73 rs | std::views::chunk(std::max<>(1uz, 999uz / cols.size()))) {
74 if (tok.stop_requested())
75 break;
76 auto q = db::query{"\n insert into ", id{tbl}};
77 for (auto sep{"\n ("}; auto& col : rs.columns)
78 q << std::exchange(sep, ", ") << db::id(col);
79 for (auto sep1{")\n values\n "}; auto& row : rows) {
80 q << std::exchange(sep1, "\n , ");
81 for (auto sep2{"("}; auto [c, v] : std::views::zip(cols, row)) {
82 q << std::exchange(sep2, ", ");
83 c->insert(q, v);
84 }
85 q << ")";
86 }
87 command->exec(q, tok);
88 }
89 }
90
92 db::table create(db::table const& tbl) override
93 {
94 auto t = migrate(*command, tbl);
95 command->exec(dial().create(t));
96 return get_table(t.schema_name, t.table_name);
97 }
98
99 void drop(std::string_view schema_name,
100 std::string_view table_name) override
101 {
102 auto scm = current_schema_or(*command, schema_name);
103 command->exec({"drop table if exists ", id{scm, table_name}});
104 }
105
106 db::raster get_raster(db::layer const&) override { throw err; }
107
108 std::generator<std::pair<tile, gil::any_image>> read(
110 std::vector<tile>) override
111 {
112 throw err;
113 co_return;
114 }
115
116 void write(db::raster const&, db::rect const&, gil::any_image_view) override
117 {
118 throw err;
119 }
120
121 void set_autocommit(bool on) override { command->set_autocommit(on); }
122
123 void commit() override { command->commit(); }
124};
125
126} // namespace boat::sql
127
128#endif // BOAT_SQL_CATALOG_HPP
Definition query.hpp:20
Raster operations throw std::logic_error.
Definition catalog.hpp:12
db::table get_table(std::string_view schema_name, std::string_view table_name) override
Definition catalog.hpp:28
std::unique_ptr< db::command > command
Definition catalog.hpp:18
std::vector< db::source > sources() override
May include nested data sources.
Definition catalog.hpp:20
db::raster get_raster(db::layer const &) override
Definition catalog.hpp:106
std::generator< std::pair< tile, gil::any_image > > read(db::raster, std::vector< tile >) override
Definition catalog.hpp:108
db::rowset select(db::table const &tbl, db::page const &rq) override
Definition catalog.hpp:51
std::vector< db::layer > layers() override
Definition catalog.hpp:22
void drop(std::string_view schema_name, std::string_view table_name) override
Definition catalog.hpp:99
void insert(db::table const &tbl, db::rowset const &rs, std::stop_token tok={}) override
Cancellation may leave a partially inserted range.
Definition catalog.hpp:61
db::rowset select(db::table const &tbl, db::bbox const &rq) override
Definition catalog.hpp:56
void commit() override
Definition catalog.hpp:123
void write(db::raster const &, db::rect const &, gil::any_image_view) override
rect coordinates are pixels.
Definition catalog.hpp:116
db::table create(db::table const &tbl) override
Adapts column types and adds missing spatial indexes.
Definition catalog.hpp:92
void set_autocommit(bool on) override
Definition catalog.hpp:121
constexpr auto view
Converts a rowset row to a structure.
Definition rowset.hpp:26
typename any_image::const_view_t any_image_view
Definition gil.hpp:51
Definition catalog.hpp:9
Spatial filter for row selection.
Definition meta.hpp:70
Uniform access to vector and raster data.
Definition catalog.hpp:16
Definition meta.hpp:18
Pagination filter for row selection.
Definition meta.hpp:86
Definition meta.hpp:98
Definition meta.hpp:117
Definition rowset.hpp:12
bool empty() const
Definition rowset.hpp:16
std::vector< std::string > columns
Definition rowset.hpp:13
Definition meta.hpp:54
std::vector< column > columns
Definition meta.hpp:58
std::string dbms
lower case
Definition meta.hpp:55