module ArJdbc::PostgreSQL::OIDTypes

@private

Public Instance Methods

disable_extension(name) click to toggle source

@override

Calls superclass method
# File lib/arjdbc/postgresql/oid_types.rb, line 35
def disable_extension(name)
  result = super(name)
  @extensions = nil
  reload_type_map
  result
end
enable_extension(name) click to toggle source

@override

Calls superclass method
# File lib/arjdbc/postgresql/oid_types.rb, line 27
def enable_extension(name)
  result = super(name)
  @extensions = nil
  reload_type_map
  result
end
extensions() click to toggle source

@override

Calls superclass method
# File lib/arjdbc/postgresql/oid_types.rb, line 43
def extensions
  @extensions ||= super
end
get_oid_type(oid, fmod, column_name, sql_type = '') click to toggle source
# File lib/arjdbc/postgresql/oid_types.rb, line 53
def get_oid_type(oid, fmod, column_name, sql_type = '')
  if !type_map.key?(oid)
    load_additional_types(type_map, [oid])
  end

  type_map.fetch(oid, fmod, sql_type) {
    warn "unknown OID #{oid}: failed to recognize type of '#{column_name}'. It will be treated as String."
    Type::Value.new.tap do |cast_type|
      type_map.register_type(oid, cast_type)
    end
  }
end
lookup_cast_type(sql_type) click to toggle source

@override

Calls superclass method
# File lib/arjdbc/postgresql/oid_types.rb, line 48
def lookup_cast_type(sql_type)
  oid = execute("SELECT #{quote(sql_type)}::regtype::oid", "SCHEMA")
  super oid.first['oid'].to_i
end
reload_type_map() click to toggle source
# File lib/arjdbc/postgresql/oid_types.rb, line 70
def reload_type_map
  if ( @type_map ||= nil )
    @type_map.clear
    initialize_type_map(@type_map)
  end
end
type_map() click to toggle source
# File lib/arjdbc/postgresql/oid_types.rb, line 66
def type_map
  @type_map
end

Private Instance Methods

initialize_type_map(m) click to toggle source
# File lib/arjdbc/postgresql/oid_types.rb, line 79
def initialize_type_map(m)
  register_class_with_limit m, 'int2', Type::Integer
  register_class_with_limit m, 'int4', Type::Integer
  register_class_with_limit m, 'int8', Type::Integer
  m.register_type 'oid', OID::Oid.new
  m.register_type 'float4', Type::Float.new
  m.alias_type 'float8', 'float4'
  m.register_type 'text', Type::Text.new
  register_class_with_limit m, 'varchar', Type::String
  m.alias_type 'char', 'varchar'
  m.alias_type 'name', 'varchar'
  m.alias_type 'bpchar', 'varchar'
  m.register_type 'bool', Type::Boolean.new
  register_class_with_limit m, 'bit', OID::Bit
  register_class_with_limit m, 'varbit', OID::BitVarying
  m.alias_type 'timestamptz', 'timestamp'
  m.register_type 'date', Type::Date.new
  m.register_type 'time', Type::Time.new

  m.register_type 'money', OID::Money.new
  m.register_type 'bytea', OID::Bytea.new
  m.register_type 'point', OID::Point.new
  m.register_type 'hstore', OID::Hstore.new
  m.register_type 'json', OID::Json.new
  m.register_type 'jsonb', OID::Jsonb.new
  m.register_type 'cidr', OID::Cidr.new
  m.register_type 'inet', OID::Inet.new
  m.register_type 'uuid', OID::Uuid.new
  m.register_type 'xml', OID::Xml.new
  m.register_type 'box', OID::SpecializedString.new(:box)
  m.register_type 'circle', OID::SpecializedString.new(:circle)
  m.register_type 'citext', OID::SpecializedString.new(:citext)
  m.register_type 'line', OID::SpecializedString.new(:line)
  m.register_type 'lseg', OID::SpecializedString.new(:lseg)
  m.register_type 'ltree', OID::SpecializedString.new(:ltree)
  m.register_type 'macaddr', OID::SpecializedString.new(:macaddr)
  m.register_type 'path', OID::SpecializedString.new(:path)
  m.register_type 'polygon', OID::SpecializedString.new(:polygon)
  m.register_type 'tsvector', OID::SpecializedString.new(:tsvector)

  m.register_type 'interval' do |_, _, sql_type|
    precision = extract_precision(sql_type)
    OID::SpecializedString.new(:interval, precision: precision)
  end

  m.register_type 'timestamp' do |_, _, sql_type|
    precision = extract_precision(sql_type)
    OID::DateTime.new(precision: precision)
  end

  m.register_type 'numeric' do |_, fmod, sql_type|
    precision = extract_precision(sql_type)
    scale = extract_scale(sql_type)

    # The type for the numeric depends on the width of the field,
    # so we'll do something special here.
    #
    # When dealing with decimal columns:
    #
    # places after decimal  = fmod - 4 & 0xffff
    # places before decimal = (fmod - 4) >> 16 & 0xffff
    if fmod && (fmod - 4 & 0xffff).zero?
      # FIXME: Remove this class, and the second argument to
      # lookups on PG
      Type::DecimalWithoutScale.new(precision: precision)
    else
      OID::Decimal.new(precision: precision, scale: scale)
    end
  end

  load_additional_types(m)
end
load_additional_types(type_map, oids = nil) click to toggle source
# File lib/arjdbc/postgresql/oid_types.rb, line 152
      def load_additional_types(type_map, oids = nil)
        if supports_ranges?
          query = <<-SQL
            SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype
            FROM pg_type as t
            LEFT JOIN pg_range as r ON oid = rngtypid
          SQL
        else
          query = <<-SQL
            SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, t.typtype, t.typbasetype
            FROM pg_type as t
          SQL
        end

        initializer = OID::TypeMapInitializer.new(type_map)

        if oids
          query << ( "WHERE t.oid::integer IN (%s)" % oids.join(", ") )
        else
          # query_conditions_for_initial_load only available since AR > 4.2.1
          if initializer.respond_to?(:query_conditions_for_initial_load)
            query << initializer.query_conditions_for_initial_load(type_map)
          end
        end

        records = execute(query, 'SCHEMA')
        initializer.run(records)
      end