Module: ArJdbc::PostgreSQL::Column

Included in:
ActiveRecord::ConnectionAdapters::PostgreSQLColumn
Defined in:
lib/arjdbc/postgresql/column.rb

Overview

Column behavior based on PostgreSQL adapter in Rails.

Defined Under Namespace

Modules: Cast

Instance Method Summary collapse

Instance Method Details

#default_value(default) ⇒ Object

Extracts the value from a PostgreSQL column default definition.

NOTE: based on self.extract_value_from_default(default) code



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/arjdbc/postgresql/column.rb', line 42

def default_value(default)
  # This is a performance optimization for Ruby 1.9.2 in development.
  # If the value is nil, we return nil straight away without checking
  # the regular expressions. If we check each regular expression,
  # Regexp#=== will call NilClass#to_str, which will trigger
  # method_missing (defined by whiny nil in ActiveSupport) which
  # makes this method very very slow.
  return default unless default

  case default
    when /\A'(.*)'::(num|date|tstz|ts|int4|int8)range\z/m
      $1
    # Numeric types
    when /\A\(?(-?\d+(\.\d*)?\)?(::bigint)?)\z/
      $1
    # Character types
    when /\A\(?'(.*)'::.*\b(?:character varying|bpchar|text)\z/m
      $1
    # Binary data types
    when /\A'(.*)'::bytea\z/m
      $1
    # Date/time types
    when /\A'(.+)'::(?:time(?:stamp)? with(?:out)? time zone|date)\z/
      $1
    when /\A'(.*)'::interval\z/
      $1
    # Boolean type
    when 'true'
      true
    when 'false'
      false
    # Geometric types
    when /\A'(.*)'::(?:point|line|lseg|box|"?path"?|polygon|circle)\z/
      $1
    # Network address types
    when /\A'(.*)'::(?:cidr|inet|macaddr)\z/
      $1
    # Bit string types
    when /\AB'(.*)'::"?bit(?: varying)?"?\z/
      $1
    # XML type
    when /\A'(.*)'::xml\z/m
      $1
    # Arrays
    when /\A'(.*)'::"?\D+"?\[\]\z/
      $1
    when /\AARRAY\[(.*)\](::\D+)?\z/
      "{#{$1.gsub(/'(.*?)'::[a-z]+(,)?\s?/, '\1\2')}}"
    # Hstore
    when /\A'(.*)'::hstore\z/
      $1
    # JSON
    when /\A'(.*)'::json\z/
      $1
    # Object identifier types
    when /\A-?\d+\z/
      $1
    else
      # Anything else is blank, some user type, or some function
      # and we can't know the value of that, so return nil.
      nil
  end
end

#extract_bounds(value) ⇒ Object

OID Type::Range helpers :



298
299
300
301
302
303
304
305
# File 'lib/arjdbc/postgresql/column.rb', line 298

def extract_bounds(value)
  f, t = value[1..-2].split(',')
  {
    :from => (value[1] == ',' || f == '-infinity') ? infinity(:negative => true) : f,
    :to   => (value[-2] == ',' || t == 'infinity') ? infinity : t,
    :exclude_start => (value[0] == '('), :exclude_end => (value[-1] == ')')
  }
end

#infinity(options = {}) ⇒ Object



307
308
309
# File 'lib/arjdbc/postgresql/column.rb', line 307

def infinity(options = {})
  ::Float::INFINITY * (options[:negative] ? -1 : 1)
end

#to_integer(value) ⇒ Object



311
312
313
# File 'lib/arjdbc/postgresql/column.rb', line 311

def to_integer(value)
  (value.respond_to?(:infinite?) && value.infinite?) ? value : value.to_i
end

#type_cast(value, type = false) ⇒ Object

Casts value (which is a String) to an appropriate instance.



108
109
110
111
112
113
114
115
116
117
# File 'lib/arjdbc/postgresql/column.rb', line 108

def type_cast(value) # AR < 4.0 version
  return if value.nil?
  return super if respond_to?(:encoded?) && encoded? # since AR-3.2

  case sql_type
  when 'money'
    self.class.string_to_money(value)
  else super
  end
end