Sha256: d8240552f5fe080b059cbff1787e9c369e19f44c9eb4cfbacd9d78d49139d885
Contents?: true
Size: 1.55 KB
Versions: 2
Compression:
Stored size: 1.55 KB
Contents
require 'upsert/merge_function/postgresql' class Upsert class MergeFunction # @private class PG_Connection < MergeFunction include Postgresql def execute(row) first_try = true values = [] values += row.selector.values values += row.setter.values hstore_delete_handlers.each do |hstore_delete_handler| values << row.hstore_delete_keys.fetch(hstore_delete_handler.name, []) end begin connection.execute sql, values.map { |v| connection.bind_value v } rescue PG::Error => pg_error if pg_error.message =~ /function #{name}.* does not exist/i if first_try Upsert.logger.info %{[upsert] Function #{name.inspect} went missing, trying to recreate} first_try = false create! retry else Upsert.logger.info %{[upsert] Failed to create function #{name.inspect} for some reason} raise pg_error end else raise pg_error end end end # strangely ? can't be used as a placeholder def sql @sql ||= begin bind_params = [] i = 1 (selector_keys.length + setter_keys.length).times do bind_params << "$#{i}" i += 1 end hstore_delete_handlers.length.times do bind_params << "$#{i}::text[]" i += 1 end %{SELECT #{name}(#{bind_params.join(', ')})} end end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
upsert-2.0.1 | lib/upsert/merge_function/PG_Connection.rb |
upsert-2.0.0 | lib/upsert/merge_function/PG_Connection.rb |