Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

200 rindas
8.1 KiB

  1. #pragma once
  2. #include <memory>
  3. #include <vector>
  4. #include <cppmariadb.h>
  5. #include <cpphibernate/misc.h>
  6. #include <cpphibernate/config.h>
  7. #include <cpphibernate/schema/table.h>
  8. #include <cpphibernate/schema/schema.h>
  9. #include <cpphibernate/driver/mariadb/schema/fields.h>
  10. #include <cpphibernate/driver/mariadb/schema/table.fwd.h>
  11. #include <cpphibernate/driver/mariadb/schema/filter.fwd.h>
  12. #include <cpphibernate/driver/mariadb/helper/context.h>
  13. beg_namespace_cpphibernate_driver_mariadb
  14. {
  15. /* table_t */
  16. struct table_t
  17. {
  18. public:
  19. size_t dataset_id { 0 };
  20. size_t base_dataset_id { 0 };
  21. size_t table_id { 0 };
  22. std::vector<size_t> derived_dataset_ids;
  23. std::string table_name;
  24. std::string schema_name;
  25. fields_t fields;
  26. const table_t* base_table { nullptr };
  27. std::vector<const table_t*> derived_tables;
  28. const field_t* primary_key_field { nullptr };
  29. std::vector<const field_t*> foreign_key_fields;
  30. std::vector<const field_t*> foreign_table_fields;
  31. std::vector<const field_t*> foreign_table_one_fields;
  32. std::vector<const field_t*> foreign_table_many_fields;
  33. std::vector<const field_t*> data_fields;
  34. inline table_t() = default;
  35. inline table_t(const table_t&) = delete;
  36. inline table_t(table_t&& other)
  37. : dataset_id (std::move(other).dataset_id)
  38. , base_dataset_id (std::move(other).base_dataset_id)
  39. , table_id (std::move(other).table_id)
  40. , derived_dataset_ids (std::move(other).derived_dataset_ids)
  41. , table_name (std::move(other).table_name)
  42. , schema_name (std::move(other).schema_name)
  43. , fields (std::move(other).fields)
  44. , base_table (nullptr)
  45. , derived_tables ()
  46. , primary_key_field (nullptr)
  47. , foreign_key_fields ()
  48. , foreign_table_fields ()
  49. , foreign_table_one_fields ()
  50. , foreign_table_many_fields ()
  51. , data_fields ()
  52. { }
  53. virtual ~table_t() { };
  54. void print(std::ostream& os) const;
  55. const table_t* get_derived_by_table_id(size_t id) const;
  56. const table_t* get_derived_by_dataset_id(size_t id) const;
  57. virtual void emplace (const read_context& context) const;
  58. std::string get_where_primary_key(const data_context& context) const;
  59. std::string build_delete_query (const std::string* where) const;
  60. /* CRUD */
  61. inline void init_stage1(const init_context& context) const
  62. { return init_stage1_exec(context); }
  63. inline void init_stage2(const init_context& context) const
  64. { return init_stage2_exec(context); }
  65. inline decltype(auto) create_update(const create_update_context& context) const
  66. { return create_update_intern(context); }
  67. inline void read(const read_context& context) const
  68. { return read_exec(context); }
  69. inline void destroy(const destroy_context& context) const
  70. { return destroy_intern(context); }
  71. private:
  72. template<typename T_schema, typename T_table, typename T_base_dataset>
  73. friend struct table_simple_t;
  74. template<typename T_schema, typename T_table, typename T_base_dataset>
  75. friend struct table_polymorphic_t;
  76. using statement_ptr = std::unique_ptr<::cppmariadb::statement>;
  77. using map_key = std::tuple<size_t, const field_t*>;
  78. using statement_map = std::map<map_key, ::cppmariadb::statement>;
  79. mutable statement_ptr _statement_create_table;
  80. mutable statement_ptr _statement_alter_table;
  81. mutable statement_ptr _statement_insert_into;
  82. mutable statement_map _statement_select_static;
  83. mutable statement_map _statement_select_dynamic;
  84. mutable statement_map _statement_update;
  85. mutable statement_ptr _statement_foreign_many_delete;
  86. mutable statement_ptr _statement_delete;
  87. ::cppmariadb::statement& get_statement_create_table() const;
  88. ::cppmariadb::statement* get_statement_alter_table() const;
  89. ::cppmariadb::statement& get_statement_insert_into() const;
  90. ::cppmariadb::statement& get_statement_select(const read_context& context) const;
  91. ::cppmariadb::statement& get_statement_update(const filter_t& filter, const field_t* owner) const;
  92. ::cppmariadb::statement& get_statement_foreign_many_delete() const;
  93. ::cppmariadb::statement& get_statement_delete() const;
  94. void execute_foreign_many_delete(const base_context& context) const;
  95. std::string execute_create_update(
  96. const create_update_context& context,
  97. ::cppmariadb::statement& statement) const;
  98. virtual std::string create_update_base(const create_update_context& context) const;
  99. protected:
  100. void init_stage1_exec (const init_context& context) const;
  101. void init_stage2_exec (const init_context& context) const;
  102. virtual std::string create_update_intern(const create_update_context& context) const;
  103. std::string create_update_exec (const create_update_context& context) const;
  104. void read_exec (const read_context& context) const;
  105. virtual void destroy_intern (const destroy_context& context) const;
  106. void destroy_exec (const destroy_context& context) const;
  107. void destroy_cleanup (const base_context& context, bool check_derived, bool check_base) const;
  108. };
  109. /* table_simple_t */
  110. template<typename T_schema, typename T_table, typename T_base_dataset>
  111. struct table_simple_t
  112. : public table_t
  113. {
  114. public:
  115. using schema_type = T_schema;
  116. using table_type = T_table;
  117. using base_dataset_type = T_base_dataset;
  118. using dataset_type = typename table_type::dataset_type;
  119. const schema_type& schema;
  120. const table_type& table;
  121. inline table_simple_t(const schema_type& p_schema, const table_type& p_table)
  122. : schema(p_schema)
  123. , table (p_table)
  124. { }
  125. inline table_simple_t(const table_simple_t&) = delete;
  126. inline table_simple_t(table_simple_t&& other)
  127. : table_t(std::move(other))
  128. , schema (std::move(other).schema)
  129. , table (std::move(other).table)
  130. { }
  131. };
  132. /* table_polymorphic_t */
  133. template<typename T_schema, typename T_table, typename T_base_dataset>
  134. struct table_polymorphic_t
  135. : public table_simple_t<T_schema, T_table, T_base_dataset>
  136. {
  137. public:
  138. using base_type = table_simple_t<T_schema, T_table, T_base_dataset>;
  139. using schema_type = typename base_type::schema_type;
  140. using table_type = typename base_type::table_type;
  141. using base_dataset_type = typename base_type::base_dataset_type;
  142. using dataset_type = typename table_type::dataset_type;
  143. using real_dataset_type = misc::real_dataset_t<dataset_type>;
  144. using base_type::base_type;
  145. virtual void emplace(const read_context& context) const override;
  146. private:
  147. template<typename T_dataset, typename T_pred, typename T_include_self>
  148. constexpr void for_each_derived(T_dataset& dataset, const T_include_self& include_self, const T_pred& pred) const;
  149. protected:
  150. virtual std::string create_update_intern(const create_update_context& context) const override;
  151. virtual void destroy_intern (const destroy_context& context) const override;
  152. private:
  153. virtual std::string create_update_base(const create_update_context& context) const override;
  154. };
  155. }
  156. end_namespace_cpphibernate_driver_mariadb