diff --git a/demo/work.cpp b/demo/work.cpp index 9772fdc..1d73a3a 100644 --- a/demo/work.cpp +++ b/demo/work.cpp @@ -21,18 +21,10 @@ #include "matador/sql/connection.hpp" +#include "matador/query/schema.hpp" + #include "matador/orm/session.hpp" -template <> struct matador::utils::data_type_traits { - static basic_type type(std::size_t /*size*/) { return basic_type::UInt64; } - static void read_value(attribute_reader &/*reader*/, const char * /*id*/, size_t /*index*/, nullptr_t &/*value*/) { - - } - static void bind_value(attribute_writer &/*binder*/, size_t /*index*/, nullptr_t &/*value*/) { - - } -}; - template <> struct matador::utils::data_type_traits { static basic_type type(std::size_t /*size*/) { return basic_type::UInt64; } static void read_value(attribute_reader &/*reader*/, const char * /*id*/, size_t /*index*/, nullptr_t &/*value*/) { @@ -70,46 +62,47 @@ using namespace work::models; // payload.is_polymorphic_type(); int main() { - // logger::default_min_log_level(logger::log_level::LVL_DEBUG); - // logger::add_log_sink(logger::create_stdout_sink()); + logger::default_min_log_level(logger::log_level::LVL_DEBUG); + logger::add_log_sink(logger::create_stdout_sink()); // sql::connection_pool pool("postgres://news:news@127.0.0.1:15432/matador", 4); sql::connection_pool pool("postgres://test:test123!@127.0.0.1:5432/matador", 4); - object::repository repo("Administration"); - - auto result = repo.attach("collection_centers"); - // repo.create(pool); - // repo.drop(pool); - utils::message_bus bus; - orm::session ses({bus, pool}); + // query::schema ses({bus, pool}); + query::schema admin_schema("Administration"); - result = ses.attach("collection_centers") - .and_then([&ses] { return ses.attach("user_directories"); }) - .and_then([&ses] { return ses.attach("ldap_group_schema_settings"); }) - .and_then([&ses] { return ses.attach("ldap_import_settings"); }) - .and_then([&ses] { return ses.attach("ldap_user_schema_settings"); }) - .and_then([&ses] { return ses.attach("internal_user_directories"); }) - .and_then([&ses] { return ses.attach("ldap_user_directories"); } ) - .and_then([&ses] { return ses.attach("login_histories"); }) - .and_then([&ses] { return ses.attach("scenarios"); }) - .and_then([&ses] { return ses.attach("users"); }) - .and_then([&ses] { return ses.attach("user_sessions"); }) - .and_then([&ses] { return ses.attach("jobs"); }) - .and_then([&ses] { return ses.attach("payloads"); }) - .and_then([&ses] { return ses.attach("id_list_payloads"); }) - .and_then([&ses] { return ses.attach("id_payloads"); }) - .and_then([&ses] { return ses.attach("tasks"); }) + auto result = admin_schema.attach("collection_centers") + .and_then([&admin_schema] { return admin_schema.attach("user_directories"); }) + .and_then([&admin_schema] { return admin_schema.attach("ldap_group_schema_settings"); }) + .and_then([&admin_schema] { return admin_schema.attach("ldap_import_settings"); }) + .and_then([&admin_schema] { return admin_schema.attach("ldap_user_schema_settings"); }) + .and_then([&admin_schema] { return admin_schema.attach("internal_user_directories"); }) + .and_then([&admin_schema] { return admin_schema.attach("ldap_user_directories"); } ) + .and_then([&admin_schema] { return admin_schema.attach("login_histories"); }) + .and_then([&admin_schema] { return admin_schema.attach("scenarios"); }) + .and_then([&admin_schema] { return admin_schema.attach("users"); }) + .and_then([&admin_schema] { return admin_schema.attach("user_sessions"); }) + .and_then([&admin_schema] { return admin_schema.attach("jobs"); }) + .and_then([&admin_schema] { return admin_schema.attach("payloads"); }) + .and_then([&admin_schema] { return admin_schema.attach("id_list_payloads"); }) + .and_then([&admin_schema] { return admin_schema.attach("id_payloads"); }) + .and_then([&admin_schema] { return admin_schema.attach("tasks"); }) ; - ses.dump_schema(std::cout); + admin_schema.dump(std::cout); if (!result) { std::cout << "error: " << result.err().message() << std::endl; return 0; } - result = ses.create_schema(); + const auto conn = pool.acquire(); + result = admin_schema.create(*conn); + if (!result) { + std::cout << "error: " << result.err() << std::endl; + return 0; + } + result = admin_schema.drop(*conn); if (!result) { std::cout << "error: " << result.err() << std::endl; return 0; diff --git a/demo/work/admin/CollectionCenter.hpp b/demo/work/admin/CollectionCenter.hpp index 1e4eacd..ae3e128 100644 --- a/demo/work/admin/CollectionCenter.hpp +++ b/demo/work/admin/CollectionCenter.hpp @@ -11,6 +11,8 @@ #include "matador/utils/fetch_type.hpp" #include "matador/utils/types.hpp" +#include "matador/query/meta_table_macro.hpp" + namespace work::models::admin { struct User; @@ -45,4 +47,6 @@ struct CollectionCenter : core::Model { } +META_TABLE(collection_center, COLLECTION_CENTER, id, version, name, symbol, type) + #endif //COLLECTION_CENTER_HPP diff --git a/demo/work/admin/LdapGroupSchemaSettings.hpp b/demo/work/admin/LdapGroupSchemaSettings.hpp index f943ad6..5c94b6c 100644 --- a/demo/work/admin/LdapGroupSchemaSettings.hpp +++ b/demo/work/admin/LdapGroupSchemaSettings.hpp @@ -4,6 +4,7 @@ #include "../core/Model.hpp" #include "matador/utils/base_class.hpp" +#include "matador/utils/foreign_attributes.hpp" namespace work::models::admin { struct LdapUserDirectory; @@ -17,7 +18,7 @@ struct LdapGroupSchemaSettings : core::Model { void process( Operator& op ) { namespace field = matador::access; field::process( op, *matador::base_class( this ) ); - field::has_one(op, "ldap_user_directory", ldap_user_directory, matador::utils::default_foreign_attributes); + field::has_one(op, "ldap_user_directory", ldap_user_directory, matador::utils::CascadeAllFetchLazy); field::attribute( op, "group_object_filter", group_object_filter, 511 ); field::attribute( op, "user_member_attribute", user_member_attribute, 511 ); } diff --git a/demo/work/admin/LdapImportSettings.hpp b/demo/work/admin/LdapImportSettings.hpp index dcf5c34..e74a0a2 100644 --- a/demo/work/admin/LdapImportSettings.hpp +++ b/demo/work/admin/LdapImportSettings.hpp @@ -4,6 +4,7 @@ #include "../core/Model.hpp" #include "matador/utils/base_class.hpp" +#include "matador/utils/foreign_attributes.hpp" namespace work::models::admin { struct LdapUserDirectory; @@ -18,7 +19,7 @@ struct LdapImportSettings : core::Model { void process( Operator& op ) { namespace field = matador::access; field::process( op, *matador::base_class( this ) ); - field::has_one(op, "ldap_user_directory", ldap_user_directory, matador::utils::default_foreign_attributes); + field::has_one(op, "ldap_user_directory", ldap_user_directory, matador::utils::CascadeAllFetchLazy); field::attribute( op, "default_role", default_role, 511 ); field::attribute( op, "sync_interval", sync_interval ); field::attribute( op, "network_timeout", network_timeout ); diff --git a/demo/work/admin/LdapUserDirectory.hpp b/demo/work/admin/LdapUserDirectory.hpp index 18994dc..f92f6f9 100644 --- a/demo/work/admin/LdapUserDirectory.hpp +++ b/demo/work/admin/LdapUserDirectory.hpp @@ -10,6 +10,7 @@ #include "matador/object/object_ptr.hpp" #include "matador/utils/base_class.hpp" +#include "matador/utils/foreign_attributes.hpp" namespace work::models::admin { struct LdapUserDirectory : UserDirectory { @@ -29,11 +30,11 @@ struct LdapUserDirectory : UserDirectory { field::attribute( op, "schema_base_dn", schema_base_dn, 511 ); field::attribute( op, "additional_user_base_dn", additional_user_base_dn, 511 ); field::attribute( op, "additional_group_base_dn", additional_group_base_dn, 511 ); - field::belongs_to( op, "user_schema_settings", user_schema_settings, matador::utils::default_foreign_attributes ); - field::belongs_to( op, "group_schema_settings", group_schema_settings, matador::utils::default_foreign_attributes ); - field::belongs_to( op, "import_settings", import_settings, matador::utils::default_foreign_attributes ); - field::has_many( op, "ldap_users", users, "users_id", matador::utils::default_foreign_attributes ); - field::has_many( op, "ldap_groups", groups, "groups_id", matador::utils::default_foreign_attributes ); + field::belongs_to( op, "user_schema_settings", user_schema_settings, matador::utils::CascadeAllFetchLazy ); + field::belongs_to( op, "group_schema_settings", group_schema_settings, matador::utils::CascadeAllFetchLazy ); + field::belongs_to( op, "import_settings", import_settings, matador::utils::CascadeAllFetchLazy ); + field::has_many( op, "ldap_users", users, "users_id", matador::utils::CascadeAllFetchLazy ); + field::has_many( op, "ldap_groups", groups, "groups_id", matador::utils::CascadeAllFetchLazy ); } }; } diff --git a/demo/work/admin/LdapUserSchemaSettings.hpp b/demo/work/admin/LdapUserSchemaSettings.hpp index 6e308da..609c89c 100644 --- a/demo/work/admin/LdapUserSchemaSettings.hpp +++ b/demo/work/admin/LdapUserSchemaSettings.hpp @@ -4,7 +4,7 @@ #include "../core/Model.hpp" #include "matador/utils/base_class.hpp" - +#include "matador/utils/foreign_attributes.hpp" namespace work::models::admin { struct LdapUserDirectory; @@ -20,7 +20,7 @@ struct LdapUserSchemaSettings : core::Model { void process( Operator& op ) { namespace field = matador::access; field::process(op, *matador::base_class( this )); - field::has_one(op, "ldap_user_directory", ldap_user_directory, matador::utils::default_foreign_attributes); + field::has_one(op, "ldap_user_directory", ldap_user_directory, matador::utils::CascadeAllFetchLazy); field::attribute(op, "user_object_filter", user_object_filter, 511); field::attribute(op, "user_unique_id_attribute", user_unique_id_attribute, 511); field::attribute(op, "user_member_of_attribute", user_member_of_attribute, 511); diff --git a/demo/work/admin/LoginHistory.hpp b/demo/work/admin/LoginHistory.hpp index 536b8e6..49d4863 100644 --- a/demo/work/admin/LoginHistory.hpp +++ b/demo/work/admin/LoginHistory.hpp @@ -11,6 +11,7 @@ #include "matador/utils/base_class.hpp" #include "matador/utils/enum_mapper.hpp" +#include "matador/utils/foreign_attributes.hpp" namespace work::models::admin { @@ -39,20 +40,20 @@ static const matador::utils::enum_mapper FailReasonEnum({ }); struct LoginHistory : core::Model { - matador::object::object_ptr user; + matador::object::object_ptr client; matador::object::object_ptr scenario; matador::object::object_ptr collection_center; std::string login_name; FailReason fail_reason{FailReason::NoFailReason}; - core::timestamp login_time; + matador::utils::timestamp login_time; template void process( Operator& op ) { namespace field = matador::access; field::process( op, *matador::base_class( this ) ); - field::belongs_to( op, "user", user, matador::utils::default_foreign_attributes ); - field::belongs_to( op, "scenario", scenario, matador::utils::default_foreign_attributes ); - field::belongs_to( op, "collection_center", collection_center, matador::utils::default_foreign_attributes ); + field::belongs_to( op, "client", client, matador::utils::CascadeAllFetchLazy ); + field::belongs_to( op, "scenario", scenario, matador::utils::CascadeAllFetchLazy ); + field::belongs_to( op, "collection_center", collection_center, matador::utils::CascadeAllFetchLazy ); field::attribute( op, "login_name", login_name, 511 ); field::attribute( op, "fail_reason", fail_reason ); field::attribute( op, "login_time", login_time ); diff --git a/demo/work/admin/User.hpp b/demo/work/admin/User.hpp index 49032a1..244609d 100644 --- a/demo/work/admin/User.hpp +++ b/demo/work/admin/User.hpp @@ -4,11 +4,11 @@ #include "LockType.hpp" #include "../core/Model.hpp" -#include "../core/Types.hpp" #include "matador/object/object_ptr.hpp" #include "matador/utils/base_class.hpp" +#include "matador/utils/foreign_attributes.hpp" #include "matador/utils/types.hpp" namespace work::models::admin { @@ -20,7 +20,7 @@ struct User : core::Model { std::string salt; std::string password; LockType lock_type{LockType::NoLock}; - core::timestamp locked_at; + matador::utils::timestamp locked_at; std::string lock_reason; std::string role; matador::object::object_ptr user_directory; @@ -37,7 +37,7 @@ struct User : core::Model { field::attribute( op, "locked_at", locked_at ); field::attribute( op, "lock_reason", lock_reason, 511 ); field::attribute( op, "role", role, 63 ); - field::belongs_to( op, "user_directory", user_directory, matador::utils::default_foreign_attributes ); + field::belongs_to( op, "user_directory", user_directory, matador::utils::CascadeAllFetchLazy ); } }; diff --git a/demo/work/admin/UserSession.hpp b/demo/work/admin/UserSession.hpp index d2b1ef7..856f37e 100644 --- a/demo/work/admin/UserSession.hpp +++ b/demo/work/admin/UserSession.hpp @@ -6,26 +6,26 @@ #include "User.hpp" #include "../core/Model.hpp" -#include "../core/Types.hpp" #include "matador/object/object_ptr.hpp" #include "matador/utils/base_class.hpp" +#include "matador/utils/foreign_attributes.hpp" namespace work::models::admin { struct UserSession : core::Model { - matador::object::object_ptr user; + matador::object::object_ptr client; matador::object::object_ptr scenario; matador::object::object_ptr collection_center; - core::timestamp offline_since; + matador::utils::timestamp offline_since; template void process( Operator& op ) { namespace field = matador::access; field::process( op, *matador::base_class( this ) ); - field::belongs_to( op, "user", user, matador::utils::default_foreign_attributes ); - field::belongs_to( op, "scenario", scenario, matador::utils::default_foreign_attributes ); - field::belongs_to( op, "collection_center", collection_center, matador::utils::default_foreign_attributes ); + field::belongs_to( op, "client", client, matador::utils::CascadeAllFetchLazy ); + field::belongs_to( op, "scenario", scenario, matador::utils::CascadeAllFetchLazy ); + field::belongs_to( op, "collection_center", collection_center, matador::utils::CascadeAllFetchLazy ); field::attribute( op, "offline_since", offline_since ); } }; diff --git a/demo/work/core/Types.hpp b/demo/work/core/Types.hpp deleted file mode 100644 index b793be6..0000000 --- a/demo/work/core/Types.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef TYPES_HPP -#define TYPES_HPP - -#include - -namespace work::core { -using timestamp = std::chrono::system_clock::time_point; -} -#endif //TYPES_HPP diff --git a/demo/work/jobs/Job.hpp b/demo/work/jobs/Job.hpp index 8a20840..a3c2edc 100644 --- a/demo/work/jobs/Job.hpp +++ b/demo/work/jobs/Job.hpp @@ -7,12 +7,12 @@ #include "Task.hpp" #include "../core/Model.hpp" -#include "../core/Types.hpp" #include "../core/UserInfo.hpp" #include "matador/object/object_ptr.hpp" #include "matador/utils/base_class.hpp" +#include "matador/utils/foreign_attributes.hpp" namespace work::models::jobs { @@ -21,7 +21,7 @@ struct Job : core::Model { std::string description; JobState state; JobMode mode; - core::timestamp created_at; + matador::utils::timestamp created_at; matador::object::object_ptr payload; matador::object::object_ptr task; core::UserInfo user_info; @@ -35,8 +35,8 @@ struct Job : core::Model { field::attribute( op, "state", state ); field::attribute( op, "mode", mode ); field::attribute( op, "created_at", created_at ); - field::has_one(op, "payload", payload, matador::utils::default_foreign_attributes ); - field::belongs_to( op, "task", task, matador::utils::default_foreign_attributes ); + field::has_one(op, "payload", payload, matador::utils::CascadeAllFetchLazy ); + field::belongs_to( op, "task", task, matador::utils::CascadeAllFetchLazy ); field::attribute( op, "user_info", user_info ); } }; diff --git a/demo/work/jobs/Payload.hpp b/demo/work/jobs/Payload.hpp index 0ee0922..5207acc 100644 --- a/demo/work/jobs/Payload.hpp +++ b/demo/work/jobs/Payload.hpp @@ -4,6 +4,7 @@ #include "../core/Model.hpp" #include "matador/utils/base_class.hpp" +#include "matador/utils/foreign_attributes.hpp" namespace work::models::jobs { struct Job; @@ -16,7 +17,7 @@ struct Payload : core::Model { namespace field = matador::access; field::process( op, *matador::base_class( this ) ); field::attribute( op, "type", type, 255 ); - field::belongs_to( op, "job", job, matador::utils::default_foreign_attributes ); + field::belongs_to( op, "job", job, matador::utils::CascadeAllFetchLazy ); } }; } diff --git a/demo/work/jobs/Task.hpp b/demo/work/jobs/Task.hpp index 2142935..ed69842 100644 --- a/demo/work/jobs/Task.hpp +++ b/demo/work/jobs/Task.hpp @@ -4,11 +4,11 @@ #include "TaskState.hpp" #include "../core/Model.hpp" -#include "../core/Types.hpp" #include "matador/object/object_ptr.hpp" #include "matador/utils/base_class.hpp" +#include "matador/utils/foreign_attributes.hpp" namespace work::models::jobs { struct Task : core::Model { @@ -18,8 +18,8 @@ struct Task : core::Model { TaskState state; matador::object::object_ptr payload; JobMode job_mode; - core::timestamp start_delay; - core::timestamp interval; + matador::utils::timestamp start_delay; + matador::utils::timestamp interval; uint64_t user_session_id; template @@ -30,7 +30,7 @@ struct Task : core::Model { field::attribute( op, "description", description, 511 ); field::attribute( op, "job_name", job_name, 511 ); field::attribute( op, "state", state ); - field::belongs_to( op, "payload", payload, matador::utils::default_foreign_attributes ); + field::belongs_to( op, "payload", payload, matador::utils::CascadeAllFetchLazy ); field::attribute( op, "job_mode", job_mode ); field::attribute( op, "start_delay", start_delay ); field::attribute( op, "interval", interval ); diff --git a/include/matador/sql/dialect.hpp b/include/matador/sql/dialect.hpp index a1bea6d..5f0f16e 100644 --- a/include/matador/sql/dialect.hpp +++ b/include/matador/sql/dialect.hpp @@ -262,7 +262,8 @@ private: {utils::basic_type::Time, "TIME"}, {utils::basic_type::DateTime, "DATETIME"}, {utils::basic_type::Blob, "BLOB"}, - {utils::basic_type::Null, "NULL"} + {utils::basic_type::Null, "NULL"}, + // {utils::basic_type::Unknown, "INTEGER"} }; sql_func_to_string_map sql_func_map_ {