Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

62 рядки
1.7 KiB

  1. #pragma once
  2. #include "field_primary_key.h"
  3. #include "../../context/data_context.inl"
  4. namespace cpphibernate {
  5. namespace mariadb {
  6. /* field_primary_key_t */
  7. template<
  8. typename T_field>
  9. template<
  10. typename T_schema,
  11. typename T_table>
  12. field_primary_key_t<T_field>::field_primary_key_t(
  13. const table_t& p_owner,
  14. const T_schema& p_schema,
  15. const T_table& p_table,
  16. const T_field& p_field)
  17. : field_value_t<T_field>::field_value_t(
  18. p_owner,
  19. p_schema,
  20. p_table,
  21. p_field)
  22. {
  23. this->value_is_auto_incremented = key_props.is_auto_generated();
  24. auto args = key_props.create_table_argument();
  25. if (args)
  26. this->create_arguments = args;
  27. this->name = this->table.name + '_' + this->name;
  28. }
  29. template<
  30. typename T_field>
  31. bool field_primary_key_t<T_field>
  32. ::is_default(const data_context& context) const
  33. {
  34. using dataset_type = typename mp::decay_t<T_field>::dataset_type;
  35. auto& dataset = context.get<dataset_type>();
  36. return key_props.is_default(this->_field.getter(dataset));
  37. }
  38. template<
  39. typename T_field>
  40. std::string field_primary_key_t<T_field>
  41. ::generate_value(::cppmariadb::connection& connection) const
  42. {
  43. auto * query = key_props.create_key_query();
  44. if (!query)
  45. throw exception("unable to generate key value: no query defined for this key type!");
  46. auto ret = connection.execute_used(query);
  47. if (!ret || !ret->next())
  48. throw exception("unable to generate key value: empty result!");
  49. return ret->current()->at(0).template get<std::string>();
  50. }
  51. } }