diff --git a/include/matador/sql/internal/query_result_impl.hpp b/include/matador/sql/internal/query_result_impl.hpp index c746e56..a7e5252 100644 --- a/include/matador/sql/internal/query_result_impl.hpp +++ b/include/matador/sql/internal/query_result_impl.hpp @@ -161,13 +161,13 @@ template void query_result_impl::on_has_many(const char *id, CollectionType &cont, const char *join_column, const utils::foreign_attributes &attr, std::enable_if_t::value> *) { using value_type = typename CollectionType::value_type; auto object_resolver = resolver_->object_resolver(); - auto resolver = resolver_->collection_resolver(result_type_, join_column); + auto resolver = resolver_->collection_resolver(result_type_, join_column); if (attr.fetch() == utils::fetch_type::Lazy) { - cont.reset(std::make_shared>(resolver, current_pk_)); + cont.reset(std::make_shared>(resolver, current_pk_)); } else { - if (initialized_collections_.insert({result_type_, typeid(typename CollectionType::value_type), std::string{join_column}}).second) { - cont.reset(std::make_shared>(resolver, std::vector())); + if (initialized_collections_.insert({result_type_, typeid(value_type), std::string{join_column}}).second) { + cont.reset(std::make_shared>(resolver, std::vector())); } // read a single value diff --git a/include/matador/utils/types.hpp b/include/matador/utils/types.hpp index 49fd018..7e7fab7 100644 --- a/include/matador/utils/types.hpp +++ b/include/matador/utils/types.hpp @@ -46,6 +46,23 @@ struct time_type_t { uint32_t microsecond{}; }; +namespace detail { +template +struct is_in_variant; + +template +struct is_in_variant> + : std::bool_constant<(std::is_same_v || ...)> { +}; +} + +template +struct is_database_primitive : detail::is_in_variant>, database_type> { +}; + +template +inline constexpr bool is_database_primitive_v = is_database_primitive::value; + void initialize_by_basic_type(basic_type type, database_type &val); diff --git a/source/core/logger/log_manager.cpp b/source/core/logger/log_manager.cpp index 4e747b5..4ca78bd 100644 --- a/source/core/logger/log_manager.cpp +++ b/source/core/logger/log_manager.cpp @@ -36,6 +36,7 @@ void log_manager::clear_all_sinks(const std::string &domain_name) { void log_manager::clear() { std::lock_guard lock(mutex_); log_domain_map_.clear(); + default_log_domain_->clear(); } void log_manager::max_default_log_level(const log_level max_level) { diff --git a/test/core/CMakeLists.txt b/test/core/CMakeLists.txt index 6fc35b7..602b50d 100644 --- a/test/core/CMakeLists.txt +++ b/test/core/CMakeLists.txt @@ -19,6 +19,7 @@ add_executable(CoreTests utils/StringTest.cpp utils/ThreadPoolTest.cpp utils/VersionTest.cpp + utils/IsDatabasePrimitiveTest.cpp ) target_link_libraries(CoreTests matador-core Catch2::Catch2WithMain) diff --git a/test/core/object/RepositoryTest.cpp b/test/core/object/RepositoryTest.cpp index 5d38897..97c78fd 100644 --- a/test/core/object/RepositoryTest.cpp +++ b/test/core/object/RepositoryTest.cpp @@ -15,15 +15,12 @@ struct person { virtual ~person() = default; template - void process(Operator &/*op*/) { - } + static void process(Operator &/*op*/) {} }; -struct student final : person { -}; +struct student final : person {}; -struct teacher final : person { -}; +struct teacher final : person {}; struct names { unsigned int id{}; diff --git a/test/core/utils/IsDatabasePrimitiveTest.cpp b/test/core/utils/IsDatabasePrimitiveTest.cpp new file mode 100644 index 0000000..2c7c1e3 --- /dev/null +++ b/test/core/utils/IsDatabasePrimitiveTest.cpp @@ -0,0 +1,57 @@ +// tests/test_is_database_primitive.cpp +#include + +#include "matador/utils/types.hpp" + +#include + +using namespace matador::utils; + +TEST_CASE("is_database_primitive: true for all database_type alternatives", "[type_traits]") { + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + + STATIC_REQUIRE(is_database_primitive_v); + + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + + STATIC_REQUIRE(is_database_primitive_v); +} + +TEST_CASE("is_database_primitive: strips cv/ref qualifiers", "[type_traits]") { + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); + STATIC_REQUIRE(is_database_primitive_v); +} + +TEST_CASE("is_database_primitive: false for non-alternatives (even if convertible)", "[type_traits]") { + STATIC_REQUIRE_FALSE(is_database_primitive_v); // not const char* + STATIC_REQUIRE_FALSE(is_database_primitive_v); // array type != const char* + STATIC_REQUIRE_FALSE(is_database_primitive_v); // not in variant + STATIC_REQUIRE_FALSE(is_database_primitive_v); // not in variant + STATIC_REQUIRE_FALSE(is_database_primitive_v); // not in variant + STATIC_REQUIRE_FALSE(is_database_primitive_v); // your custom null wrapper isn't in variant +} + +TEST_CASE("is_database_primitive: works via ::value too", "[type_traits]") { + STATIC_REQUIRE(is_database_primitive::value); + // STATIC_REQUIRE(is_database_primitive::value); // assuming unsigned != uint32_t on your platform +} \ No newline at end of file