activerecord-simpledb-adapter 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +1 -0
- data/Gemfile.lock +40 -38
- data/activerecord-simpledb-adapter.gemspec +23 -11
- data/lib/active_record/connection_adapters/simpledb_adapter.rb +8 -466
- data/lib/active_record/connection_adapters/simpledb_adapter/adapter.rb +258 -0
- data/lib/active_record/connection_adapters/simpledb_adapter/base.rb +65 -0
- data/lib/active_record/connection_adapters/simpledb_adapter/column.rb +62 -0
- data/lib/active_record/connection_adapters/simpledb_adapter/finder_methods.rb +20 -0
- data/lib/active_record/connection_adapters/simpledb_adapter/misc/aws_overrides.rb +53 -0
- data/lib/active_record/connection_adapters/simpledb_adapter/misc/simpledb_logger.rb +15 -0
- data/lib/active_record/connection_adapters/simpledb_adapter/table_definition.rb +32 -0
- data/lib/active_record/connection_adapters/simpledb_adapter/validations.rb +50 -0
- data/spec/active_record/batch_spec.rb +67 -0
- data/spec/spec_helper.rb +8 -1
- metadata +67 -43
@@ -0,0 +1,32 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
class SimpleDbTableDifinition < TableDefinition
|
4
|
+
|
5
|
+
attr_reader :collection_column_name
|
6
|
+
|
7
|
+
def initialize collection_column_name
|
8
|
+
super nil
|
9
|
+
@collection_column_name = collection_column_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def xml_column_fallback(*args)
|
13
|
+
raise ConfigurationError, "Not supported"
|
14
|
+
end
|
15
|
+
|
16
|
+
def [](name)
|
17
|
+
@columns.find {|column| column.db_column_name == name.to_s}
|
18
|
+
end
|
19
|
+
|
20
|
+
def column(name, type, options = {})
|
21
|
+
raise ConfigurationError, %Q(column '#{collection_column_name}' reserved, please change column name) if name.to_s == collection_column_name
|
22
|
+
@columns << SimpleDBColumn.new(name.to_s, type.to_sym, options[:limit], options[:precision], options[:to], options[:default])
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def columns_with_defaults
|
27
|
+
@columns_with_defaults ||= @columns.select { |column| column.default.present? }
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module Validations
|
3
|
+
class UniquenessValidator < ActiveModel::EachValidator
|
4
|
+
|
5
|
+
def validate_each(record, attribute, value)
|
6
|
+
finder_class = find_finder_class_for(record)
|
7
|
+
table = finder_class.unscoped
|
8
|
+
|
9
|
+
table_name = record.class.quoted_table_name
|
10
|
+
|
11
|
+
if value && record.class.serialized_attributes.key?(attribute.to_s)
|
12
|
+
value = YAML.dump value
|
13
|
+
end
|
14
|
+
|
15
|
+
sql, params = mount_sql_and_params(finder_class, table_name, attribute, value)
|
16
|
+
|
17
|
+
relation = table.where(sql, *params)
|
18
|
+
|
19
|
+
Array.wrap(options[:scope]).each do |scope_item|
|
20
|
+
scope_value = record.send(scope_item)
|
21
|
+
relation = relation.where(scope_item => scope_value)
|
22
|
+
end
|
23
|
+
|
24
|
+
if record.persisted?
|
25
|
+
# TODO : This should be in Arel
|
26
|
+
relation = relation.where("#{record.class.primary_key} != ?", record.send(:id))
|
27
|
+
end
|
28
|
+
|
29
|
+
if relation.exists?
|
30
|
+
record.errors.add(attribute, :taken, options.except(:case_sensitive, :scope).merge(:value => value))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
def mount_sql_and_params(klass, table_name, attribute, value) #:nodoc:
|
36
|
+
column = klass.columns_hash[attribute.to_s]
|
37
|
+
|
38
|
+
sql_attribute = "#{klass.connection.quote_column_name(column.db_column_name)}"
|
39
|
+
sql = "#{sql_attribute} = ?"
|
40
|
+
if value.nil?
|
41
|
+
[sql, [value]]
|
42
|
+
elsif (options[:case_sensitive] || !column.text?)
|
43
|
+
[sql, [value]]
|
44
|
+
else
|
45
|
+
[sql, [value.downcase]]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
#spec helpers difition
|
3
|
+
class F < ActiveRecord::Base
|
4
|
+
columns_definition do |t|
|
5
|
+
t.string :body
|
6
|
+
end
|
7
|
+
|
8
|
+
has_many :bs
|
9
|
+
after_save lambda { self.bs.create!({:body => "test"}) }
|
10
|
+
end
|
11
|
+
class B < ActiveRecord::Base
|
12
|
+
columns_definition do |t|
|
13
|
+
t.string :body
|
14
|
+
t.string :f_id
|
15
|
+
end
|
16
|
+
end
|
17
|
+
#testes
|
18
|
+
describe "SimpleDBAdapter ActiveRecord batches operation" do
|
19
|
+
|
20
|
+
before :each do
|
21
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
22
|
+
ActiveRecord::Base.establish_connection($config)
|
23
|
+
ActiveRecord::Base.connection.create_domain($config[:domain_name])
|
24
|
+
end
|
25
|
+
|
26
|
+
after :each do
|
27
|
+
ActiveRecord::Base.connection.delete_domain($config[:domain_name])
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should work with usual create statments" do
|
31
|
+
count = 5
|
32
|
+
Person.batch do
|
33
|
+
count.times { |i| Person.create_valid }
|
34
|
+
Person.count.should == 0
|
35
|
+
end
|
36
|
+
items = Person.all
|
37
|
+
items.count.should == count
|
38
|
+
items.each { |item| item.is_valid? }
|
39
|
+
end
|
40
|
+
|
41
|
+
#this test doesn't work with fakesdb
|
42
|
+
it "should work with usual destroy statments" do
|
43
|
+
count = 5
|
44
|
+
items = []
|
45
|
+
count.times { items << Person.create_valid }
|
46
|
+
Person.batch(:delete) do
|
47
|
+
items.each {|item| item.destroy }
|
48
|
+
end
|
49
|
+
Person.count.should == 0
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should auto split to several batches when count of items more than BATCH_MAX_ITEM_COUNT" do
|
53
|
+
count = 35
|
54
|
+
Person.batch do
|
55
|
+
count.times { |i| Person.create_valid }
|
56
|
+
end
|
57
|
+
Person.count.should == count
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should batch internal operations too (sub-updates)" do
|
61
|
+
count = 5
|
62
|
+
F.batch do
|
63
|
+
count.times { F.create!({:body => "body"}) }
|
64
|
+
end
|
65
|
+
[F, B].each {|r| r.count.should == count }
|
66
|
+
end
|
67
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -12,6 +12,7 @@ rescue Bundler::GemNotFound => e
|
|
12
12
|
end if File.exist?(gemfile)
|
13
13
|
|
14
14
|
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
15
|
+
require 'ap'
|
15
16
|
require 'rspec'
|
16
17
|
require 'aws'
|
17
18
|
require 'active_record'
|
@@ -54,6 +55,12 @@ class Person < ActiveRecord::Base
|
|
54
55
|
:state => 'paid'
|
55
56
|
}
|
56
57
|
end
|
57
|
-
end
|
58
58
|
|
59
|
+
def self.create_valid
|
60
|
+
create! valid_params
|
61
|
+
end
|
59
62
|
|
63
|
+
def is_valid?
|
64
|
+
Person.valid_params.all? {|key, value| self.try(key) == value}
|
65
|
+
end
|
66
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-simpledb-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ilia Ablamonov
|
@@ -17,11 +17,25 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2011-
|
20
|
+
date: 2011-04-21 00:00:00 +04:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
24
24
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
requirement: *id001
|
34
|
+
prerelease: false
|
35
|
+
type: :development
|
36
|
+
name: awesome_print
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
25
39
|
none: false
|
26
40
|
requirements:
|
27
41
|
- - ~>
|
@@ -32,12 +46,12 @@ dependencies:
|
|
32
46
|
- 3
|
33
47
|
- 0
|
34
48
|
version: 2.3.0
|
35
|
-
requirement: *
|
49
|
+
requirement: *id002
|
36
50
|
prerelease: false
|
37
51
|
type: :development
|
38
52
|
name: rspec
|
39
53
|
- !ruby/object:Gem::Dependency
|
40
|
-
version_requirements: &
|
54
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
41
55
|
none: false
|
42
56
|
requirements:
|
43
57
|
- - ~>
|
@@ -48,12 +62,12 @@ dependencies:
|
|
48
62
|
- 0
|
49
63
|
- 0
|
50
64
|
version: 1.0.0
|
51
|
-
requirement: *
|
65
|
+
requirement: *id003
|
52
66
|
prerelease: false
|
53
67
|
type: :development
|
54
68
|
name: bundler
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
version_requirements: &
|
70
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
57
71
|
none: false
|
58
72
|
requirements:
|
59
73
|
- - ~>
|
@@ -64,12 +78,12 @@ dependencies:
|
|
64
78
|
- 5
|
65
79
|
- 2
|
66
80
|
version: 1.5.2
|
67
|
-
requirement: *
|
81
|
+
requirement: *id004
|
68
82
|
prerelease: false
|
69
83
|
type: :development
|
70
84
|
name: jeweler
|
71
85
|
- !ruby/object:Gem::Dependency
|
72
|
-
version_requirements: &
|
86
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
73
87
|
none: false
|
74
88
|
requirements:
|
75
89
|
- - ">="
|
@@ -78,12 +92,12 @@ dependencies:
|
|
78
92
|
segments:
|
79
93
|
- 0
|
80
94
|
version: "0"
|
81
|
-
requirement: *
|
95
|
+
requirement: *id005
|
82
96
|
prerelease: false
|
83
97
|
type: :development
|
84
98
|
name: rcov
|
85
99
|
- !ruby/object:Gem::Dependency
|
86
|
-
version_requirements: &
|
100
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
87
101
|
none: false
|
88
102
|
requirements:
|
89
103
|
- - ">="
|
@@ -92,12 +106,12 @@ dependencies:
|
|
92
106
|
segments:
|
93
107
|
- 0
|
94
108
|
version: "0"
|
95
|
-
requirement: *
|
109
|
+
requirement: *id006
|
96
110
|
prerelease: false
|
97
111
|
type: :development
|
98
112
|
name: aws
|
99
113
|
- !ruby/object:Gem::Dependency
|
100
|
-
version_requirements: &
|
114
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
101
115
|
none: false
|
102
116
|
requirements:
|
103
117
|
- - ">="
|
@@ -106,12 +120,12 @@ dependencies:
|
|
106
120
|
segments:
|
107
121
|
- 0
|
108
122
|
version: "0"
|
109
|
-
requirement: *
|
123
|
+
requirement: *id007
|
110
124
|
prerelease: false
|
111
125
|
type: :development
|
112
126
|
name: activerecord
|
113
127
|
- !ruby/object:Gem::Dependency
|
114
|
-
version_requirements: &
|
128
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
115
129
|
none: false
|
116
130
|
requirements:
|
117
131
|
- - ">="
|
@@ -120,12 +134,12 @@ dependencies:
|
|
120
134
|
segments:
|
121
135
|
- 0
|
122
136
|
version: "0"
|
123
|
-
requirement: *
|
137
|
+
requirement: *id008
|
124
138
|
prerelease: false
|
125
139
|
type: :development
|
126
140
|
name: activesupport
|
127
141
|
- !ruby/object:Gem::Dependency
|
128
|
-
version_requirements: &
|
142
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
129
143
|
none: false
|
130
144
|
requirements:
|
131
145
|
- - "="
|
@@ -138,12 +152,12 @@ dependencies:
|
|
138
152
|
- prerails3
|
139
153
|
- 2
|
140
154
|
version: 0.2.0.prerails3.2
|
141
|
-
requirement: *
|
155
|
+
requirement: *id009
|
142
156
|
prerelease: false
|
143
157
|
type: :development
|
144
158
|
name: genspec
|
145
159
|
- !ruby/object:Gem::Dependency
|
146
|
-
version_requirements: &
|
160
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
147
161
|
none: false
|
148
162
|
requirements:
|
149
163
|
- - ">="
|
@@ -152,12 +166,12 @@ dependencies:
|
|
152
166
|
segments:
|
153
167
|
- 0
|
154
168
|
version: "0"
|
155
|
-
requirement: *
|
169
|
+
requirement: *id010
|
156
170
|
prerelease: false
|
157
171
|
type: :development
|
158
172
|
name: thor
|
159
173
|
- !ruby/object:Gem::Dependency
|
160
|
-
version_requirements: &
|
174
|
+
version_requirements: &id011 !ruby/object:Gem::Requirement
|
161
175
|
none: false
|
162
176
|
requirements:
|
163
177
|
- - ">="
|
@@ -166,12 +180,12 @@ dependencies:
|
|
166
180
|
segments:
|
167
181
|
- 0
|
168
182
|
version: "0"
|
169
|
-
requirement: *
|
183
|
+
requirement: *id011
|
170
184
|
prerelease: false
|
171
185
|
type: :development
|
172
186
|
name: rails
|
173
187
|
- !ruby/object:Gem::Dependency
|
174
|
-
version_requirements: &
|
188
|
+
version_requirements: &id012 !ruby/object:Gem::Requirement
|
175
189
|
none: false
|
176
190
|
requirements:
|
177
191
|
- - ~>
|
@@ -182,44 +196,44 @@ dependencies:
|
|
182
196
|
- 3
|
183
197
|
- 0
|
184
198
|
version: 2.3.0
|
185
|
-
requirement: *
|
199
|
+
requirement: *id012
|
186
200
|
prerelease: false
|
187
201
|
type: :runtime
|
188
202
|
name: aws
|
189
203
|
- !ruby/object:Gem::Dependency
|
190
|
-
version_requirements: &
|
204
|
+
version_requirements: &id013 !ruby/object:Gem::Requirement
|
191
205
|
none: false
|
192
206
|
requirements:
|
193
207
|
- - ~>
|
194
208
|
- !ruby/object:Gem::Version
|
195
|
-
hash:
|
209
|
+
hash: 9
|
196
210
|
segments:
|
197
211
|
- 3
|
198
212
|
- 0
|
199
|
-
-
|
200
|
-
version: 3.0.
|
201
|
-
requirement: *
|
213
|
+
- 7
|
214
|
+
version: 3.0.7
|
215
|
+
requirement: *id013
|
202
216
|
prerelease: false
|
203
217
|
type: :runtime
|
204
218
|
name: activerecord
|
205
219
|
- !ruby/object:Gem::Dependency
|
206
|
-
version_requirements: &
|
220
|
+
version_requirements: &id014 !ruby/object:Gem::Requirement
|
207
221
|
none: false
|
208
222
|
requirements:
|
209
223
|
- - ~>
|
210
224
|
- !ruby/object:Gem::Version
|
211
|
-
hash:
|
225
|
+
hash: 9
|
212
226
|
segments:
|
213
227
|
- 3
|
214
228
|
- 0
|
215
|
-
-
|
216
|
-
version: 3.0.
|
217
|
-
requirement: *
|
229
|
+
- 7
|
230
|
+
version: 3.0.7
|
231
|
+
requirement: *id014
|
218
232
|
prerelease: false
|
219
233
|
type: :runtime
|
220
234
|
name: activesupport
|
221
235
|
- !ruby/object:Gem::Dependency
|
222
|
-
version_requirements: &
|
236
|
+
version_requirements: &id015 !ruby/object:Gem::Requirement
|
223
237
|
none: false
|
224
238
|
requirements:
|
225
239
|
- - ~>
|
@@ -230,23 +244,23 @@ dependencies:
|
|
230
244
|
- 1
|
231
245
|
- 1
|
232
246
|
version: 2.1.1
|
233
|
-
requirement: *
|
247
|
+
requirement: *id015
|
234
248
|
prerelease: false
|
235
249
|
type: :runtime
|
236
250
|
name: uuidtools
|
237
251
|
- !ruby/object:Gem::Dependency
|
238
|
-
version_requirements: &
|
252
|
+
version_requirements: &id016 !ruby/object:Gem::Requirement
|
239
253
|
none: false
|
240
254
|
requirements:
|
241
255
|
- - ~>
|
242
256
|
- !ruby/object:Gem::Version
|
243
|
-
hash:
|
257
|
+
hash: 9
|
244
258
|
segments:
|
245
259
|
- 3
|
246
260
|
- 0
|
247
|
-
-
|
248
|
-
version: 3.0.
|
249
|
-
requirement: *
|
261
|
+
- 7
|
262
|
+
version: 3.0.7
|
263
|
+
requirement: *id016
|
250
264
|
prerelease: false
|
251
265
|
type: :runtime
|
252
266
|
name: rails
|
@@ -266,11 +280,20 @@ files:
|
|
266
280
|
- README.md
|
267
281
|
- activerecord-simpledb-adapter.gemspec
|
268
282
|
- lib/active_record/connection_adapters/simpledb_adapter.rb
|
283
|
+
- lib/active_record/connection_adapters/simpledb_adapter/adapter.rb
|
284
|
+
- lib/active_record/connection_adapters/simpledb_adapter/base.rb
|
285
|
+
- lib/active_record/connection_adapters/simpledb_adapter/column.rb
|
286
|
+
- lib/active_record/connection_adapters/simpledb_adapter/finder_methods.rb
|
287
|
+
- lib/active_record/connection_adapters/simpledb_adapter/misc/aws_overrides.rb
|
288
|
+
- lib/active_record/connection_adapters/simpledb_adapter/misc/simpledb_logger.rb
|
289
|
+
- lib/active_record/connection_adapters/simpledb_adapter/table_definition.rb
|
290
|
+
- lib/active_record/connection_adapters/simpledb_adapter/validations.rb
|
269
291
|
- lib/activerecord-simpledb-adapter.rb
|
270
292
|
- lib/arel/visitors/simpledb.rb
|
271
293
|
- lib/generators/active_record/model/model_generator.rb
|
272
294
|
- lib/generators/active_record/model/templates/model.rb
|
273
295
|
- lib/tasks/simpledb.rake
|
296
|
+
- spec/active_record/batch_spec.rb
|
274
297
|
- spec/active_record/connection_adapters/simpledb_adapter_spec.rb
|
275
298
|
- spec/active_record/core_actions_spec.rb
|
276
299
|
- spec/active_record/defaults_spec.rb
|
@@ -317,6 +340,7 @@ signing_key:
|
|
317
340
|
specification_version: 3
|
318
341
|
summary: ActiveRecord SimpleDB adapter
|
319
342
|
test_files:
|
343
|
+
- spec/active_record/batch_spec.rb
|
320
344
|
- spec/active_record/connection_adapters/simpledb_adapter_spec.rb
|
321
345
|
- spec/active_record/core_actions_spec.rb
|
322
346
|
- spec/active_record/defaults_spec.rb
|