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.
 
 
 

87 lines
3.1 KiB

  1. #pragma once
  2. #include "../context/init_context.inl"
  3. #include "../context/create_update_context.inl"
  4. #include "../context/read_context.inl"
  5. #include "../context/destroy_context.inl"
  6. #include "driver_impl/where.inl"
  7. #include "driver_impl/limit.inl"
  8. #include "driver_impl/order_by.inl"
  9. namespace cpphibernate {
  10. namespace mariadb {
  11. /* driver_impl_t */
  12. template<typename T_schema>
  13. driver_impl_t::driver_impl_t(driver_t& p_owner, T_schema&& p_schema)
  14. : owner (p_owner)
  15. , schema(make_schema(std::forward<T_schema>(p_schema)))
  16. { }
  17. void driver_impl_t::init(bool recreate) const
  18. {
  19. auto * connection = owner.connection();
  20. if (!connection)
  21. throw exception("Cpphibernate mariadb driver is not connected to any database!");
  22. ::cppmariadb::transaction_lock trans(*connection);
  23. schema->init(init_context(*schema, *connection, recreate));
  24. trans.commit();
  25. }
  26. template<typename T_dataset>
  27. void driver_impl_t::create(T_dataset& dataset) const
  28. {
  29. auto * connection = owner.connection();
  30. if (!connection)
  31. throw exception("Cpphibernate mariadb driver is not connected to any database!");
  32. create_update_impl_t<T_dataset>::apply(
  33. create_update_context(*schema, *connection, dataset));
  34. }
  35. template<typename T_dataset, typename T_modifiers>
  36. inline void driver_impl_t::read(T_dataset& dataset, const T_modifiers& modifiers) const
  37. {
  38. using dataset_type = mp::decay_t<T_dataset>;
  39. using real_dataset_type = real_dataset_t<dataset_type>;
  40. auto * connection = owner.connection();
  41. if (!connection)
  42. throw exception("Cpphibernate mariadb driver is not connected to any database!");
  43. auto dataset_id = get_type_id(hana::type_c<real_dataset_type>);
  44. auto& table = schema->table(dataset_id);
  45. auto context = make_read_context(*schema, *connection, dataset, owner._filter);
  46. context.where = build_where(*schema, modifiers).query(*connection);
  47. context.limit = build_limit(modifiers).query(*connection);
  48. context.order_by = build_order_by(*schema, modifiers).query(*connection);
  49. ::cppmariadb::transaction_lock trans(*connection);
  50. table.read(context);
  51. trans.commit();
  52. }
  53. template<typename T_dataset>
  54. void driver_impl_t::update(T_dataset& dataset) const
  55. {
  56. auto * connection = owner.connection();
  57. if (!connection)
  58. throw exception("Cpphibernate mariadb driver is not connected to any database!");
  59. create_update_impl_t<T_dataset>::apply(
  60. create_update_context(*schema, *connection, dataset, owner._filter));
  61. }
  62. template<typename T_dataset>
  63. void driver_impl_t::destroy(T_dataset& dataset) const
  64. {
  65. auto * connection = owner.connection();
  66. if (!connection)
  67. throw exception("Cpphibernate mariadb driver is not connected to any database!");
  68. destroy_impl_t<T_dataset>::apply(
  69. destroy_context(*schema, *connection, dataset));
  70. }
  71. } }