3#ifndef BOAT_SQL_CATALOG_HPP
4#define BOAT_SQL_CATALOG_HPP
7#include <boat/sql/detail/exec.hpp>
13 inline static auto err = std::logic_error{
"sql"};
15 auto& dial() {
return dialects::find(
command->dbms()); }
20 std::vector<db::source>
sources()
override {
return {}; }
22 std::vector<db::layer>
layers()
override
24 return {std::from_range,
29 std::string_view table_name)
override
31 auto scm = current_schema_or(*
command, schema_name);
35 .table_name{table_name},
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) {
46 !key.primary, key.schema_name, key.index_name, key.ordinal};
64 std::stop_token tok = {})
override
68 check(!rs.
columns.empty(),
"no columns");
69 auto cols = std::vector<std::unique_ptr<adaptors::adaptor>>{};
71 cols.push_back(adaptors::make(tbl.
dbms, find(tbl.
columns, col)));
73 rs | std::views::chunk(std::max<>(1uz, 999uz / cols.size()))) {
74 if (tok.stop_requested())
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,
", ");
87 command->exec(q, tok);
94 auto t = migrate(*
command, tbl);
96 return get_table(t.schema_name, t.table_name);
99 void drop(std::string_view schema_name,
100 std::string_view table_name)
override
102 auto scm = current_schema_or(*
command, schema_name);
103 command->exec({
"drop table if exists ",
id{scm, table_name}});
108 std::generator<std::pair<tile, gil::any_image>>
read(
110 std::vector<tile>)
override
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
Spatial filter for row selection.
Definition meta.hpp:70
Uniform access to vector and raster data.
Definition catalog.hpp:16
Pagination filter for row selection.
Definition meta.hpp:86
bool empty() const
Definition rowset.hpp:16
std::vector< std::string > columns
Definition rowset.hpp:13
std::vector< column > columns
Definition meta.hpp:58
std::string dbms
lower case
Definition meta.hpp:55