diff --git a/backends/postgres/test/CMakeLists.txt b/backends/postgres/test/CMakeLists.txt index b3bdd32..ad29d5c 100644 --- a/backends/postgres/test/CMakeLists.txt +++ b/backends/postgres/test/CMakeLists.txt @@ -2,8 +2,8 @@ CPMAddPackage("gh:catchorg/Catch2@3.7.1") list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras) -#set(POSTGRES_CONNECTION_STRING "postgres://test:test123!@127.0.0.1:15442/matador") -set(POSTGRES_CONNECTION_STRING "postgres://test:test123!@127.0.0.1:5432/matador") +set(POSTGRES_CONNECTION_STRING "postgres://test:test123!@127.0.0.1:15442/matador") +#set(POSTGRES_CONNECTION_STRING "postgres://test:test123!@127.0.0.1:5432/matador") configure_file(Connection.hpp.in ${PROJECT_BINARY_DIR}/backends/postgres/test/connection.hpp @ONLY IMMEDIATE) diff --git a/include/matador/logger/log_level.hpp b/include/matador/logger/log_level.hpp index 862cf9c..0349f1d 100644 --- a/include/matador/logger/log_level.hpp +++ b/include/matador/logger/log_level.hpp @@ -31,8 +31,8 @@ std::ostream& operator<<(std::ostream &os, log_level lvl); /// @cond MATADOR_DEV struct log_level_range { - log_level min_level = log_level::Info; - log_level max_level = log_level::Fatal; + log_level min_level = log_level::Fatal; + log_level max_level = log_level::Info; }; /// @endcond diff --git a/include/matador/sql/internal/query_result_impl.hpp b/include/matador/sql/internal/query_result_impl.hpp index eb9fb28..c746e56 100644 --- a/include/matador/sql/internal/query_result_impl.hpp +++ b/include/matador/sql/internal/query_result_impl.hpp @@ -73,9 +73,8 @@ public: template void on_has_many(const char * /*id*/, CollectionType &cont, const char *join_column, const utils::foreign_attributes &attr, std::enable_if_t::value> * = nullptr); template - void on_has_many(const char * /*id*/, CollectionType &, const char * /*join_column*/, const utils::foreign_attributes &/*attr*/, std::enable_if_t::value> * = nullptr) { - } - template + void on_has_many(const char * /*id*/, CollectionType &, const char * /*join_column*/, const utils::foreign_attributes &/*attr*/, std::enable_if_t::value> * = nullptr); + template void on_has_many_to_many(const char *id, CollectionType &, const char * /*join_column*/, const char * /*inverse_join_column*/, const utils::foreign_attributes &attr); template void on_has_many_to_many(const char *, CollectionType &, const utils::foreign_attributes &attr); @@ -158,6 +157,25 @@ void query_result_impl::on_has_many(const char *, CollectionType &cont, const ch } } } +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); + + if (attr.fetch() == utils::fetch_type::Lazy) { + 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())); + } + + // read a single value + value_type value; + utils::data_type_traits::read_value(*reader_, id, column_index_++, value, sizeof(value_type)); + cont.push_back(value); + } +} template void query_result_impl::on_has_many_to_many(const char *id, CollectionType &cont, const char *join_column, const char *, const utils::foreign_attributes &attr) { diff --git a/source/core/logger/log_domain.cpp b/source/core/logger/log_domain.cpp index 369fd72..99a176c 100644 --- a/source/core/logger/log_domain.cpp +++ b/source/core/logger/log_domain.cpp @@ -44,13 +44,13 @@ char* gettimestamp(char* const buffer, const size_t size) { } std::map log_domain::level_strings = { /* NOLINT */ - { log_level::Fatal, "Fatal" }, - { log_level::Debug, "Debug" }, - { log_level::Info, "Info" }, - { log_level::Warn, "Warn" }, - { log_level::Error, "Error" }, - { log_level::Trace, "Trace" }, - { log_level::All, "All" } + { log_level::Fatal, "FATAL" }, + { log_level::Debug, "DEBUG" }, + { log_level::Info, "INFO" }, + { log_level::Warn, "WARN" }, + { log_level::Error, "ERROR" }, + { log_level::Trace, "TRACE" }, + { log_level::All, "ALL" } }; log_domain::log_domain(std::string name, const log_level_range log_range) diff --git a/source/core/logger/log_manager.cpp b/source/core/logger/log_manager.cpp index 6f4e08f..4e747b5 100644 --- a/source/core/logger/log_manager.cpp +++ b/source/core/logger/log_manager.cpp @@ -113,15 +113,13 @@ void default_max_log_level(const log_level max_lvl) log_manager::max_default_log_level(max_lvl); } -void domain_min_log_level(const std::string &name, const log_level min_lvl) -{ +void domain_min_log_level(const std::string &name, const log_level min_lvl) { if (const auto domain = log_manager::instance().find_domain(name)) { domain->min_log_level(min_lvl); } } -void domain_max_log_level(const std::string &name, const log_level max_lvl) -{ +void domain_max_log_level(const std::string &name, const log_level max_lvl) { if (const auto domain = log_manager::instance().find_domain(name)) { domain->max_log_level(max_lvl); } diff --git a/test/core/logger/LoggerTest.cpp b/test/core/logger/LoggerTest.cpp index e8e77de..0725a5e 100644 --- a/test/core/logger/LoggerTest.cpp +++ b/test/core/logger/LoggerTest.cpp @@ -133,14 +133,14 @@ TEST_CASE("Test log rotating file sink", "[logger][log][rotate_file_sink]") { } TEST_CASE("Test log level range", "[logger][level][range]") { - REQUIRE(log_level::Info == log_manager::min_default_log_level()); - REQUIRE(log_level::Fatal == log_manager::max_default_log_level()); + REQUIRE(log_level::Fatal == log_manager::min_default_log_level()); + REQUIRE(log_level::Info == log_manager::max_default_log_level()); - default_min_log_level(log_level::Debug); - default_max_log_level(log_level::Error); + default_min_log_level(log_level::Error); + default_max_log_level(log_level::Debug); - REQUIRE(log_level::Debug == log_manager::min_default_log_level()); - REQUIRE(log_level::Error == log_manager::max_default_log_level()); + REQUIRE(log_level::Error == log_manager::min_default_log_level()); + REQUIRE(log_level::Debug == log_manager::max_default_log_level()); log_level_range llr; llr.min_level = log_level::Debug; @@ -150,11 +150,11 @@ TEST_CASE("Test log level range", "[logger][level][range]") { REQUIRE(log_level::Debug == ld.min_log_level()); REQUIRE(log_level::Trace == ld.max_log_level()); - ld.min_log_level(log_level::Info); - ld.max_log_level(log_level::Error); + ld.min_log_level(log_level::Error); + ld.max_log_level(log_level::Info); - REQUIRE(log_level::Info == ld.min_log_level()); - REQUIRE(log_level::Error == ld.max_log_level()); + REQUIRE(log_level::Error == ld.min_log_level()); + REQUIRE(log_level::Info == ld.max_log_level()); } TEST_CASE("Test basic logger functions", "[logger][basic]") { diff --git a/test/orm/orm/SessionQueryBuilderTest.cpp b/test/orm/orm/SessionQueryBuilderTest.cpp index b517e53..164fc33 100644 --- a/test/orm/orm/SessionQueryBuilderTest.cpp +++ b/test/orm/orm/SessionQueryBuilderTest.cpp @@ -31,7 +31,7 @@ using namespace matador::query; using namespace matador::utils; using namespace matador::sql; using namespace matador::test; - using namespace matador::query::meta; +using namespace matador::query::meta; TEST_CASE("Create sql query data for entity with eager has one", "[query][entity][builder]") { using namespace matador::test; @@ -331,7 +331,7 @@ TEST_CASE("Create sql query data for entity with eager many to many (inverse par REQUIRE(cond == R"("t01"."id" = ?)"); } -TEST_CASE("Test eager relationship", "[session][eager]") { +TEST_CASE("Test eager relationship", "[query][entity][builder]") { using namespace matador::test; backend_provider::instance().register_backend("noop", std::make_unique()); connection db("noop://noop.db"); diff --git a/test/orm/query/QueryBuilderTest.cpp b/test/orm/query/QueryBuilderTest.cpp index ac60f62..5bea7d4 100644 --- a/test/orm/query/QueryBuilderTest.cpp +++ b/test/orm/query/QueryBuilderTest.cpp @@ -249,8 +249,8 @@ TEST_CASE_METHOD(QueryFixture, "Test create, insert and select a blob column", " TEST_CASE_METHOD(QueryFixture, "Test select statement with join_left", "[query][statement][join_left]") { const auto ap = table("airplane").as("ap"); const auto f = table("flight").as("f"); - const class matador::query::table_column col1 = {&f, "airplane_id"}; - const class matador::query::table_column col2 = {&ap, "id"}; + const table_column col1 = {&f, "airplane_id"}; + const table_column col2 = {&ap, "id"}; const auto result = query::select({"f.id", "ap.brand", "f.pilot_name"}) .from(table{"flight"}.as("f")) .join_left(table{"airplane"}.as("ap"))