method
add_pg_decoders
v8.0.0 -
Show latest stable
- Class:
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
add_pg_decoders()private
No documentation available.
# File activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb, line 1107
def add_pg_decoders
@mapped_default_timezone = nil
@timestamp_decoder = nil
coders_by_name = {
"int2" => PG::TextDecoder::Integer,
"int4" => PG::TextDecoder::Integer,
"int8" => PG::TextDecoder::Integer,
"oid" => PG::TextDecoder::Integer,
"float4" => PG::TextDecoder::Float,
"float8" => PG::TextDecoder::Float,
"numeric" => PG::TextDecoder::Numeric,
"bool" => PG::TextDecoder::Boolean,
"timestamp" => PG::TextDecoder::TimestampUtc,
"timestamptz" => PG::TextDecoder::TimestampWithTimeZone,
}
coders_by_name["date"] = PG::TextDecoder::Date if decode_dates
known_coder_types = coders_by_name.keys.map { |n| quote(n) }
query = <<~SQL % known_coder_types.join(", ")
SELECT t.oid, t.typname
FROM pg_type as t
WHERE t.typname IN (%(
SQL
result = internal_execute(query, "SCHEMA", [], allow_retry: true, materialize_transactions: false)
coders = result.filter_map { |row| construct_coder(row, coders_by_name[row["typname"]]) }
map = PG::TypeMapByOid.new
coders.each { |coder| map.add_coder(coder) }
@raw_connection.type_map_for_results = map
@type_map_for_results = PG::TypeMapByOid.new
@type_map_for_results.default_type_map = map
@type_map_for_results.add_coder(PG::TextDecoder::Bytea.new(oid: 17, name: "bytea"))
@type_map_for_results.add_coder(MoneyDecoder.new(oid: 790, name: "money"))
# extract timestamp decoder for use in update_typemap_for_default_timezone
@timestamp_decoder = coders.find { |coder| coder.name == "timestamp" }
update_typemap_for_default_timezone
end
def construct_coder(row, coder_class)
return unless coder_class
coder_class.new(oid: row["oid"].to_i, name: row["typname"])
end
class MoneyDecoder < PG::SimpleDecoder # :nodoc:
TYPE = OID::Money.new
def decode(value, tuple = nil, field = nil)
TYPE.deserialize(value)
end
end
ActiveRecord::Type.add_modifier({ array: true }, OID::Array, adapter: :postgresql)
ActiveRecord::Type.add_modifier({ range: true }, OID::Range, adapter: :postgresql)
ActiveRecord::Type.register(:bit, OID::Bit, adapter: :postgresql)
ActiveRecord::Type.register(:bit_varying, OID::BitVarying, adapter: :postgresql)
ActiveRecord::Type.register(:binary, OID::Bytea, adapter: :postgresql)
ActiveRecord::Type.register(:cidr, OID::Cidr, adapter: :postgresql)
ActiveRecord::Type.register(:date, OID::Date, adapter: :postgresql)
ActiveRecord::Type.register(:datetime, OID::DateTime, adapter: :postgresql)
ActiveRecord::Type.register(:decimal, OID::Decimal, adapter: :postgresql)
ActiveRecord::Type.register(:enum, OID::Enum, adapter: :postgresql)
ActiveRecord::Type.register(:hstore, OID::Hstore, adapter: :postgresql)
ActiveRecord::Type.register(:inet, OID::Inet, adapter: :postgresql)
ActiveRecord::Type.register(:interval, OID::Interval, adapter: :postgresql)
ActiveRecord::Type.register(:jsonb, OID::Jsonb, adapter: :postgresql)
ActiveRecord::Type.register(:money, OID::Money, adapter: :postgresql)
ActiveRecord::Type.register(:point, OID::Point, adapter: :postgresql)
ActiveRecord::Type.register(:legacy_point, OID::LegacyPoint, adapter: :postgresql)
ActiveRecord::Type.register(:uuid, OID::Uuid, adapter: :postgresql)
ActiveRecord::Type.register(:vector, OID::Vector, adapter: :postgresql)
ActiveRecord::Type.register(:xml, OID::Xml, adapter: :postgresql)
end
ActiveSupport.run_load_hooks(:active_record_postgresqladapter, PostgreSQLAdapter)
end
end