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.
This commit is contained in:
Gerhard Schlager
2020-03-26 16:36:38 +01:00
parent c94b63bc75
commit d216483c53

View File

@ -219,24 +219,28 @@ class ImportScripts::Base
def all_records_exist?(type, import_ids) def all_records_exist?(type, import_ids)
return false if import_ids.empty? return false if import_ids.empty?
connection = ActiveRecord::Base.connection.raw_connection ActiveRecord::Base.transaction do
connection.exec('CREATE TEMP TABLE import_ids(val text PRIMARY KEY)') 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 = "#{type.to_s.classify}CustomField".constantize
existing = existing.where(name: 'import_id') existing = existing.where(name: 'import_id')
.joins('JOIN import_ids ON val = value') .joins('JOIN import_ids ON val = value')
.count .count
if existing == import_ids.length if existing == import_ids.length
puts "Skipping #{import_ids.length} already imported #{type}" puts "Skipping #{import_ids.length} already imported #{type}"
true true
end
ensure
connection.exec('DROP TABLE import_ids') unless connection.nil?
end
end end
ensure
connection.exec('DROP TABLE import_ids') unless connection.nil?
end end
def created_user(user) def created_user(user)