rpbertp13-dm-core 0.9.11.1 → 0.9.11.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,4 +1,4 @@
1
- === 0.9.11 / 2009-03-29
1
+ === 0.9.11 / not released
2
2
 
3
3
  * 1 major enhancement:
4
4
 
data/dm-core.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{dm-core}
5
- s.version = "0.9.11.1"
5
+ s.version = "0.9.11.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Dan Kubb"]
@@ -24,17 +24,17 @@ Gem::Specification.new do |s|
24
24
  s.specification_version = 2
25
25
 
26
26
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
- s.add_runtime_dependency(%q<data_objects>, ["~> 0.10.0"])
27
+ s.add_runtime_dependency(%q<data_objects>, ["~> 0.9.11"])
28
28
  s.add_runtime_dependency(%q<extlib>, ["~> 0.9.11"])
29
- s.add_runtime_dependency(%q<addressable>, ["~> 2.0"])
29
+ s.add_runtime_dependency(%q<addressable>, ["~> 2.0.2"])
30
30
  else
31
- s.add_dependency(%q<data_objects>, ["~> 0.10.0"])
31
+ s.add_dependency(%q<data_objects>, ["~> 0.9.11"])
32
32
  s.add_dependency(%q<extlib>, ["~> 0.9.11"])
33
- s.add_dependency(%q<addressable>, ["~> 2.0"])
33
+ s.add_dependency(%q<addressable>, ["~> 2.0.2"])
34
34
  end
35
35
  else
36
- s.add_dependency(%q<data_objects>, ["~> 0.10.0"])
36
+ s.add_dependency(%q<data_objects>, ["~> 0.9.11"])
37
37
  s.add_dependency(%q<extlib>, ["~> 0.9.11"])
38
- s.add_dependency(%q<addressable>, ["~> 2.0"])
38
+ s.add_dependency(%q<addressable>, ["~> 2.0.2"])
39
39
  end
40
40
  end
data/lib/dm-core.rb CHANGED
@@ -16,7 +16,7 @@ require 'set'
16
16
  require 'time'
17
17
  require 'yaml'
18
18
 
19
- gem 'addressable', '~>2.0'
19
+ gem 'addressable', '~>2.0.2'
20
20
  require 'addressable/uri'
21
21
 
22
22
  gem 'extlib', '~>0.9.11'
@@ -1,4 +1,4 @@
1
- gem 'data_objects', '~>0.10.0'
1
+ gem 'data_objects', '~>0.9.11'
2
2
  require 'data_objects'
3
3
 
4
4
  module DataMapper
@@ -615,7 +615,7 @@ module DataMapper
615
615
  tm.map(DM::Discriminator).to('VARCHAR').with(:size => Property::DEFAULT_LENGTH)
616
616
  tm.map(BigDecimal).to('DECIMAL').with(:precision => Property::DEFAULT_PRECISION, :scale => Property::DEFAULT_SCALE_BIGDECIMAL)
617
617
  tm.map(Float).to('FLOAT').with(:precision => Property::DEFAULT_PRECISION)
618
- tm.map(DateTime).to('TIMESTAMP')
618
+ tm.map(DateTime).to('DATETIME')
619
619
  tm.map(Date).to('DATE')
620
620
  tm.map(Time).to('TIMESTAMP')
621
621
  tm.map(TrueClass).to('BOOLEAN')
@@ -1,4 +1,4 @@
1
- gem 'do_mysql', '~>0.10.0'
1
+ gem 'do_mysql', '~>0.9.11'
2
2
  require 'do_mysql'
3
3
 
4
4
  module DataMapper
@@ -124,8 +124,6 @@ module DataMapper
124
124
  tm.map(Integer).to('INT').with(:size => 11)
125
125
  tm.map(TrueClass).to('TINYINT').with(:size => 1) # TODO: map this to a BIT or CHAR(0) field?
126
126
  tm.map(Object).to('TEXT')
127
- tm.map(DateTime).to('DATETIME')
128
- tm.map(Time).to('DATETIME')
129
127
  end
130
128
  end
131
129
  end # module ClassMethods
@@ -1,4 +1,4 @@
1
- gem 'do_postgres', '~>0.10.0'
1
+ gem 'do_postgres', '~>0.9.11'
2
2
  require 'do_postgres'
3
3
 
4
4
  module DataMapper
@@ -174,9 +174,9 @@ module DataMapper
174
174
  # TODO: move to dm-more/dm-migrations
175
175
  def type_map
176
176
  @type_map ||= TypeMap.new(super) do |tm|
177
- tm.map(Integer).to('INTEGER')
178
- tm.map(BigDecimal).to('NUMERIC').with(:precision => Property::DEFAULT_PRECISION, :scale => Property::DEFAULT_SCALE_BIGDECIMAL)
179
- tm.map(Float).to('DOUBLE PRECISION')
177
+ tm.map(DateTime).to('TIMESTAMP')
178
+ tm.map(Integer).to('INT4')
179
+ tm.map(Float).to('FLOAT8')
180
180
  end
181
181
  end
182
182
  end # module ClassMethods
@@ -1,4 +1,4 @@
1
- gem 'do_sqlite3', '~>0.10.0'
1
+ gem 'do_sqlite3', '~>0.9.11'
2
2
  require 'do_sqlite3'
3
3
 
4
4
  module DataMapper
@@ -8,47 +8,54 @@ module DataMapper
8
8
  # @api private
9
9
  attr_reader :name, :options, :query
10
10
 
11
+ # @api private
11
12
  def child_key
12
- child_key = child_model.repository.scope do |r|
13
- model_properties = child_model.properties(r.name)
14
-
15
- child_key = parent_key.zip(@child_properties).map do |parent_property,property_name|
16
- # TODO: use something similar to DM::NamingConventions to determine the property name
17
- parent_name = Extlib::Inflection.underscore(Extlib::Inflection.demodulize(parent_model.base_model.name))
18
- property_name ||= "#{parent_name}_#{parent_property.name}".to_sym
19
-
20
- if model_properties.has_property?(property_name)
21
- model_properties[property_name]
22
- else
23
- options = {}
24
-
25
- [ :length, :precision, :scale ].each do |option|
26
- options[option] = parent_property.send(option)
13
+ @child_key ||= begin
14
+ child_key = nil
15
+ child_model.repository.scope do |r|
16
+ model_properties = child_model.properties(r.name)
17
+
18
+ child_key = parent_key.zip(@child_properties || []).map do |parent_property,property_name|
19
+ # TODO: use something similar to DM::NamingConventions to determine the property name
20
+ parent_name = Extlib::Inflection.underscore(Extlib::Inflection.demodulize(parent_model.base_model.name))
21
+ property_name ||= "#{parent_name}_#{parent_property.name}".to_sym
22
+
23
+ if model_properties.has_property?(property_name)
24
+ model_properties[property_name]
25
+ else
26
+ options = {}
27
+
28
+ [ :length, :precision, :scale ].each do |option|
29
+ options[option] = parent_property.send(option)
30
+ end
31
+
32
+ # NOTE: hack to make each many to many child_key a true key,
33
+ # until I can figure out a better place for this check
34
+ if child_model.respond_to?(:many_to_many)
35
+ options[:key] = true
36
+ end
37
+
38
+ child_model.property(property_name, parent_property.primitive, options)
27
39
  end
28
-
29
- # NOTE: hack to make each many to many child_key a true key,
30
- # until I can figure out a better place for this check
31
- if child_model.respond_to?(:many_to_many)
32
- options[:key] = true
33
- end
34
-
35
- child_model.property(property_name, parent_property.primitive, options)
36
40
  end
37
41
  end
42
+ PropertySet.new(child_key)
38
43
  end
39
- @child_key = PropertySet.new(child_key)
40
44
  end
41
45
 
42
46
  # @api private
43
47
  def parent_key
44
- parent_key = parent_model.repository.scope do |r|
45
- if @parent_properties
46
- parent_model.properties(r.name).slice(*@parent_properties)
47
- else
48
- parent_model.key
48
+ @parent_key ||= begin
49
+ parent_key = nil
50
+ parent_model.repository.scope do |r|
51
+ parent_key = if @parent_properties
52
+ parent_model.properties(r.name).slice(*@parent_properties)
53
+ else
54
+ parent_model.key
55
+ end
49
56
  end
57
+ PropertySet.new(parent_key)
50
58
  end
51
- @parent_key = PropertySet.new(parent_key)
52
59
  end
53
60
 
54
61
  # @api private
@@ -87,7 +94,7 @@ module DataMapper
87
94
  grouped_collection = {}
88
95
  collection.each do |resource|
89
96
  child_value = child_key.get(resource)
90
- next unless parent_obj = parent_identity_map[child_value]
97
+ parent_obj = parent_identity_map[child_value]
91
98
  grouped_collection[parent_obj] ||= []
92
99
  grouped_collection[parent_obj] << resource
93
100
  end
@@ -97,6 +97,7 @@ module DataMapper
97
97
  end
98
98
  else
99
99
  raise "Illegal state for commit without block: #{@state}" unless @state == :begin
100
+ each_adapter(:prepare_adapter, [:rollback_and_close_adapter_if_begin, :rollback_prepared_and_close_adapter_if_prepare])
100
101
  each_adapter(:commit_adapter, [:log_fatal_transaction_breakage])
101
102
  each_adapter(:close_adapter, [:log_fatal_transaction_breakage])
102
103
  @state = :commit
@@ -111,6 +112,7 @@ module DataMapper
111
112
  def rollback
112
113
  raise "Illegal state for rollback: #{@state}" unless @state == :begin
113
114
  each_adapter(:rollback_adapter_if_begin, [:rollback_and_close_adapter_if_begin, :close_adapter_if_none])
115
+ each_adapter(:rollback_prepared_adapter_if_prepare, [:rollback_prepared_and_close_adapter_if_begin, :close_adapter_if_none])
114
116
  each_adapter(:close_adapter_if_open, [:log_fatal_transaction_breakage])
115
117
  @state = :rollback
116
118
  end
@@ -143,13 +145,13 @@ module DataMapper
143
145
 
144
146
  def method_missing(meth, *args, &block)
145
147
  if args.size == 1 && args.first.is_a?(DataMapper::Adapters::AbstractAdapter)
146
- if (match = meth.to_s.match(/^(.*)_if_(none|begin|rollback|commit)$/))
148
+ if (match = meth.to_s.match(/^(.*)_if_(none|begin|prepare|rollback|commit)$/))
147
149
  if self.respond_to?(match[1], true)
148
150
  self.send(match[1], args.first) if state_for(args.first).to_s == match[2]
149
151
  else
150
152
  super
151
153
  end
152
- elsif (match = meth.to_s.match(/^(.*)_unless_(none|begin|rollback|commit)$/))
154
+ elsif (match = meth.to_s.match(/^(.*)_unless_(none|begin|prepare|rollback|commit)$/))
153
155
  if self.respond_to?(match[1], true)
154
156
  self.send(match[1], args.first) unless state_for(args.first).to_s == match[2]
155
157
  else
@@ -172,7 +174,7 @@ module DataMapper
172
174
  private
173
175
 
174
176
  def validate_primitive(primitive)
175
- [:close, :begin, :rollback, :commit].each do |meth|
177
+ [:close, :begin, :prepare, :rollback, :rollback_prepared, :commit].each do |meth|
176
178
  raise "Invalid primitive #{primitive}: doesnt respond_to?(#{meth.inspect})" unless primitive.respond_to?(meth)
177
179
  end
178
180
  return primitive
@@ -235,14 +237,27 @@ module DataMapper
235
237
  do_adapter(adapter, :begin, :none)
236
238
  end
237
239
 
240
+ def prepare_adapter(adapter)
241
+ do_adapter(adapter, :prepare, :begin);
242
+ end
243
+
238
244
  def commit_adapter(adapter)
239
- do_adapter(adapter, :commit, :begin)
245
+ do_adapter(adapter, :commit, :prepare)
240
246
  end
241
247
 
242
248
  def rollback_adapter(adapter)
243
249
  do_adapter(adapter, :rollback, :begin)
244
250
  end
245
251
 
252
+ def rollback_prepared_adapter(adapter)
253
+ do_adapter(adapter, :rollback_prepared, :prepare)
254
+ end
255
+
256
+ def rollback_prepared_and_close_adapter(adapter)
257
+ rollback_prepared_adapter(adapter)
258
+ close_adapter(adapter)
259
+ end
260
+
246
261
  def rollback_and_close_adapter(adapter)
247
262
  rollback_adapter(adapter)
248
263
  close_adapter(adapter)
@@ -1,3 +1,3 @@
1
1
  module DataMapper
2
- VERSION = '0.9.12'.freeze
2
+ VERSION = '0.9.11'.freeze
3
3
  end
@@ -105,7 +105,7 @@ if HAS_SQLITE3
105
105
  # :class => [ Class, 'VARCHAR(50)', false, 'Class', 'Class', false ],
106
106
  :big_decimal => [ BigDecimal, 'DECIMAL(2,1)', false, '1.1', BigDecimal('1.1'), false ],
107
107
  :float => [ Float, 'FLOAT(2,1)', false, '1.1', 1.1, false ],
108
- :date_time => [ DateTime, 'TIMESTAMP', false, NOW.strftime('%Y-%m-%d %H:%M:%S'), NOW, false ],
108
+ :date_time => [ DateTime, 'DATETIME', false, NOW.strftime('%Y-%m-%d %H:%M:%S'), NOW, false ],
109
109
  :time_1 => [ Time, 'TIMESTAMP', false, TIME_STRING_1, TIME_1, false ],
110
110
  #SQLite pads out the microseconds to the full 6 digits no matter what the value is - we simply pad up the zeros needed
111
111
  :time_2 => [ Time, 'TIMESTAMP', false, TIME_STRING_2.dup << '00000', TIME_2, false ],
@@ -219,10 +219,10 @@ if HAS_MYSQL
219
219
  :big_decimal => [ BigDecimal, 'DECIMAL(2,1)', false, '1.1', BigDecimal('1.1'), false ],
220
220
  :float => [ Float, 'FLOAT(2,1)', false, '1.1', 1.1, false ],
221
221
  :date_time => [ DateTime, 'DATETIME', false, NOW.strftime('%Y-%m-%d %H:%M:%S'), NOW, false ],
222
- :time_1 => [ Time, 'DATETIME', false, TIME_1.strftime('%Y-%m-%d %H:%M:%S'), TIME_1, false ],
223
- :time_2 => [ Time, 'DATETIME', false, TIME_2.strftime('%Y-%m-%d %H:%M:%S'), TIME_2, false ],
224
- :time_3 => [ Time, 'DATETIME', false, TIME_3.strftime('%Y-%m-%d %H:%M:%S'), TIME_3 , false ],
225
- :time_4 => [ Time, 'DATETIME', false, TIME_4.strftime('%Y-%m-%d %H:%M:%S'), TIME_4 , false ],
222
+ :time_1 => [ Time, 'TIMESTAMP', false, TIME_1.strftime('%Y-%m-%d %H:%M:%S'), TIME_1, false ],
223
+ :time_2 => [ Time, 'TIMESTAMP', false, TIME_2.strftime('%Y-%m-%d %H:%M:%S'), TIME_2, false ],
224
+ :time_3 => [ Time, 'TIMESTAMP', false, TIME_3.strftime('%Y-%m-%d %H:%M:%S'), TIME_3 , false ],
225
+ :time_4 => [ Time, 'TIMESTAMP', false, TIME_4.strftime('%Y-%m-%d %H:%M:%S'), TIME_4 , false ],
226
226
  :object => [ Object, 'TEXT', true, nil, nil, false ],
227
227
  :discriminator => [ DM::Discriminator, 'VARCHAR(50)', false, nil, EveryType, false ],
228
228
  }
@@ -56,5 +56,20 @@ if ADAPTERS.any?
56
56
  end
57
57
  end
58
58
 
59
+ it "should not commit any changes if any of the adapters doesnt prepare properly" do
60
+ lambda do
61
+ DataMapper::Transaction.new(*@repositories) do |transaction|
62
+ ADAPTERS.each do |name|
63
+ repository(name) { Sputnik.create(:name => 'hepp') }
64
+ end
65
+
66
+ transaction.primitive_for(@repositories.last.adapter).should_receive(:prepare).and_throw(Exception.new("I am the famous test exception"))
67
+ end
68
+ end.should raise_error(Exception, /I am the famous test exception/)
69
+
70
+ ADAPTERS.each do |name|
71
+ repository(name) { Sputnik.all.size.should == 0 }
72
+ end
73
+ end
59
74
  end
60
75
  end
@@ -30,11 +30,15 @@ describe DataMapper::Transaction do
30
30
  @repository_adapter.should_receive(:transaction_primitive).any_number_of_times.and_return(@repository_transaction_primitive)
31
31
  @transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:close).and_return(true)
32
32
  @transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:begin).and_return(true)
33
+ @transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:prepare).and_return(true)
33
34
  @transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:rollback).and_return(true)
35
+ @transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:rollback_prepared).and_return(true)
34
36
  @transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:commit).and_return(true)
35
37
  @repository_transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:close).and_return(true)
36
38
  @repository_transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:begin).and_return(true)
39
+ @repository_transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:prepare).and_return(true)
37
40
  @repository_transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:rollback).and_return(true)
41
+ @repository_transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:rollback_prepared).and_return(true)
38
42
  @repository_transaction_primitive.should_receive(:respond_to?).any_number_of_times.with(:commit).and_return(true)
39
43
  end
40
44
 
@@ -135,6 +139,7 @@ describe DataMapper::Transaction do
135
139
  @transaction.should_receive(:each_adapter).with(:begin_adapter, [:rollback_and_close_adapter_if_begin, :close_adapter_if_none])
136
140
  @transaction.should_receive(:each_adapter).with(:rollback_adapter_if_begin, [:rollback_and_close_adapter_if_begin, :close_adapter_if_none])
137
141
  @transaction.should_receive(:each_adapter).with(:close_adapter_if_open, [:log_fatal_transaction_breakage])
142
+ @transaction.should_receive(:each_adapter).with(:rollback_prepared_adapter_if_prepare, [:rollback_prepared_and_close_adapter_if_begin, :close_adapter_if_none])
138
143
  @transaction.begin
139
144
  @transaction.rollback
140
145
  end
@@ -185,6 +190,7 @@ describe DataMapper::Transaction do
185
190
  it "should try to prepare each adapter (or rollback and close), then commit each adapter (or log fatal error), then close (or log fatal error)" do
186
191
  @transaction.should_receive(:each_adapter).with(:connect_adapter, [:log_fatal_transaction_breakage])
187
192
  @transaction.should_receive(:each_adapter).with(:begin_adapter, [:rollback_and_close_adapter_if_begin, :close_adapter_if_none])
193
+ @transaction.should_receive(:each_adapter).with(:prepare_adapter, [:rollback_and_close_adapter_if_begin, :rollback_prepared_and_close_adapter_if_prepare])
188
194
  @transaction.should_receive(:each_adapter).with(:commit_adapter, [:log_fatal_transaction_breakage])
189
195
  @transaction.should_receive(:each_adapter).with(:close_adapter, [:log_fatal_transaction_breakage])
190
196
  @transaction.begin
@@ -216,9 +222,11 @@ describe DataMapper::Transaction do
216
222
  end
217
223
  it "should begin, yield and commit if the block raises no exception" do
218
224
  @repository_transaction_primitive.should_receive(:begin)
225
+ @repository_transaction_primitive.should_receive(:prepare)
219
226
  @repository_transaction_primitive.should_receive(:commit)
220
227
  @repository_transaction_primitive.should_receive(:close)
221
228
  @transaction_primitive.should_receive(:begin)
229
+ @transaction_primitive.should_receive(:prepare)
222
230
  @transaction_primitive.should_receive(:commit)
223
231
  @transaction_primitive.should_receive(:close)
224
232
  p = Proc.new do end
@@ -449,9 +457,14 @@ describe DataMapper::Transaction do
449
457
  @transaction.should_receive(:do_adapter).with(@other_adapter, :begin, :none)
450
458
  @transaction.instance_eval do begin_adapter(a1) end
451
459
  end
452
- it "should only allow adapters in state :begin to commit" do
460
+ it "should only allow adapters in state :begin to prepare" do
453
461
  a1 = @other_adapter
454
- @transaction.should_receive(:do_adapter).with(@other_adapter, :commit, :begin)
462
+ @transaction.should_receive(:do_adapter).with(@other_adapter, :prepare, :begin)
463
+ @transaction.instance_eval do prepare_adapter(a1) end
464
+ end
465
+ it "should only allow adapters in state :prepare to commit" do
466
+ a1 = @other_adapter
467
+ @transaction.should_receive(:do_adapter).with(@other_adapter, :commit, :prepare)
455
468
  @transaction.instance_eval do commit_adapter(a1) end
456
469
  end
457
470
  it "should only allow adapters in state :begin to rollback" do
@@ -459,11 +472,22 @@ describe DataMapper::Transaction do
459
472
  @transaction.should_receive(:do_adapter).with(@other_adapter, :rollback, :begin)
460
473
  @transaction.instance_eval do rollback_adapter(a1) end
461
474
  end
475
+ it "should only allow adapters in state :prepare to rollback_prepared" do
476
+ a1 = @other_adapter
477
+ @transaction.should_receive(:do_adapter).with(@other_adapter, :rollback_prepared, :prepare)
478
+ @transaction.instance_eval do rollback_prepared_adapter(a1) end
479
+ end
462
480
  it "should do delegate properly for rollback_and_close" do
463
481
  a1 = @other_adapter
464
482
  @transaction.should_receive(:rollback_adapter).with(@other_adapter)
465
483
  @transaction.should_receive(:close_adapter).with(@other_adapter)
466
484
  @transaction.instance_eval do rollback_and_close_adapter(a1) end
467
485
  end
486
+ it "should do delegate properly for rollback_prepared_and_close" do
487
+ a1 = @other_adapter
488
+ @transaction.should_receive(:rollback_prepared_adapter).with(@other_adapter)
489
+ @transaction.should_receive(:close_adapter).with(@other_adapter)
490
+ @transaction.instance_eval do rollback_prepared_and_close_adapter(a1) end
491
+ end
468
492
  end
469
493
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rpbertp13-dm-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.11.1
4
+ version: 0.9.11.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Kubb
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ~>
22
22
  - !ruby/object:Gem::Version
23
- version: 0.10.0
23
+ version: 0.9.11
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: extlib
@@ -40,7 +40,7 @@ dependencies:
40
40
  requirements:
41
41
  - - ~>
42
42
  - !ruby/object:Gem::Version
43
- version: "2.0"
43
+ version: 2.0.2
44
44
  version:
45
45
  description: Faster, Better, Simpler.
46
46
  email: