From 78c5f64b341c50b7a5c3de172870342c11917aa5 Mon Sep 17 00:00:00 2001 From: Sascha Kuehl Date: Tue, 6 Feb 2024 20:10:34 +0100 Subject: [PATCH] added schema creation to session class --- backends/tests/SessionTest.cpp | 1 + include/matador/sql/query_intermediates.hpp | 3 +- include/matador/sql/session.hpp | 2 ++ include/matador/sql/table_repository.hpp | 16 +++++++++- src/sql/query_intermediates.cpp | 9 ++++-- src/sql/session.cpp | 8 +++++ src/sql/table_repository.cpp | 35 +++++++++++++++++++++ 7 files changed, 70 insertions(+), 4 deletions(-) diff --git a/backends/tests/SessionTest.cpp b/backends/tests/SessionTest.cpp index d46e86d..3a5df12 100644 --- a/backends/tests/SessionTest.cpp +++ b/backends/tests/SessionTest.cpp @@ -39,6 +39,7 @@ using namespace matador; TEST_CASE_METHOD(SessionFixture, "Session relation test", "[session][relation]") { ses.attach("airplane"); + ses.create_schema(); ses.insert(1, "Boeing", "A380"); REQUIRE(true); diff --git a/include/matador/sql/query_intermediates.hpp b/include/matador/sql/query_intermediates.hpp index a8b5c95..eb6f6ba 100644 --- a/include/matador/sql/query_intermediates.hpp +++ b/include/matador/sql/query_intermediates.hpp @@ -200,7 +200,8 @@ class query_create_intermediate : public query_start_intermediate public: explicit query_create_intermediate(connection &db); - query_execute_finish table(const std::string &table, std::initializer_list columns); + query_execute_finish table(const std::string &table_name, std::initializer_list columns); + query_execute_finish table(const std::string &table_name, const std::vector &columns); template query_execute_finish table(const std::string &table_name) { diff --git a/include/matador/sql/session.hpp b/include/matador/sql/session.hpp index 291d7f0..eab16de 100644 --- a/include/matador/sql/session.hpp +++ b/include/matador/sql/session.hpp @@ -21,6 +21,8 @@ public: template void attach(const std::string &table_name); + void create_schema(); + template entity insert(Type *obj); diff --git a/include/matador/sql/table_repository.hpp b/include/matador/sql/table_repository.hpp index f4ce580..e528711 100644 --- a/include/matador/sql/table_repository.hpp +++ b/include/matador/sql/table_repository.hpp @@ -11,15 +11,23 @@ namespace matador::sql { +class connection; + struct table_info { std::string name; record prototype; + void create(connection &conn) const; + void drop(connection &conn) const; }; class table_repository { public: + using repository = std::unordered_map; + using iterator = repository::iterator; + using const_iterator = repository::const_iterator; + template const table_info& attach(const std::string &table_name) { @@ -52,8 +60,14 @@ public: [[nodiscard]] bool exists(const std::type_index &ti) const; + iterator begin(); + const_iterator begin() const; + iterator end(); + const_iterator end() const; + + bool empty() const; + private: - using repository = std::unordered_map; repository repository_; }; diff --git a/src/sql/query_intermediates.cpp b/src/sql/query_intermediates.cpp index 8bedd6a..0902d70 100644 --- a/src/sql/query_intermediates.cpp +++ b/src/sql/query_intermediates.cpp @@ -153,9 +153,14 @@ query_create_intermediate::query_create_intermediate(connection &db) builder_.create(); } -query_execute_finish query_create_intermediate::table(const std::string &table, std::initializer_list columns) +query_execute_finish query_create_intermediate::table(const std::string &table_name, std::initializer_list columns) { - return {connection_, builder_.table(table, columns)}; + return table(table_name, std::vector{columns}); +} + +query_execute_finish query_create_intermediate::table(const std::string &table_name, const std::vector &columns) +{ + return {connection_, builder_.table(table_name, columns)}; } std::shared_ptr query_create_intermediate::tables() const diff --git a/src/sql/session.cpp b/src/sql/session.cpp index fdd3462..2fd9ac3 100644 --- a/src/sql/session.cpp +++ b/src/sql/session.cpp @@ -10,6 +10,14 @@ session::session(connection_pool &pool) : pool_(pool) , dialect_(backend_provider::instance().connection_dialect(pool_.info().type)) {} +void session::create_schema() +{ + auto c = pool_.acquire(); + for (const auto &t : table_repository_) { + t.second.create(*c); + } +} + void session::drop_table(const std::string &table_name) { auto c = pool_.acquire(); diff --git a/src/sql/table_repository.cpp b/src/sql/table_repository.cpp index 6ba2432..3f9fca9 100644 --- a/src/sql/table_repository.cpp +++ b/src/sql/table_repository.cpp @@ -1,9 +1,20 @@ #include "matador/sql/table_repository.hpp" +#include "matador/sql/connection.hpp" #include namespace matador::sql { +void table_info::create(connection &conn) const +{ + conn.create().table(name, prototype.columns()).execute(); +} + +void table_info::drop(connection &conn) const +{ + conn.drop().table(name).execute(); +} + const table_info& table_repository::attach(const std::type_index ti, const table_info& table) { return repository_.try_emplace(ti, table).first->second; @@ -36,4 +47,28 @@ bool table_repository::exists(const std::type_index &ti) const return repository_.count(ti) > 0; } +table_repository::iterator table_repository::begin() +{ + return repository_.begin(); +} + +table_repository::const_iterator table_repository::begin() const +{ + return repository_.begin(); +} + +table_repository::iterator table_repository::end() +{ + return repository_.end(); +} + +table_repository::const_iterator table_repository::end() const +{ + return repository_.end(); +} + +bool table_repository::empty() const +{ + return repository_.empty(); +} } \ No newline at end of file