Module: ActiveRecord::ConnectionAdapters::PostgreSQLColumn::Cast

Included in:
ActiveRecord::ConnectionAdapters::PostgreSQLColumn
Defined in:
lib/active_record/connection_adapters/postgresql/cast.rb

Instance Method Summary collapse

Instance Method Details

#array_to_string(value, column, adapter) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 70

def array_to_string(value, column, adapter)
  casted_values = value.map do |val|
    if String === val
      if val == "NULL"
        "\"#{val}\""
      else
        quote_and_escape(adapter.type_cast(val, column, true))
      end
    else
      adapter.type_cast(val, column, true)
    end
  end
  "{#{casted_values.join(',')}}"
end

#cidr_to_string(object) ⇒ Object



113
114
115
116
117
118
119
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 113

def cidr_to_string(object)
  if IPAddr === object
    "#{object.to_s}/#{object.instance_variable_get(:@mask_addr).to_s(2).count('1')}"
  else
    object
  end
end

#hstore_to_string(object, array_member = false) ⇒ Object



38
39
40
41
42
43
44
45
46
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 38

def hstore_to_string(object, array_member = false)
  if Hash === object
    string = object.map { |k, v| "#{escape_hstore(k)}=>#{escape_hstore(v)}" }.join(',')
    string = escape_hstore(string) if array_member
    string
  else
    object
  end
end

#json_to_string(object) ⇒ Object



62
63
64
65
66
67
68
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 62

def json_to_string(object)
  if Hash === object || Array === object
    ActiveSupport::JSON.encode(object)
  else
    object
  end
end

#point_to_string(point) ⇒ Object



5
6
7
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 5

def point_to_string(point)
  "(#{point[0]},#{point[1]})"
end

#range_to_string(object) ⇒ Object



85
86
87
88
89
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 85

def range_to_string(object)
  from = object.begin.respond_to?(:infinite?) && object.begin.infinite? ? '' : object.begin
  to   = object.end.respond_to?(:infinite?) && object.end.infinite? ? '' : object.end
  "[#{from},#{to}#{object.exclude_end? ? ')' : ']'}"
end

#string_to_array(string, oid) ⇒ Object



121
122
123
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 121

def string_to_array(string, oid)
  parse_pg_array(string).map {|val| type_cast_array(oid, val)}
end

#string_to_bit(value) ⇒ Object



29
30
31
32
33
34
35
36
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 29

def string_to_bit(value)
  case value
  when /^0x/i
    value[2..-1].hex.to_s(2) # Hexadecimal notation
  else
    value                    # Bit-string notation
  end
end

#string_to_cidr(string) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 99

def string_to_cidr(string)
  if string.nil?
    nil
  elsif String === string
    begin
      IPAddr.new(string)
    rescue ArgumentError
      nil
    end
  else
    string
  end
end

#string_to_hstore(string) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 48

def string_to_hstore(string)
  if string.nil?
    nil
  elsif String === string
    Hash[string.scan(HstorePair).map { |k, v|
      v = v.upcase == 'NULL' ? nil : v.gsub(/\A"(.*)"\Z/m,'\1').gsub(/\\(.)/, '\1')
      k = k.gsub(/\A"(.*)"\Z/m,'\1').gsub(/\\(.)/, '\1')
      [k, v]
    }]
  else
    string
  end
end

#string_to_json(string) ⇒ Object



91
92
93
94
95
96
97
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 91

def string_to_json(string)
  if String === string
    ActiveSupport::JSON.decode(string)
  else
    string
  end
end

#string_to_point(string) ⇒ Object



9
10
11
12
13
14
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 9

def string_to_point(string)
  if string[0] == '(' && string[-1] == ')'
    string = string[1...-1]
  end
  string.split(',').map{ |v| Float(v) }
end

#string_to_time(string) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/active_record/connection_adapters/postgresql/cast.rb', line 16

def string_to_time(string)
  return string unless String === string

  case string
  when 'infinity'; Float::INFINITY
  when '-infinity'; -Float::INFINITY
  when / BC$/
    super("-" + string.sub(/ BC$/, ""))
  else
    super
  end
end