From c00f062e88daa6bdf0041d52e686b2f6a39d42a1 Mon Sep 17 00:00:00 2001 From: "Dr. Patrick Urbanke" Date: Sat, 1 Nov 2025 14:19:16 +0100 Subject: [PATCH 1/3] Make sure all headers are self-contained --- CMakeLists.txt | 46 ++++++++++++++++--- include/sqlgen/dynamic/select.hpp | 36 --------------- include/sqlgen/internal/collect/vector.hpp | 1 + include/sqlgen/parsing/Parser_timestamp.hpp | 1 + include/sqlgen/parsing/Parser_varchar.hpp | 1 + include/sqlgen/rollback.hpp | 1 + include/sqlgen/transpilation/get_table_t.hpp | 1 + .../transpilation/remove_reflection_t.hpp | 1 + .../transpilation/to_insert_or_write.hpp | 1 + include/sqlgen/update.hpp | 1 + 10 files changed, 47 insertions(+), 43 deletions(-) delete mode 100644 include/sqlgen/dynamic/select.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 830a7d2a..25967ee3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,12 +12,13 @@ option(SQLGEN_BUILD_TESTS "Build tests" OFF) option(SQLGEN_BUILD_DRY_TESTS_ONLY "Build 'dry' tests only (those that do not require a database connection)" OFF) +option(SQLGEN_CHECK_HEADERS "Make sure that all headers are self-contained" OFF) + set(CMAKE_CXX_STANDARD_REQUIRED ON) if (NOT DEFINED CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 20) endif() - set(SQLGEN_USE_VCPKG_DEFAULT ON) option(SQLGEN_USE_VCPKG "Use VCPKG to download and build dependencies" ${SQLGEN_USE_VCPKG_DEFAULT}) @@ -27,15 +28,15 @@ if (SQLGEN_USE_VCPKG) list(APPEND VCPKG_MANIFEST_FEATURES "tests") endif() - if (SQLGEN_MYSQL) + if (SQLGEN_MYSQL OR SQLGEN_CHECK_HEADERS) list(APPEND VCPKG_MANIFEST_FEATURES "mysql") endif() - if (SQLGEN_POSTGRES) + if (SQLGEN_POSTGRES OR SQLGEN_CHECK_HEADERS) list(APPEND VCPKG_MANIFEST_FEATURES "postgres") endif() - if (SQLGEN_SQLITE3) + if (SQLGEN_SQLITE3 OR SQLGEN_CHECK_HEADERS) list(APPEND VCPKG_MANIFEST_FEATURES "sqlite3") endif() @@ -66,7 +67,7 @@ target_include_directories( $ $) -if(SQLGEN_MYSQL) +if(SQLGEN_MYSQL OR SQLGEN_CHECK_HEADERS) list(APPEND SQLGEN_SOURCES src/sqlgen_mysql.cpp) if (SQLGEN_USE_VCPKG) if (NOT TARGET unofficial-libmariadb) @@ -81,7 +82,7 @@ if(SQLGEN_MYSQL) endif() endif() -if (SQLGEN_POSTGRES) +if (SQLGEN_POSTGRES OR SQLGEN_CHECK_HEADERS) list(APPEND SQLGEN_SOURCES src/sqlgen_postgres.cpp) if (NOT TARGET PostgreSQL) find_package(PostgreSQL REQUIRED) @@ -89,7 +90,7 @@ if (SQLGEN_POSTGRES) target_link_libraries(sqlgen PUBLIC PostgreSQL::PostgreSQL) endif() -if (SQLGEN_SQLITE3) +if (SQLGEN_SQLITE3 OR SQLGEN_CHECK_HEADERS) list(APPEND SQLGEN_SOURCES src/sqlgen_sqlite.cpp) if (SQLGEN_USE_VCPKG) @@ -119,6 +120,37 @@ if (SQLGEN_BUILD_TESTS) add_subdirectory(tests) endif () +if(SQLGEN_CHECK_HEADERS) + file(GLOB_RECURSE PROJECT_HEADERS "include/*.hpp") + find_package(reflectcpp CONFIG REQUIRED) + + set(TEST_DIR "${CMAKE_CURRENT_BINARY_DIR}/self_contained_tests") + file(MAKE_DIRECTORY "${TEST_DIR}") + + foreach(HEADER_FILE ${PROJECT_HEADERS}) + string(MAKE_C_IDENTIFIER ${HEADER_FILE} HEADER_NAME) + set(TEST_SOURCE_FILE "${TEST_DIR}/test_${HEADER_NAME}.cpp") + + file(GENERATE + OUTPUT ${TEST_SOURCE_FILE} + CONTENT "#include \"${HEADER_FILE}\"\n" + ) + + add_library(check_header_${HEADER_NAME} "${TEST_SOURCE_FILE}") + + target_include_directories(check_header_${HEADER_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${ADDITIONAL_INCLUDE_DIRS} + ) + target_link_libraries(check_header_${HEADER_NAME} PUBLIC reflectcpp::reflectcpp) + target_link_libraries(check_header_${HEADER_NAME} PUBLIC unofficial::libmariadb) + target_link_libraries(check_header_${HEADER_NAME} PUBLIC PostgreSQL::PostgreSQL) + target_link_libraries(check_header_${HEADER_NAME} PUBLIC unofficial::sqlite3::sqlite3) + + add_custom_target(check_${HEADER_NAME} ALL DEPENDS check_header_${HEADER_NAME}) + endforeach() +endif() + if (PROJECT_IS_TOP_LEVEL) include(GNUInstallDirs) include(CMakePackageConfigHelpers) diff --git a/include/sqlgen/dynamic/select.hpp b/include/sqlgen/dynamic/select.hpp deleted file mode 100644 index 296d0abc..00000000 --- a/include/sqlgen/dynamic/select.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef SQLGEN_DYNAMIC_SELECT_HPP_ -#define SQLGEN_DYNAMIC_SELECT_HPP_ - -#include -#include -#include - -#include "Column.hpp" -#include "SelectFrom.hpp" -#include "Table.hpp" - -namespace sqlgen::dynamic { - -SelectFrom select(const std::string& _table, - const std::vector& _columns) { - std::vector columns; - for (const auto& name : _columns) { - columns.emplace_back(Column{.name = name}); - } - return SelectFrom{ - .table = - Table{.alias = std::nullopt, .name = _table, .schema = std::nullopt}, - .columns = columns}; -} - -SelectFrom select(const std::string& _schema, const std::string& _table, - const std::vector& _columns) { - std::vector columns; - for (const auto& name : _columns) { - columns.emplace_back(Column{.name = name}); - } - return SelectFrom{ - .table = Table{.alias = std::nullopt, .name = _table, .schema = _schema}, - .columns = columns}; -} -} // namespace sqlgen::dynamic diff --git a/include/sqlgen/internal/collect/vector.hpp b/include/sqlgen/internal/collect/vector.hpp index 5b1f0c56..f1d16e85 100644 --- a/include/sqlgen/internal/collect/vector.hpp +++ b/include/sqlgen/internal/collect/vector.hpp @@ -2,6 +2,7 @@ #define SQLGEN_INTERNAL_COLLECT_VECTOR_HPP_ #include +#include namespace sqlgen::internal::collect { diff --git a/include/sqlgen/parsing/Parser_timestamp.hpp b/include/sqlgen/parsing/Parser_timestamp.hpp index 895a338b..f3e8446a 100644 --- a/include/sqlgen/parsing/Parser_timestamp.hpp +++ b/include/sqlgen/parsing/Parser_timestamp.hpp @@ -9,6 +9,7 @@ #include "../dynamic/Type.hpp" #include "../dynamic/types.hpp" #include "Parser_base.hpp" +#include "Parser_default.hpp" namespace sqlgen::parsing { diff --git a/include/sqlgen/parsing/Parser_varchar.hpp b/include/sqlgen/parsing/Parser_varchar.hpp index 000afb1a..489b08bf 100644 --- a/include/sqlgen/parsing/Parser_varchar.hpp +++ b/include/sqlgen/parsing/Parser_varchar.hpp @@ -9,6 +9,7 @@ #include "../dynamic/Type.hpp" #include "../dynamic/types.hpp" #include "Parser_base.hpp" +#include "Parser_default.hpp" namespace sqlgen::parsing { diff --git a/include/sqlgen/rollback.hpp b/include/sqlgen/rollback.hpp index a505255c..6f32deef 100644 --- a/include/sqlgen/rollback.hpp +++ b/include/sqlgen/rollback.hpp @@ -5,6 +5,7 @@ #include "Ref.hpp" #include "Result.hpp" +#include "Transaction.hpp" #include "is_connection.hpp" namespace sqlgen { diff --git a/include/sqlgen/transpilation/get_table_t.hpp b/include/sqlgen/transpilation/get_table_t.hpp index 127a946b..c8172059 100644 --- a/include/sqlgen/transpilation/get_table_t.hpp +++ b/include/sqlgen/transpilation/get_table_t.hpp @@ -7,6 +7,7 @@ #include #include "../Literal.hpp" +#include "../Result.hpp" #include "../dynamic/JoinType.hpp" #include "TableWrapper.hpp" diff --git a/include/sqlgen/transpilation/remove_reflection_t.hpp b/include/sqlgen/transpilation/remove_reflection_t.hpp index ba59ea4a..0706a84e 100644 --- a/include/sqlgen/transpilation/remove_reflection_t.hpp +++ b/include/sqlgen/transpilation/remove_reflection_t.hpp @@ -3,6 +3,7 @@ #include #include +#include #include "has_reflection_method.hpp" diff --git a/include/sqlgen/transpilation/to_insert_or_write.hpp b/include/sqlgen/transpilation/to_insert_or_write.hpp index 949809b3..3c59eaf6 100644 --- a/include/sqlgen/transpilation/to_insert_or_write.hpp +++ b/include/sqlgen/transpilation/to_insert_or_write.hpp @@ -8,6 +8,7 @@ #include #include +#include "../dynamic/Insert.hpp" #include "../dynamic/Table.hpp" #include "../internal/collect/vector.hpp" #include "../internal/remove_auto_incr_primary_t.hpp" diff --git a/include/sqlgen/update.hpp b/include/sqlgen/update.hpp index 40efdd8f..ae0e190c 100644 --- a/include/sqlgen/update.hpp +++ b/include/sqlgen/update.hpp @@ -8,6 +8,7 @@ #include "Result.hpp" #include "is_connection.hpp" #include "transpilation/to_update.hpp" +#include "where.hpp" namespace sqlgen { From ea1a6d23aa37f1223e656158f4c76868b776c596 Mon Sep 17 00:00:00 2001 From: "Dr. Patrick Urbanke" Date: Sat, 1 Nov 2025 14:35:37 +0100 Subject: [PATCH 2/3] Added header checks to the workflows --- .github/workflows/linux-cxx20-vcpkg.yaml | 4 ++-- .github/workflows/macos-cxx20-vcpkg.yaml | 2 +- .github/workflows/windows-cxx20-vcpkg.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/linux-cxx20-vcpkg.yaml b/.github/workflows/linux-cxx20-vcpkg.yaml index 11eb1cea..b7d26e1a 100644 --- a/.github/workflows/linux-cxx20-vcpkg.yaml +++ b/.github/workflows/linux-cxx20-vcpkg.yaml @@ -112,7 +112,7 @@ jobs: sudo ln -s $(which ccache) /usr/local/bin/$CC sudo ln -s $(which ccache) /usr/local/bin/$CXX $CXX --version - cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=20 -DSQLGEN_BUILD_TESTS=ON -DSQLGEN_POSTGRES=OFF + cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=20 -DSQLGEN_BUILD_TESTS=ON -DSQLGEN_POSTGRES=OFF -DSQLGEN_CHECK_HEADERS=ON cmake --build build - name: Compile if: matrix.db == 'mysql' @@ -127,7 +127,7 @@ jobs: sudo ln -s $(which ccache) /usr/local/bin/$CC sudo ln -s $(which ccache) /usr/local/bin/$CXX $CXX --version - cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=20 -DSQLGEN_BUILD_TESTS=ON -DSQLGEN_MYSQL=ON -DSQLGEN_POSTGRES=OFF -DSQLGEN_SQLITE3=OFF -DBUILD_SHARED_LIBS=ON -DVCPKG_TARGET_TRIPLET=x64-linux-dynamic + cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=20 -DSQLGEN_BUILD_TESTS=ON -DSQLGEN_MYSQL=ON -DSQLGEN_POSTGRES=OFF -DSQLGEN_SQLITE3=OFF -DBUILD_SHARED_LIBS=ON -DVCPKG_TARGET_TRIPLET=x64-linux-dynamic cmake --build build - name: Set up postgres if: matrix.db == 'postgres' diff --git a/.github/workflows/macos-cxx20-vcpkg.yaml b/.github/workflows/macos-cxx20-vcpkg.yaml index c018e934..c689ea0c 100644 --- a/.github/workflows/macos-cxx20-vcpkg.yaml +++ b/.github/workflows/macos-cxx20-vcpkg.yaml @@ -73,7 +73,7 @@ jobs: export CMAKE_GENERATOR=Ninja fi $CXX --version - cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=20 -DSQLGEN_BUILD_TESTS=ON -DSQLGEN_POSTGRES=OFF + cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=20 -DSQLGEN_BUILD_TESTS=ON -DSQLGEN_POSTGRES=OFF -DSQLGEN_CHECK_HEADERS=ON cmake --build build -j 4 - name: Compile if: matrix.db == 'mysql' diff --git a/.github/workflows/windows-cxx20-vcpkg.yaml b/.github/workflows/windows-cxx20-vcpkg.yaml index 064167d1..4785be71 100644 --- a/.github/workflows/windows-cxx20-vcpkg.yaml +++ b/.github/workflows/windows-cxx20-vcpkg.yaml @@ -38,7 +38,7 @@ jobs: - name: Compile if: matrix.db == 'sqlite' run: | - cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=20 -DSQLGEN_BUILD_TESTS=ON -DSQLGEN_POSTGRES=OFF + cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=20 -DSQLGEN_BUILD_TESTS=ON -DSQLGEN_POSTGRES=OFF -DSQLGEN_CHECK_HEADERS=ON cmake --build build --config Release -j4 - name: Compile if: matrix.db == 'mysql' From a5fcac3f7efc0101dcb970c18f879d5bbe1c9637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dr=2E=20Patrick=20Urbanke=20=28=E5=8A=89=E8=87=AA=E6=88=90?= =?UTF-8?q?=29?= Date: Sat, 1 Nov 2025 19:06:59 +0100 Subject: [PATCH 3/3] Do not check headers on macOS --- .github/workflows/macos-cxx20-vcpkg.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos-cxx20-vcpkg.yaml b/.github/workflows/macos-cxx20-vcpkg.yaml index c689ea0c..72e636ae 100644 --- a/.github/workflows/macos-cxx20-vcpkg.yaml +++ b/.github/workflows/macos-cxx20-vcpkg.yaml @@ -73,7 +73,7 @@ jobs: export CMAKE_GENERATOR=Ninja fi $CXX --version - cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=20 -DSQLGEN_BUILD_TESTS=ON -DSQLGEN_POSTGRES=OFF -DSQLGEN_CHECK_HEADERS=ON + cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=20 -DSQLGEN_BUILD_TESTS=ON -DSQLGEN_POSTGRES=OFF cmake --build build -j 4 - name: Compile if: matrix.db == 'mysql'