PG::BasicTypeRegistry::
CoderMap
class
An instance of this class stores the coders that should be used for a particular wire format (text or binary) and type cast direction (encoder or decoder).
Each coder object is filled with the PostgreSQL type name, OID, wire format and array coders are filled with the base elements_type.
- DONT_QUOTE_TYPES
Hash of text types that don’t require quotation, when used within composite types.
type.name => true
- coders R
- coders_by_name R
- coders_by_oid R
new(result, coders_by_name, format, arraycoder)
def initialize(result, coders_by_name, format, arraycoder)
coder_map = {}
arrays, nodes = result.partition { |row| row['typinput'] == 'array_in' }
nodes.find_all { |row| coders_by_name.key?(row['typname']) }.each do |row|
coder = coders_by_name[row['typname']].dup
coder.oid = row['oid'].to_i
coder.name = row['typname']
coder.format = format
coder_map[coder.oid] = coder
end
if arraycoder
arrays.each do |row|
elements_coder = coder_map[row['typelem'].to_i]
next unless elements_coder
coder = arraycoder.new
coder.oid = row['oid'].to_i
coder.name = row['typname']
coder.format = format
coder.elements_type = elements_coder
coder.needs_quotation = !DONT_QUOTE_TYPES[elements_coder.name]
coder_map[coder.oid] = coder
end
end
@coders = coder_map.values
@coders_by_name = @coders.inject({}){|h, t| h[t.name] = t; h }
@coders_by_oid = @coders.inject({}){|h, t| h[t.oid] = t; h }
end
def coder_by_name(name)
@coders_by_name[name]
end
def coder_by_oid(oid)
@coders_by_oid[oid]
end