1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
81
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
module ActiveRecord
module ConnectionAdapters
class PostgreSQLColumn < Column
module Cast
def point_to_string(point)
"(#{point[0]},#{point[1]})"
end
def string_to_point(string)
if string[0] == '(' && string[-1] == ')'
string = string[1...-1]
end
string.split(',').map{ |v| Float(v) }
end
def string_to_time(string)
return string unless String === string
case string
when 'infinity'; 1.0 / 0.0
when '-infinity'; -1.0 / 0.0
when / BC$/
super("-" + string.sub(/ BC$/, ""))
else
super
end
end
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
def hstore_to_string(object)
if Hash === object
object.map { |k,v|
"#{escape_hstore(k)}=>#{escape_hstore(v)}"
}.join ','
else
object
end
end
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
def json_to_string(object)
if Hash === object
ActiveSupport::JSON.encode(object)
else
object
end
end
def array_to_string(value, column, adapter, should_be_quoted = false)
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
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
def string_to_json(string)
if String === string
ActiveSupport::JSON.decode(string)
else
string
end
end
def string_to_cidr(string)
if string.nil?
nil
elsif String === string
IPAddr.new(string)
else
string
end
end
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
def string_to_array(string, oid)
parse_pg_array(string).map{|val| oid.type_cast val}
end
private
HstorePair = begin
quoted_string = /"[^"\\]*(?:\\.[^"\\]*)*"/
unquoted_string = /(?:\\.|[^\s,])[^\s=,\\]*(?:\\.[^\s=,\\]*|=[^,>])*/
/(#{quoted_string}|#{unquoted_string})\s*=>\s*(#{quoted_string}|#{unquoted_string})/
end
def escape_hstore(value)
if value.nil?
'NULL'
else
if value == ""
'""'
else
'"%s"' % value.to_s.gsub(/(["\\])/, '\\\\\1')
end
end
end
def quote_and_escape(value)
case value
when "NULL"
value
else
"\"#{value.gsub(/"/,"\\\"")}\""
end
end
end
end
end
end
|