xamplr 1.9.12 → 1.9.13

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 1
3
3
  :minor: 9
4
- :patch: 12
4
+ :patch: 13
5
5
  :build:
data/lib/Makefile ADDED
@@ -0,0 +1,7 @@
1
+
2
+
3
+ ccm:
4
+ rm -rf ccm
5
+ mkdir ccm
6
+ #saikuro -c -w 8 -e 13 -o ccm/ -p ./admin/admin.rb -p ./admin/helpers/admin_ui_helper.rb
7
+ saikuro -c -w 8 -e 13 -o ccm/ -p ./xampl.rb -p ./xamplr/exceptions.rb -p ./xamplr/from-xml.rb -p ./xamplr/indexed-array.rb -p ./xamplr/iterator.rb -p ./xamplr/mixins.rb -p ./xamplr/notifications.rb -p ./xamplr/persist-to-xml.rb -p ./xamplr/persistence.rb -p ./xamplr/persister.rb -p ./xamplr/persisters/caches.rb -p ./xamplr/persisters/caching.rb -p ./xamplr/persisters/dumb.rb -p ./xamplr/persisters/filesystem.rb -p ./xamplr/persisters/in-memory.rb -p ./xamplr/persisters/mongo.rb -p ./xamplr/persisters/simple.rb -p ./xamplr/persisters/tokyo-cabinet.rb -p ./xamplr/to-ruby.rb -p ./xamplr/to-xml.rb -p ./xamplr/visitor.rb -p ./xamplr/visitors.rb -p ./xamplr/xampl-module.rb -p ./xamplr/xampl-object-internals.rb -p ./xamplr/xampl-object.rb -p ./xamplr/xampl-persisted-object.rb -p ./xamplr/xml-text.rb -p ./xamplr.rb
@@ -69,6 +69,18 @@ module Xampl
69
69
  end
70
70
  end
71
71
 
72
+ class UnexpectedExitFromTransaction < Exception
73
+ attr_reader :xampl
74
+
75
+ def initialize(xampl=nil)
76
+ @xampl = xampl
77
+ end
78
+
79
+ def message
80
+ "unexpected exit from a transaction: ROLLBACK"
81
+ end
82
+ end
83
+
72
84
  class UnmanagedChange < Exception
73
85
  attr_reader :xampl
74
86
 
@@ -33,13 +33,13 @@ module Xampl
33
33
  end
34
34
 
35
35
  def FromXML.register(tag, ns_tag, klass)
36
- @@by_ns_tag[ns_tag] = [ klass ]
36
+ @@by_ns_tag[ns_tag] = [klass]
37
37
  a = @@by_tag[tag]
38
38
  if (nil == a) then
39
- @@by_tag[tag] = [ klass ]
39
+ @@by_tag[tag] = [klass]
40
40
  else
41
41
  found = false
42
- a.each { | thing | found = found | (thing == klass) }
42
+ a.each { |thing| found = found | (thing == klass) }
43
43
  a << klass unless found
44
44
  end
45
45
  end
@@ -70,7 +70,7 @@ module Xampl
70
70
  LibXML::XML::Parser::Options::NOCDATA |
71
71
  LibXML::XML::Parser::Options::DTDATTR |
72
72
  # LibXML::XML::Parser::Options::COMPACT |
73
- 0)
73
+ 0)
74
74
  #TODO CLOSE THIS THING!!
75
75
  end
76
76
 
@@ -87,7 +87,7 @@ module Xampl
87
87
  LibXML::XML::Parser::Options::NOCDATA |
88
88
  LibXML::XML::Parser::Options::DTDATTR |
89
89
  # LibXML::XML::Parser::Options::COMPACT) |
90
- 0)
90
+ 0)
91
91
  #TODO CLOSE THIS THING!!
92
92
  end
93
93
 
@@ -365,13 +365,13 @@ TODO -- can these ever happen?
365
365
 
366
366
  #describe_current_element_type
367
367
 
368
- #TODO -- get rid of this, it is for debugging only
368
+ begin
369
+ #TODO -- get rid of this??
369
370
  #TODO -- really?
370
- begin
371
- okay = @reader.read
372
- rescue => e
373
- raise RuntimeError, "WHAT?? -- #{ e }", e.backtrace
374
- end
371
+ okay = @reader.read
372
+ rescue => e
373
+ raise RuntimeError, "WHAT?? -- #{ e }", e.backtrace
374
+ end
375
375
 
376
376
  @just_opened_an_element = start_element?
377
377
  @insert_end_element = (@just_opened_an_element and @reader.empty_element?)
@@ -408,7 +408,7 @@ end
408
408
  if @reader.has_attributes? then
409
409
  attribute_count = @reader.attribute_count
410
410
  @reader.move_to_first_attribute
411
- attribute_count.times do | i |
411
+ attribute_count.times do |i|
412
412
  if @reader.namespace_declaration? then
413
413
  @reader.move_to_next_attribute
414
414
  next
@@ -28,7 +28,7 @@ module Xampl
28
28
 
29
29
  def Xampl.disable_all_persisters
30
30
  @@persister = nil
31
- @@known_persisters.each { | persister | persister.close}
31
+ @@known_persisters.each { |persister| persister.close }
32
32
  @@known_persisters = {}
33
33
  end
34
34
 
@@ -79,6 +79,7 @@ module Xampl
79
79
  def Xampl.enable_persister(name, kind=nil, format=nil)
80
80
  kind = kind || Xampl.default_persister_kind
81
81
  format = format || Xampl.default_persister_format
82
+
82
83
  @@persister = @@known_persisters[name]
83
84
 
84
85
  if @@persister then
@@ -108,7 +109,7 @@ module Xampl
108
109
 
109
110
  def Xampl.print_known_persisters
110
111
  puts "Known Persisters:: --------------------------"
111
- @@known_persisters.each { | n, k | puts " #{n} #{k}" }
112
+ @@known_persisters.each { |n, k| puts " #{n} #{k}" }
112
113
  puts "---------------------------------------------"
113
114
  end
114
115
 
@@ -121,12 +122,14 @@ module Xampl
121
122
 
122
123
  def Xampl.drop_all_persisters(verbose=false)
123
124
  puts "Drop All Persisters:: --------------------------" if verbose
125
+ @@persister = nil
124
126
  @@known_persisters.each do |name, persister|
125
127
  puts " #{ name } #{ persister.class.name }" if verbose
126
128
  next if persister == @@persister
127
129
  persister.close
128
130
  persister.clear_cache
129
131
  end
132
+ @@known_persisters = {}
130
133
  puts "---------------------------------------------" if verbose
131
134
  GC.start
132
135
  GC.start
@@ -171,7 +174,113 @@ module Xampl
171
174
  @@verbose_transactions = v
172
175
  end
173
176
 
174
- def Xampl.transaction(thing, kind=nil, automatic=true, format=nil, &block)
177
+ class TransactionWork
178
+ def self.setup_work(work)
179
+ begin
180
+ define_method(:do_work, work)
181
+ self.new.do_work
182
+ ensure
183
+ remove_method(:do_work)
184
+ end
185
+ end
186
+ end
187
+
188
+ @@abnormal_return_from_transactions_are_errors = true
189
+
190
+ def Xampl.abnormal_return_from_transactions_are_errors
191
+ @@abnormal_return_from_transactions_are_errors
192
+ end
193
+
194
+ def Xampl.abnormal_return_from_transactions_are_errors=(v)
195
+ @@abnormal_return_from_transactions_are_errors = v
196
+ end
197
+
198
+ def Xampl.transaction_as_a_method(thing, kind=nil, automatic=true, format=nil, & block)
199
+ #TODO -- should this be called Xampl.transaction_safe???
200
+ #TODO -- won't work in xampl-gen
201
+ return nil unless block_given?
202
+
203
+ if String === thing then
204
+ name = thing
205
+ elsif XamplObject === thing then
206
+ name = thing.persister.name
207
+ else
208
+ raise XamplException.new("can't base a transaction on a #{thing.class.name} (#{thing})")
209
+ end
210
+
211
+ work = Proc.new # get the block into a proc object
212
+
213
+ @@xampl_lock.synchronize(:EX) do
214
+ begin
215
+ initial_persister = @@persister
216
+ Xampl.enable_persister(name, kind, format)
217
+
218
+ original_automatic = @@persister.automatic
219
+
220
+ okay = false
221
+ rollback = true
222
+ exception = nil
223
+ abnormal_return = true
224
+ result = nil
225
+
226
+ begin
227
+ #TODO -- impose some rules on nested transactions/enable_persisters??
228
+
229
+ Xampl.auto_persistence(automatic)
230
+
231
+ result = TransactionWork.setup_work(work)
232
+
233
+ abnormal_return = false
234
+
235
+ Xampl.block_future_changes(true)
236
+ Xampl.sync
237
+ rollback = false
238
+
239
+ okay = true
240
+ return result
241
+ rescue => e
242
+ exception = e
243
+ ensure
244
+ Xampl.block_future_changes(false)
245
+ Xampl.auto_persistence(original_automatic)
246
+
247
+ unless okay then
248
+ if exception then
249
+ Xampl.rollback
250
+ elsif abnormal_return then
251
+ if Xampl.abnormal_return_from_transactions_are_errors then
252
+ Xampl.rollback
253
+ exception = UnexpectedExitFromTransaction.new
254
+ else
255
+ begin
256
+ Xampl.block_future_changes(true)
257
+ Xampl.sync
258
+ rescue => e
259
+ exception = e
260
+ ensure
261
+ Xampl.block_future_changes(false)
262
+ Xampl.auto_persistence(original_automatic)
263
+
264
+ Xampl.rollback if exception
265
+ end
266
+ end
267
+ elsif rollback then
268
+ # don't know how this can happen, but roll it back anyway and treat it as an unexpected exit from transaction
269
+ Xampl.rollback
270
+ exception = UnexpectedExitFromTransaction.new
271
+ end
272
+ end
273
+
274
+ @@persister = initial_persister
275
+ raise exception if exception
276
+ end
277
+ end
278
+ end
279
+ end
280
+
281
+ #def Xampl.transaction_using_proc(thing, kind=nil, automatic=true, format=nil, & block)
282
+ def Xampl.transaction(thing, kind=nil, automatic=true, format=nil, & block)
283
+ # this method cannot account for returns in transactions (proc vs lambda/method issues)
175
284
  if String === thing then
176
285
  name = thing
177
286
  elsif XamplObject === thing then
@@ -260,7 +369,7 @@ module Xampl
260
369
  end
261
370
  end
262
371
 
263
- def Xampl.read_only_transaction(thing, kind=nil, automatic=true, format=nil, &block)
372
+ def Xampl.read_only_transaction(thing, kind=nil, automatic=true, format=nil, & block)
264
373
  if String === thing then
265
374
  name = thing
266
375
  elsif XamplObject === thing then
@@ -422,11 +531,11 @@ module Xampl
422
531
  end
423
532
 
424
533
  def Xampl.sync_all
425
- @@known_persisters.each{ | name, persister | persister.sync }
534
+ @@known_persisters.each { |name, persister| persister.sync }
426
535
  end
427
536
 
428
537
  def Xampl.close_all_persisters
429
- @@known_persisters.each do | name, persister |
538
+ @@known_persisters.each do |name, persister|
430
539
  persister.close
431
540
  end
432
541
  end
@@ -437,7 +546,7 @@ module Xampl
437
546
  end
438
547
 
439
548
  def Xampl.rollback_all
440
- @@known_persisters.values.each { | persister | persister.rollback }
549
+ @@known_persisters.values.each { |persister| persister.rollback }
441
550
  end
442
551
 
443
552
  def Xampl.lazy_load(xampl)
@@ -576,22 +685,22 @@ module Xampl
576
685
 
577
686
  def Xampl.query(hint=false)
578
687
  raise NoActivePersister unless @@persister
579
- @@persister.query(hint) { | q | yield q }
688
+ @@persister.query(hint) { |q| yield q }
580
689
  end
581
690
 
582
691
  def Xampl.find_xampl(hint=false)
583
692
  raise NoActivePersister unless @@persister
584
- @@persister.find_xampl(hint) { | q | yield q }
693
+ @@persister.find_xampl(hint) { |q| yield q }
585
694
  end
586
695
 
587
696
  def Xampl.find_meta(hint=false)
588
697
  raise NoActivePersister unless @@persister
589
- @@persister.find_meta(hint) { | q | yield q }
698
+ @@persister.find_meta(hint) { |q| yield q }
590
699
  end
591
700
 
592
701
  def Xampl.find_pids(hint=false)
593
702
  raise NoActivePersister unless @@persister
594
- @@persister.find_pids(hint) { | q | yield q }
703
+ @@persister.find_pids(hint) { |q| yield q }
595
704
  end
596
705
 
597
706
  def Xampl.find_mentions_of(xampl)
@@ -13,7 +13,8 @@ module Xampl
13
13
  :cache_hits, :total_cache_hits,
14
14
  :last_write_count,
15
15
  :rolled_back,
16
- :expunged
16
+ :expunged,
17
+ :slow_sync
17
18
  attr_reader :syncing, :format
18
19
 
19
20
  def initialize(name=nil, format=nil)
@@ -34,6 +35,7 @@ module Xampl
34
35
  @total_rollback_count = 0
35
36
  @rolled_back = false
36
37
  @syncing = false
38
+ @slow_sync = 0.25
37
39
 
38
40
  @busy_count = 0
39
41
  end
@@ -132,12 +134,14 @@ module Xampl
132
134
  def represent(xampl, mentions=[])
133
135
  #puts "REPRESENT #{xampl} load needed: #{xampl.load_needed}"
134
136
  # return nil if xampl.load_needed
137
+ rep = nil
135
138
  case xampl.default_persister_format || @format
136
139
  when nil, :xml_format then
137
- return xampl.persist("", mentions)
140
+ rep = xampl.persist("", mentions)
138
141
  when :ruby_format then
139
- return xampl.to_ruby(mentions)
142
+ rep = xampl.to_ruby(mentions)
140
143
  end
144
+ return rep
141
145
  rescue => e
142
146
  msg = "Failed to represent #{ xampl } due to: #{ e }"
143
147
  puts msg
@@ -149,11 +153,15 @@ module Xampl
149
153
  # Normally we'd expect to see the representation in the @format format, but
150
154
  # that isn't necessarily the case. Try to work out what the format might be...
151
155
 
156
+ #TODO -- this is a bit brutal, but it should work (it is the rule is that this is supposed to be UTF-8)
157
+ representation_fixed = representation.encode('UTF-8', :invalid => :replace, :undef => :replace)
158
+ # puts "#{ ::File.basename __FILE__ }:#{ __LINE__ } [#{__method__}] ENCODING: #{ representation.encoding } -> #{ representation_fixed.encoding }"
159
+
152
160
  xampl = nil
153
- if representation =~ /^</ then
154
- xampl = XamplObject.realise_from_xml_string(representation, target)
161
+ if representation_fixed =~ /^</ then
162
+ xampl = XamplObject.realise_from_xml_string(representation_fixed, target)
155
163
  else
156
- xampl = XamplObject.from_ruby(representation, target)
164
+ xampl = XamplObject.from_ruby(representation_fixed, target)
157
165
  end
158
166
  return xampl.note_realised
159
167
  end
@@ -218,7 +226,7 @@ module Xampl
218
226
 
219
227
  def put_changed(msg="")
220
228
  puts "Changed::#{msg}:"
221
- @changed.each { | xampl, ignore | puts " #{xampl.tag} #{xampl.get_the_index}" }
229
+ @changed.each { |xampl, ignore| puts " #{xampl.tag} #{xampl.get_the_index}" }
222
230
  end
223
231
 
224
232
  def start_sync_write
@@ -268,9 +276,9 @@ module Xampl
268
276
  end
269
277
 
270
278
  duration = Time.now - duration
271
- if 0.25 < duration.to_f then
279
+ if @slow_sync < duration.to_f then
272
280
  puts "#{ __FILE__ }:#{ __LINE__ } [#{__method__}] SLOW SYNC(#{ duration.to_f }s), changed: #{ @changed.size }"
273
- @changed.each do | key, value |
281
+ @changed.each do |key, value|
274
282
  puts " key: #{ key.class.name }, pid: #{ key.get_the_index }"
275
283
  end
276
284
  end
@@ -668,6 +668,8 @@ module Xampl
668
668
  # puts "#{File.basename(__FILE__)}:#{__LINE__} ??: #{ klass }/#{ pid }" unless representation
669
669
  $NF_COUNT += 1
670
670
 
671
+ #TODO this is coming back as ASCII-8BIT rather than UTF-8!!!!!!!!!!!!!!!!!!
672
+ # puts "#{ ::File.basename __FILE__ }:#{ __LINE__ } [#{__method__}] encoding #{ representation.encoding }"
671
673
  return representation
672
674
  end
673
675
 
@@ -681,6 +683,9 @@ module Xampl
681
683
  note_errors("TC[[#{ dir_path }]]:: backup error: %s\n") do
682
684
  @tc_db.copy(path)
683
685
  end
686
+ return true
687
+ rescue => e
688
+ return false
684
689
  end
685
690
  end
686
691
 
@@ -133,7 +133,8 @@ module Xampl
133
133
 
134
134
  def to_s
135
135
  if self.persisted? then
136
- "<<#{ self.class.name } #{ self.object_id } [#{ self.get_the_index }]#{ @is_changed ? ' DIRTY' : ''}>>"
136
+ persister_name = self.persister ? "#{ self.persister.name }/" : ''
137
+ "<<#{ self.class.name } #{ self.object_id } [#{ self.persister ? self.persister.name : 'no-persister' }/#{ self.get_the_index }]#{ @is_changed ? ' DIRTY' : ''}>>"
137
138
  elsif self.indexed_by then
138
139
  "<<#{ self.class.name } #{ self.object_id } [#{ self.get_the_index }]>>"
139
140
  else
data/xamplr.gemspec CHANGED
@@ -1,15 +1,15 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{xamplr}
8
- s.version = "1.9.12"
8
+ s.version = "1.9.13"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Bob Hutchison"]
12
- s.date = %q{2010-05-19}
12
+ s.date = %q{2010-07-14}
13
13
  s.description = %q{xamplr is the ruby version of xampl.}
14
14
  s.email = %q{hutch@recursive.ca}
15
15
  s.extra_rdoc_files = [
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
26
26
  "README.md",
27
27
  "Rakefile",
28
28
  "VERSION.yml",
29
+ "lib/Makefile",
29
30
  "lib/xampl.rb",
30
31
  "lib/xamplr.rb",
31
32
  "lib/xamplr/.cvsignore",
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xamplr
3
3
  version: !ruby/object:Gem::Version
4
- hash: 43
4
+ hash: 41
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 9
9
- - 12
10
- version: 1.9.12
9
+ - 13
10
+ version: 1.9.13
11
11
  platform: ruby
12
12
  authors:
13
13
  - Bob Hutchison
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-05-19 00:00:00 -04:00
18
+ date: 2010-07-14 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -69,6 +69,7 @@ files:
69
69
  - README.md
70
70
  - Rakefile
71
71
  - VERSION.yml
72
+ - lib/Makefile
72
73
  - lib/xampl.rb
73
74
  - lib/xamplr.rb
74
75
  - lib/xamplr/.cvsignore