From 5f42476a0ae867ba3806d0139689daff50554e50 Mon Sep 17 00:00:00 2001 From: "Dr. Patrick Urbanke" Date: Sat, 29 Mar 2025 06:18:29 +0100 Subject: [PATCH] Added support for schemata --- include/sqlgen/dynamic/Table.hpp | 2 +- include/sqlgen/parsing/get_schema.hpp | 24 ++++++++++++++++++++++ include/sqlgen/parsing/get_tablename.hpp | 2 +- include/sqlgen/parsing/has_schema.hpp | 15 ++++++++++++++ include/sqlgen/parsing/to_create_table.hpp | 4 +++- tests/test_schema.cpp | 22 ++++++++++++++++++++ tests/test_to_create_table.cpp | 18 +++++++++------- 7 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 include/sqlgen/parsing/get_schema.hpp create mode 100644 include/sqlgen/parsing/has_schema.hpp create mode 100644 tests/test_schema.cpp diff --git a/include/sqlgen/dynamic/Table.hpp b/include/sqlgen/dynamic/Table.hpp index 794b9db..6d8d13b 100644 --- a/include/sqlgen/dynamic/Table.hpp +++ b/include/sqlgen/dynamic/Table.hpp @@ -11,7 +11,7 @@ namespace sqlgen::dynamic { struct Table { std::string alias; std::string name; - std::string schema = "public"; + std::string schema; }; } // namespace sqlgen::dynamic diff --git a/include/sqlgen/parsing/get_schema.hpp b/include/sqlgen/parsing/get_schema.hpp new file mode 100644 index 0000000..35436d2 --- /dev/null +++ b/include/sqlgen/parsing/get_schema.hpp @@ -0,0 +1,24 @@ +#ifndef SQLGEN_PARSING_GET_SCHEMA_HPP_ +#define SQLGEN_PARSING_GET_SCHEMA_HPP_ + +#include +#include + +#include "has_schema.hpp" + +namespace sqlgen::parsing { + +template +std::string get_schema() noexcept { + using Type = std::remove_cvref_t; + if constexpr (has_schema) { + using LiteralType = typename Type::schema; + return LiteralType().str(); + } else { + return ""; + } +} + +} // namespace sqlgen::parsing + +#endif diff --git a/include/sqlgen/parsing/get_tablename.hpp b/include/sqlgen/parsing/get_tablename.hpp index 3018839..681fcfe 100644 --- a/include/sqlgen/parsing/get_tablename.hpp +++ b/include/sqlgen/parsing/get_tablename.hpp @@ -25,7 +25,7 @@ std::string get_tablename() noexcept { using Type = std::remove_cvref_t; if constexpr (has_tablename) { using LiteralType = typename Type::tablename; - return internal::remove_namespaces(LiteralType().str()); + return LiteralType().str(); } else { return internal::remove_namespaces(rfl::type_name_t().str()); } diff --git a/include/sqlgen/parsing/has_schema.hpp b/include/sqlgen/parsing/has_schema.hpp new file mode 100644 index 0000000..34f99a4 --- /dev/null +++ b/include/sqlgen/parsing/has_schema.hpp @@ -0,0 +1,15 @@ +#ifndef SQLGEN_PARSING_HAS_SCHEMA_HPP_ +#define SQLGEN_PARSING_HAS_SCHEMA_HPP_ + +#include + +namespace sqlgen::parsing { + +template +concept has_schema = requires() { + { typename T::schema() } -> std::same_as; +}; + +} // namespace sqlgen::parsing + +#endif diff --git a/include/sqlgen/parsing/to_create_table.hpp b/include/sqlgen/parsing/to_create_table.hpp index 1053383..0bce577 100644 --- a/include/sqlgen/parsing/to_create_table.hpp +++ b/include/sqlgen/parsing/to_create_table.hpp @@ -12,6 +12,7 @@ #include "../dynamic/Table.hpp" #include "../dynamic/Type.hpp" #include "../dynamic/types.hpp" +#include "get_schema.hpp" #include "get_tablename.hpp" #include "has_reflection_method.hpp" #include "is_nullable.hpp" @@ -122,7 +123,8 @@ dynamic::CreateTable to_create_table() { using NamedTupleType = rfl::named_tuple_t>; using Fields = typename NamedTupleType::Fields; return dynamic::CreateTable{ - .table = dynamic::Table{.name = get_tablename()}, + .table = + dynamic::Table{.name = get_tablename(), .schema = get_schema()}, .columns = internal::make_columns( std::make_integer_sequence>()), .if_not_exists = true}; diff --git a/tests/test_schema.cpp b/tests/test_schema.cpp new file mode 100644 index 0000000..15e0bd1 --- /dev/null +++ b/tests/test_schema.cpp @@ -0,0 +1,22 @@ +#include + +#include +#include + +namespace test_schema { + +struct TestTable { + using schema = sqlgen::Literal<"test">; + + std::string field1; + int32_t field2; + sqlgen::PrimaryKey id; + std::optional nullable; +}; + +TEST(general, test_schema) { + const auto create_table_stmt = sqlgen::parsing::to_create_table(); + + EXPECT_EQ(create_table_stmt.table.schema, "test"); +} +} // namespace test_schema diff --git a/tests/test_to_create_table.cpp b/tests/test_to_create_table.cpp index a0356e2..8cfda91 100644 --- a/tests/test_to_create_table.cpp +++ b/tests/test_to_create_table.cpp @@ -3,19 +3,22 @@ #include #include -TEST(general, test_to_create_table) { - struct TestTable { - std::string field1; - int32_t field2; - sqlgen::PrimaryKey id; - std::optional nullable; - }; +namespace test_to_create_table { +struct TestTable { + std::string field1; + int32_t field2; + sqlgen::PrimaryKey id; + std::optional nullable; +}; + +TEST(general, test_to_create_table) { const auto create_table_stmt = sqlgen::parsing::to_create_table(); const auto get_properties = [](const auto& _t) { return _t.properties; }; EXPECT_EQ(create_table_stmt.table.name, "TestTable"); + EXPECT_EQ(create_table_stmt.table.schema, ""); EXPECT_EQ(create_table_stmt.columns.size(), 4); @@ -33,3 +36,4 @@ TEST(general, test_to_create_table) { EXPECT_EQ(create_table_stmt.columns.at(3).type.visit(get_properties).nullable, true); } +} // namespace test_to_create_table