From d216483c532f3394d56808fa5362f8ccfede5781 Mon Sep 17 00:00:00 2001 From: Gerhard Schlager Date: Thu, 26 Mar 2020 16:36:38 +0100 Subject: [PATCH] FIX: Importing with pgbouncer failed Checking if all records have been imported uses a temp table in PostgreSQL. This fails when pgbouncer is used unless the temp table is created inside a transaction. --- script/import_scripts/base.rb | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/script/import_scripts/base.rb b/script/import_scripts/base.rb index 4e7ca2af27b..ea43db27300 100644 --- a/script/import_scripts/base.rb +++ b/script/import_scripts/base.rb @@ -219,24 +219,28 @@ class ImportScripts::Base def all_records_exist?(type, import_ids) return false if import_ids.empty? - connection = ActiveRecord::Base.connection.raw_connection - connection.exec('CREATE TEMP TABLE import_ids(val text PRIMARY KEY)') + ActiveRecord::Base.transaction do + begin + connection = ActiveRecord::Base.connection.raw_connection + connection.exec('CREATE TEMP TABLE import_ids(val text PRIMARY KEY)') - import_id_clause = import_ids.map { |id| "('#{PG::Connection.escape_string(id.to_s)}')" }.join(",") + import_id_clause = import_ids.map { |id| "('#{PG::Connection.escape_string(id.to_s)}')" }.join(",") - connection.exec("INSERT INTO import_ids VALUES #{import_id_clause}") + connection.exec("INSERT INTO import_ids VALUES #{import_id_clause}") - existing = "#{type.to_s.classify}CustomField".constantize - existing = existing.where(name: 'import_id') - .joins('JOIN import_ids ON val = value') - .count + existing = "#{type.to_s.classify}CustomField".constantize + existing = existing.where(name: 'import_id') + .joins('JOIN import_ids ON val = value') + .count - if existing == import_ids.length - puts "Skipping #{import_ids.length} already imported #{type}" - true + if existing == import_ids.length + puts "Skipping #{import_ids.length} already imported #{type}" + true + end + ensure + connection.exec('DROP TABLE import_ids') unless connection.nil? + end end - ensure - connection.exec('DROP TABLE import_ids') unless connection.nil? end def created_user(user)