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.
 
 
 

74 lines
2.4 KiB

  1. #pragma once
  2. #include "field_foreign_table.h"
  3. #include "../../impl/create_update.inl"
  4. #include "../../context/read_context.inl"
  5. #include "../../context/create_update_context.inl"
  6. namespace cpphibernate {
  7. namespace mariadb {
  8. /* field_foreign_table_t */
  9. template<
  10. typename T_field>
  11. template<
  12. typename T_schema,
  13. typename T_table>
  14. field_foreign_table_t<T_field>::field_foreign_table_t(
  15. const table_t& p_owner,
  16. const T_schema& p_schema,
  17. const T_table& p_table,
  18. const T_field& p_field)
  19. : field_simple_t<T_field>::field_simple_t(
  20. p_owner,
  21. p_schema,
  22. p_table,
  23. p_field)
  24. { }
  25. template<
  26. typename T_field>
  27. value_t field_foreign_table_t<T_field>
  28. ::foreign_create_update(const create_update_context& context) const
  29. {
  30. using dataset_type = typename decltype(+this->_field.wrapped_dataset_type)::type;
  31. auto& dataset = context.get<dataset_type>();
  32. auto& foreign = this->_field.getter(dataset);
  33. auto next_context = change_context(context, foreign);
  34. using foreign_dataset_type = mp::decay_t<decltype(foreign)>;
  35. return create_update_impl_t<foreign_dataset_type>::apply(
  36. next_context,
  37. false);
  38. }
  39. template<
  40. typename T_field>
  41. read_context_ptr_u field_foreign_table_t<T_field>
  42. ::foreign_read(const read_context& context, bool create_fake) const
  43. {
  44. using dataset_type = typename decltype(+this->_field.wrapped_dataset_type)::type;
  45. using value_type = typename decltype(+this->_field.wrapped_value_type)::type;
  46. if (create_fake)
  47. {
  48. auto new_context = make_read_context(context.schema, context.connection, hana::type_c<value_type>, context.filter);
  49. using context_type = mp::decay_t<decltype(new_context)>;
  50. return std::make_unique<context_type>(std::move(new_context));
  51. }
  52. else
  53. {
  54. auto& dataset = context.get<dataset_type>();
  55. auto& member = this->_field.getter(dataset);
  56. auto new_context = make_read_context(context.schema, context.connection, member, context.filter);
  57. using context_type = mp::decay_t<decltype(new_context)>;
  58. return std::make_unique<context_type>(std::move(new_context));
  59. }
  60. }
  61. } }