class PG::BasicTypeRegistry::CoderMap

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.

Constants

DONT_QUOTE_TYPES

Hash of text types that don't require quotation, when used within composite types.

type.name => true

Attributes

coders[R]
coders_by_name[R]
coders_by_oid[R]

Public Class Methods

new(result, coders_by_name, format, arraycoder) click to toggle source
# File lib/pg/basic_type_registry.rb, line 44
def initialize(result, coders_by_name, format, arraycoder)
        coder_map = {}

        arrays, nodes = result.partition { |row| row['typinput'] == 'array_in' }

        # populate the base types
        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.freeze
        end

        if arraycoder
                # populate array types
                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.freeze
                end
        end

        @coders = coder_map.values.freeze
        @coders_by_name = @coders.inject({}){|h, t| h[t.name] = t; h }.freeze
        @coders_by_oid = @coders.inject({}){|h, t| h[t.oid] = t; h }.freeze
        freeze
end

Public Instance Methods

coder_by_name(name) click to toggle source
# File lib/pg/basic_type_registry.rb, line 84
def coder_by_name(name)
        @coders_by_name[name]
end
coder_by_oid(oid) click to toggle source
# File lib/pg/basic_type_registry.rb, line 88
def coder_by_oid(oid)
        @coders_by_oid[oid]
end