#include #include #include #include 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(); }