123456789_123456789_123456789_123456789_123456789_

Class: PG::BasicTypeRegistry::CoderMap

Relationships & Source Files
Inherits: Object
Defined in: lib/pg/basic_type_registry.rb

Overview

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.

Constant Summary

  • DONT_QUOTE_TYPES = private

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

    type.name => true
    # File 'lib/pg/basic_type_registry.rb', line 36
    %w[
    	int2 int4 int8
    	float4 float8
    	oid
    	bool
    	date timestamp timestamptz
    ].inject({}){|h,e| h[e] = true; h }.freeze

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(result, coders_by_name, format, arraycoder) ⇒ CoderMap

[ GitHub ]

  
# File 'lib/pg/basic_type_registry.rb', line 45

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

Instance Attribute Details

#coders (readonly)

[ GitHub ]

  
# File 'lib/pg/basic_type_registry.rb', line 81

attr_reader :coders

#coders_by_name (readonly)

[ GitHub ]

  
# File 'lib/pg/basic_type_registry.rb', line 83

attr_reader :coders_by_name

#coders_by_oid (readonly)

[ GitHub ]

  
# File 'lib/pg/basic_type_registry.rb', line 82

attr_reader :coders_by_oid

Instance Method Details

#coder_by_name(name)

[ GitHub ]

  
# File 'lib/pg/basic_type_registry.rb', line 85

def coder_by_name(name)
	@coders_by_name[name]
end

#coder_by_oid(oid)

[ GitHub ]

  
# File 'lib/pg/basic_type_registry.rb', line 89

def coder_by_oid(oid)
	@coders_by_oid[oid]
end