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.
 
 
 

67 lines
1.9 KiB

  1. #include <set>
  2. #include <cpphibernate/driver/mariadb/classes/fields/field.h>
  3. #include <cpphibernate/driver/mariadb/classes/tables/table.h>
  4. #include <cpphibernate/driver/mariadb/context/create_update_context.inl>
  5. using namespace ::cpphibernate;
  6. using namespace ::cpphibernate::mariadb;
  7. static std::string build_foreign_many_update_query(const field_t& field);
  8. void field_t::foreign_many_update(
  9. const create_update_context& context,
  10. const std::string& primary_key) const
  11. {
  12. auto& statement = get_statement_foreign_many_update();
  13. auto& connection = context.connection;
  14. statement.set(0, primary_key);
  15. cpphibernate_log_debug("execute UPDATE old foreign many query: " << std::endl << update_statement.query(connection) << std::endl);
  16. connection.execute(statement);
  17. }
  18. ::cppmariadb::statement& field_t::get_statement_foreign_many_update() const
  19. {
  20. if (!_statement_foreign_many_update)
  21. {
  22. auto query = build_foreign_many_update_query(*this);
  23. _statement_foreign_many_update.reset(new ::cppmariadb::statement(std::move(query)));
  24. }
  25. return *_statement_foreign_many_update;
  26. }
  27. std::string build_foreign_many_update_query(const field_t& field)
  28. {
  29. assert(field.referenced_table);
  30. assert(field.referenced_table->primary_key_field);
  31. auto& ref_key_info = *field.referenced_table->primary_key_field;
  32. std::ostringstream os;
  33. os << "UPDATE `"
  34. << ref_key_info.table.name
  35. << "` SET `"
  36. << field.table.name
  37. << "_id_"
  38. << field.name
  39. << "`=NULL";
  40. if (field.value_is_container)
  41. {
  42. os << ", `"
  43. << field.table.name
  44. << "_index_"
  45. << field.name
  46. << "`=0";
  47. }
  48. os << " WHERE `"
  49. << field.table.name
  50. << "_id_"
  51. << field.name
  52. << "`="
  53. << ref_key_info.convert_to_open
  54. << "?\?"
  55. << ref_key_info.convert_to_close;
  56. return os.str();
  57. }