Module: ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::Quoting

Defined in:
lib/restpack_service/activerecord/postgres_array_patch.rb

Instance Method Summary collapse

Instance Method Details

#quote(value, column = nil) ⇒ Object

:nodoc:



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
# File 'lib/restpack_service/activerecord/postgres_array_patch.rb', line 16

def quote(value, column = nil) #:nodoc:
  return super unless column

  sql_type = type_to_sql(column.type, column.limit, column.precision, column.scale)

  case value
  when Range
    if /range$/ =~ sql_type
      "'#{ActiveRecord::ConnectionAdapters::PostgreSQLColumn.range_to_string(value)}'::#{sql_type}"
    else
      super
    end
  when Array
    case sql_type
    when 'point' then super(ActiveRecord::ConnectionAdapters::PostgreSQLColumn.point_to_string(value))
    when 'json' then super(ActiveRecord::ConnectionAdapters::PostgreSQLColumn.json_to_string(value))
    else
      if column.array
        "'#{ActiveRecord::ConnectionAdapters::PostgreSQLColumn.array_to_string(value, column, self).gsub(/'/, "''")}'"
      else
        super
      end
    end
  when Hash
    case sql_type
    when 'hstore' then super(ActiveRecord::ConnectionAdapters::PostgreSQLColumn.hstore_to_string(value), column)
    when 'json' then super(ActiveRecord::ConnectionAdapters::PostgreSQLColumn.json_to_string(value), column)
    else super
    end
  when IPAddr
    case sql_type
    when 'inet', 'cidr' then super(ActiveRecord::ConnectionAdapters::PostgreSQLColumn.cidr_to_string(value), column)
    else super
    end
  when Float
    if value.infinite? && column.type == :datetime
      "'#{value.to_s.downcase}'"
    elsif value.infinite? || value.nan?
      "'#{value.to_s}'"
    else
      super
    end
  when Numeric
    if sql_type == 'money' || [:string, :text].include?(column.type)
      # Not truly string input, so doesn't require (or allow) escape string syntax.
      "'#{value}'"
    else
      super
    end
  when String
    case sql_type
    when 'bytea' then "'#{escape_bytea(value)}'"
    when 'xml'   then "xml '#{quote_string(value)}'"
    when /^bit/
      case value
      when /^[01]*$/      then "B'#{value}'" # Bit-string notation
      when /^[0-9A-F]*$/i then "X'#{value}'" # Hexadecimal notation
      end
    else
      super
    end
  else
    super
  end
end

#type_cast(value, column, array_member = false) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/restpack_service/activerecord/postgres_array_patch.rb', line 82

def type_cast(value, column, array_member = false)
  return super(value, column) unless column

  case value
  when Range
    return super(value, column) unless /range$/ =~ column.sql_type
    ActiveRecord::ConnectionAdapters::PostgreSQLColumn.range_to_string(value)
  when NilClass
    if column.array && array_member
      'NULL'
    elsif column.array
      value
    else
      super(value, column)
    end
  when Array
    case column.sql_type
    when 'point' then ActiveRecord::ConnectionAdapters::PostgreSQLColumn.point_to_string(value)
    when 'json' then ActiveRecord::ConnectionAdapters::PostgreSQLColumn.json_to_string(value)
    else
      return super(value, column) unless column.array
      ActiveRecord::ConnectionAdapters::PostgreSQLColumn.array_to_string(value, column, self)
    end
  when String
    return super(value, column) unless 'bytea' == column.sql_type
    { :value => value, :format => 1 }
  when Hash
    case column.sql_type
    when 'hstore' then ActiveRecord::ConnectionAdapters::PostgreSQLColumn.hstore_to_string(value)
    when 'json' then ActiveRecord::ConnectionAdapters::PostgreSQLColumn.json_to_string(value)
    else super(value, column)
    end
  when IPAddr
    return super(value, column) unless ['inet','cidr'].include? column.sql_type
    ActiveRecord::ConnectionAdapters::PostgreSQLColumn.cidr_to_string(value)
  else
    super(value, column)
  end
end