You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

123 rivejä
4.5 KiB

  1. #pragma once
  2. #include "field.h"
  3. #include <cpphibernate/schema/schema.h>
  4. #include <cpphibernate/misc/type_helper.h>
  5. namespace cpphibernate {
  6. namespace mariadb {
  7. template<
  8. typename T_schema,
  9. typename T_table,
  10. typename T_field>
  11. field_t::field_t(
  12. const table_t& p_owner,
  13. const T_schema& p_schema,
  14. const T_table& p_table,
  15. const T_field& p_field)
  16. : id (get_type_id(hana::type_c<mp::decay_t<T_field>>))
  17. , value_id (get_type_id(hana::type_c<typename T_field::value_type>))
  18. , real_value_id (get_type_id(hana::type_c<real_dataset_t<typename T_field::value_type>>))
  19. , value_is_nullable (is_nullable_v <typename T_field::value_type>)
  20. , value_is_pointer (is_pointer_v <typename T_field::value_type>)
  21. , value_is_container (is_container_v<typename T_field::value_type>)
  22. , value_is_ordered (is_ordered_v <typename T_field::value_type>)
  23. , value_is_auto_incremented (false)
  24. , table (p_owner)
  25. , referenced_table (nullptr)
  26. , name (p_field.name)
  27. , type ()
  28. , create_arguments ()
  29. , convert_to_open ()
  30. , convert_to_close ()
  31. , convert_from_open ()
  32. , convert_from_close ()
  33. , attributes (make_attributes(p_field.attributes))
  34. { }
  35. namespace __impl
  36. {
  37. /* field_builder */
  38. template<typename X, typename>
  39. struct field_builder
  40. {
  41. template<typename... T_args>
  42. static constexpr decltype(auto) apply(T_args&&... args)
  43. { static_assert(sizeof...(args) == 0, "Invalid parameters for mariadb::make_field(...)!"); }
  44. };
  45. template<typename T_owner, typename T_schema, typename T_table, typename T_field>
  46. struct field_builder<
  47. mp::list<T_owner, T_schema, T_table, T_field>,
  48. mp::enable_if_t<
  49. mp::is_base_of_v<table_t, mp::decay_t<T_owner>>
  50. && schema::is_schema_v<mp::decay_t<T_schema>>
  51. && schema::is_table_v<mp::decay_t<T_table>>
  52. && schema::is_field_v<mp::decay_t<T_field>>>>
  53. {
  54. /* is_primary_key_field */
  55. template<typename X_field>
  56. struct is_primary_key_field
  57. : public decltype(
  58. hana::contains(
  59. std::declval<mp::decay_t<X_field>>().attributes,
  60. schema::attribute::primary_key))
  61. { };
  62. /* is_foreign_table_field */
  63. template<typename X_schema, typename X_field>
  64. struct is_foreign_table_field
  65. : public decltype(
  66. hana::contains(
  67. hana::transform(
  68. std::declval<X_schema>().tables,
  69. schema::get_wrapped_dataset),
  70. std::declval<X_field>().wrapped_real_value_type))
  71. { };
  72. /* field_type */
  73. template<typename X_schema, typename X_field, typename = void>
  74. struct field_type
  75. { using type = field_data_t<T_field>; };
  76. template<typename X_schema, typename X_field>
  77. struct field_type<
  78. X_schema,
  79. X_field,
  80. mp::enable_if_t<is_primary_key_field<X_field>::value>>
  81. { using type = field_primary_key_t<X_field>; };
  82. template<typename X_schema, typename X_field>
  83. struct field_type<
  84. X_schema,
  85. X_field,
  86. mp::enable_if_t<is_foreign_table_field<X_schema, X_field>::value>>
  87. { using type = field_foreign_table_t<X_field>; };
  88. template<typename X_schema, typename X_field>
  89. using field_type_t = typename field_type<X_schema, X_field>::type;
  90. /* apply */
  91. static constexpr decltype(auto) apply(const table_t& owner, const T_schema& schema, const T_table& table, const T_field& field)
  92. {
  93. using schema_type = mp::decay_t<T_schema>;
  94. using field_type = mp::decay_t<T_field>;
  95. using return_type = field_type_t<schema_type, field_type>;
  96. return std::make_unique<return_type>(owner, schema, table, field);
  97. }
  98. };
  99. }
  100. } }