|
- #include <set>
- #include <cpphibernate/driver/mariadb/classes/fields/field.h>
- #include <cpphibernate/driver/mariadb/classes/tables/table.h>
-
- #include <cpphibernate/driver/mariadb/context/create_update_context.inl>
-
- using namespace ::cpphibernate;
- using namespace ::cpphibernate::mariadb;
-
- static std::string build_foreign_many_update_query(const field_t& field);
-
- void field_t::foreign_many_update(
- const create_update_context& context,
- const std::string& primary_key) const
- {
- auto& statement = get_statement_foreign_many_update();
- auto& connection = context.connection;
- statement.set(0, primary_key);
- cpphibernate_log_debug("execute UPDATE old foreign many query: " << std::endl << update_statement.query(connection) << std::endl);
- connection.execute(statement);
- }
-
- ::cppmariadb::statement& field_t::get_statement_foreign_many_update() const
- {
- if (!_statement_foreign_many_update)
- {
- auto query = build_foreign_many_update_query(*this);
- _statement_foreign_many_update.reset(new ::cppmariadb::statement(std::move(query)));
- }
- return *_statement_foreign_many_update;
- }
-
- std::string build_foreign_many_update_query(const field_t& field)
- {
- assert(field.referenced_table);
- assert(field.referenced_table->primary_key_field);
-
- auto& ref_key_info = *field.referenced_table->primary_key_field;
-
- std::ostringstream os;
- os << "UPDATE `"
- << ref_key_info.table.name
- << "` SET `"
- << field.table.name
- << "_id_"
- << field.name
- << "`=NULL";
- if (field.value_is_container)
- {
- os << ", `"
- << field.table.name
- << "_index_"
- << field.name
- << "`=0";
- }
- os << " WHERE `"
- << field.table.name
- << "_id_"
- << field.name
- << "`="
- << ref_key_info.convert_to_open
- << "?\?"
- << ref_key_info.convert_to_close;
-
- return os.str();
- }
|