ar_pg_array 0.9.7 → 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -30,7 +30,7 @@ begin
30
30
  gemspec.email = "funny.falcon@gmail.com"
31
31
  gemspec.homepage = "http://github.com/funny-falcon/activerecord-postgresql-arrays"
32
32
  gemspec.authors = ["Sokolov Yura aka funny_falcon"]
33
- gemspec.add_dependency('activerecord')
33
+ gemspec.add_dependency('active_record', '>= 2.3.5', '<3.1')
34
34
  gemspec.rubyforge_project = 'ar-pg-array'
35
35
  end
36
36
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.6
1
+ 0.9.9
@@ -2,7 +2,7 @@ module ActiveRecord
2
2
  module ConnectionAdapters
3
3
  class PostgreSQLColumn < Column #:nodoc:
4
4
  BASE_TYPE_COLUMNS = Hash.new{|h, base_type|
5
- base_column= new(nil, nil, base_type, true)
5
+ base_column= new(nil, nil, base_type.to_s, true)
6
6
  h[base_type] = h[base_column.type]= base_column
7
7
  }
8
8
  attr_reader :base_column
@@ -98,9 +98,8 @@ module ActiveRecord
98
98
  eval(string.tr('{}','[]'))
99
99
  end
100
100
 
101
- SARRAY_QUOTED = /^"(.*[^\\])?"$/m
101
+ SARRAY_QUOTED = /^"((?:\\.|[^\\])*)"$/m
102
102
  SARRAY_PARTIAL = /^".*(\\"|[^"])$/m
103
- ESCAPE_ARRAY = Hash.new{|h,k| h[k] = eval("\"#{k}\"") }
104
103
  def self.string_to_text_array(value)
105
104
  return value unless value.is_a? String
106
105
  return nil if value.empty?
@@ -114,7 +113,7 @@ module ActiveRecord
114
113
  partial = true
115
114
  end
116
115
  if s =~ SARRAY_QUOTED
117
- s = $1.gsub(/\\([a-z"\\]|\d{3})/){|s| ESCAPE_ARRAY[s]}
116
+ s = $1.gsub(/\\(.)/,'\1')
118
117
  partial = false
119
118
  elsif s == 'NULL'
120
119
  s = nil
@@ -140,7 +139,7 @@ module ActiveRecord
140
139
  :string, :text, :other, :datetime, :timestamp, :time
141
140
  quote_array_for_arel_by_base_type( value, base_type )
142
141
  else
143
- "E'#{ prepare_pg_string_array(value, base_type, column) }'"
142
+ "'#{ prepare_pg_string_array(value, base_type, column) }'"
144
143
  end
145
144
  end
146
145
 
@@ -150,7 +149,8 @@ module ActiveRecord
150
149
  "'#{ prepare_array_for_arel_by_base_type(value, base_type) }'"
151
150
  when :string, :text, :other
152
151
  pa = prepare_array_for_arel_by_base_type(value, base_type)
153
- "E'#{ quote_string( pa ) }'"
152
+ "'#{ quote_string( pa ) }'"
153
+ #"'#{ pa.gsub("'","''") }'"
154
154
  else
155
155
  raise "Unsupported array base type #{base_type} for arel"
156
156
  end
@@ -164,6 +164,7 @@ module ActiveRecord
164
164
  prepare_pg_float_array(value)
165
165
  when :string, :text, :other
166
166
  prepare_pg_text_array(value)
167
+ #prepare_pg_string_array(value, base_type).gsub("''","'")
167
168
  when :datetime, :timestamp, :time
168
169
  prepare_pg_string_array(value, base_type)
169
170
  when :decimal, :boolean, :date, :safe
@@ -185,6 +186,7 @@ module ActiveRecord
185
186
  "{#{ value.map{|v| v.nil? ? 'NULL' : v.to_s}.join(',')}}"
186
187
  end
187
188
 
189
+ ESCAPE_HASH={'\\'=>'\\\\', '"'=>'\\"'}
188
190
  def prepare_pg_string_array(value, base_type, column=nil)
189
191
  base_column= if column
190
192
  column.base_column
@@ -192,20 +194,30 @@ module ActiveRecord
192
194
  PostgreSQLColumn::BASE_TYPE_COLUMNS[base_type.to_sym]
193
195
  end
194
196
  value = value.map do|v|
195
- v = quote_without_postgresql_arrays(v, base_column)
196
- if v=~/^E?'(.+)'$/ then v = $1 end
197
- "\"#{v.gsub('"','\"')}\""
197
+ unless v.nil?
198
+ v = quote_without_postgresql_arrays(v, base_column)
199
+ if v=~/^'(.+)'$/m then
200
+ "\"#{$1.gsub(/\\|"/){|s| ESCAPE_HASH[s]}}\""
201
+ else
202
+ v
203
+ end
204
+ else
205
+ 'NULL'
206
+ end
198
207
  end
199
208
  "{#{ value.join(',')}}"
200
209
  end
201
-
210
+
211
+ class CNULL; def inspect; 'NULL'; end; alias to_s inspect end
212
+ NULL = CNULL.new
213
+
214
+ TESCAPE_HASH={'\\'=>'\\\\', '"'=>'\\"'}
202
215
  def prepare_pg_text_array(value)
203
216
  value = value.map{|v|
204
- v ? v.to_s.gsub('\\','\\\\\\').gsub('"','\"') : '@!$%NULL%$!@'
205
- }.inspect.gsub('"@!$%NULL%$!@"','NULL')
206
- value.tr!('[]','{}')
217
+ v ? "\"#{v.to_s.gsub(/\\|"/){|s| TESCAPE_HASH[s]}}\"" : NULL
218
+ }.join(',')
219
+ "{#{value}}"
207
220
  end
208
-
209
221
 
210
222
  NATIVE_DATABASE_TYPES.keys.each do |key|
211
223
  unless key==:primary_key
@@ -2,7 +2,7 @@ first:
2
2
  id: 1
3
3
  ints: [ 1 ]
4
4
  strings: [ one ]
5
- times: [<%= Time.now.at_beginning_of_month.to_s(:db)%>, <%= Time.now.at_beginning_of_day.to_s(:db) %>]
5
+ times: [2011-03-01, 2011-05-05]
6
6
  floats: [1.0, 2.3]
7
7
  decimals: [1.0, 2.3]
8
8
  second:
@@ -29,7 +29,7 @@ fourth:
29
29
  fifth:
30
30
  id: 5
31
31
  ints: [ 10 ]
32
- strings: [ "#{1+1}", "\\#{1+1}\"'\\z", "\t\n" ]
32
+ strings: [ "#{1+1}", "\\#{1+1}\"'\\z\x01", "\t\n" ]
33
33
  times: [ ]
34
34
  floats: [ ]
35
35
  decimals: [ ]
@@ -11,12 +11,12 @@ ActiveRecord::Schema.define do
11
11
  end
12
12
 
13
13
  create_table "bulks", :force => true do |t|
14
- t.string :value
14
+ t.string :value, :default => "'"
15
15
  t.integer_array :ints, :default => [1, 2]
16
16
  t.string_array :strings, :default => %w{as so}
17
17
  t.timestamp_array :times, :default => %w{2010-01-01 2010-02-01}
18
18
  t.float_array :floats, :default => [1.0, 1.2]
19
19
  t.decimal_array :decimals, :default => [1.0, 1.2]
20
- t.text_array :texts, :default => [nil, 'Text', 'NULL', 'Text with nil', 'Text with , nil, !', 'nil']
20
+ t.text_array :texts, :default => [nil, 'Text', 'NULL', 'Text with nil', 'Text with , nil, !"\\', 'nil']
21
21
  end
22
22
  end
@@ -67,7 +67,8 @@ describe "PgArray" do
67
67
  bulk = Bulk.find(1)
68
68
  bulk.ints.should == [ 1 ]
69
69
  bulk.strings.should == %w{one}
70
- bulk.times.should == [Time.now.at_beginning_of_month, Time.now.at_beginning_of_day]
70
+ map_times(bulk.times).should ==
71
+ map_times(parse_times(%w{2011-03-01 2011-05-05}))
71
72
  bulk.floats.should == [1.0, 2.3]
72
73
  bulk.decimals.should == [1.0, 2.3]
73
74
  end
@@ -78,7 +79,7 @@ describe "PgArray" do
78
79
  bulk.strings.should == %w{as so}
79
80
  bulk.floats.should == [1.0, 1.2]
80
81
  bulk.decimals.should == [1.0, 1.2]
81
- bulk.texts.should == [nil, 'Text', 'NULL', 'Text with nil', 'Text with , nil, !', 'nil']
82
+ bulk.texts.should == [nil, 'Text', 'NULL', 'Text with nil', 'Text with , nil, !"\\', 'nil']
82
83
  map_times(bulk.times).should ==
83
84
  map_times(parse_times(%w{2010-01-01 2010-02-01}))
84
85
  end
@@ -96,10 +97,19 @@ describe "PgArray" do
96
97
  bulk.decimals.should == [2.5, 2]
97
98
  map_times(bulk.times).should == map_times(parse_times(%w{2010-04-01 2010-03-01}))
98
99
  end
100
+
101
+ it "should save right text" do
102
+ bulk = Bulk.find(5)
103
+ bulk.texts = ['Text with , nil, !\x01\\\'"',"Text with , nil, !\x01\\\'\""]
104
+ bulk.save!
105
+ bulk.texts = []
106
+ bulk = Bulk.find(:first, :conditions=>'5 = id')
107
+ bulk.texts.should == ['Text with , nil, !\x01\\\'"',"Text with , nil, !\x01\\\'\""]
108
+ end
99
109
 
100
110
  it "should be safe for eval" do
101
111
  bulk = Bulk.find(5)
102
- bulk.strings.should == ['#{1+1}', '\\#{1+1}"\'\\z', "\t\n"]
112
+ bulk.strings.should == ["\#{1+1}", "\\\#{1+1}\"'\\z\x01", "\t\n"]
103
113
  #$stderr.puts ActiveRecord::ConnectionAdapters::PostgreSQLColumn::ESCAPE_ARRAY.inspect
104
114
  end
105
115
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar_pg_array
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.7
4
+ version: 0.9.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,19 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2010-09-10 00:00:00.000000000Z
12
+ date: 2011-12-04 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: activerecord
16
- requirement: &79833080 !ruby/object:Gem::Requirement
15
+ name: active_record
16
+ requirement: &83197980 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
+ - - <
20
+ - !ruby/object:Gem::Version
21
+ version: '3.1'
19
22
  - - ! '>='
20
23
  - !ruby/object:Gem::Version
21
- version: '0'
24
+ version: 2.3.5
22
25
  type: :runtime
23
26
  prerelease: false
24
- version_requirements: *79833080
27
+ version_requirements: *83197980
25
28
  description: ar_pg_array includes support of PostgreSQL's int[], float[], text[],
26
29
  timestamptz[] etc. into ActiveRecord. You could define migrations for array columns,
27
30
  query on array columns.
@@ -55,8 +58,7 @@ files:
55
58
  homepage: http://github.com/funny-falcon/activerecord-postgresql-arrays
56
59
  licenses: []
57
60
  post_install_message:
58
- rdoc_options:
59
- - --charset=UTF-8
61
+ rdoc_options: []
60
62
  require_paths:
61
63
  - lib
62
64
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -77,10 +79,4 @@ rubygems_version: 1.8.10
77
79
  signing_key:
78
80
  specification_version: 3
79
81
  summary: Use power of PostgreSQL Arrays in ActiveRecord
80
- test_files:
81
- - spec/fixtures/schema.rb
82
- - spec/fixtures/item.rb
83
- - spec/fixtures/bulk.rb
84
- - spec/fixtures/tag.rb
85
- - spec/pg_array_spec.rb
86
- - spec/spec_helper.rb
82
+ test_files: []