hutch-xamplr 1.0.5 → 1.1.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.
Files changed (76) hide show
  1. data/Rakefile +1 -0
  2. data/VERSION.yml +2 -2
  3. data/examples/random-people-shared-addresses/Makefile +2 -2
  4. data/examples/random-people-shared-addresses/batch-load-users.rb +2 -5
  5. data/examples/random-people-shared-addresses/find-mentions.rb +1 -4
  6. data/examples/random-people-shared-addresses/find-people-by-address.rb +1 -4
  7. data/examples/random-people-shared-addresses/optimise.rb +1 -4
  8. data/examples/random-people-shared-addresses/people.rb +0 -15
  9. data/examples/random-people-shared-addresses/query.rb +1 -4
  10. data/examples/random-people-shared-addresses/query2.rb +1 -4
  11. data/examples/random-people-shared-addresses/results.write.BASELINE +298 -0
  12. data/examples/random-people-shared-addresses/results.write.NEW_ATTR_ENCODING +294 -0
  13. data/examples/random-people-shared-addresses/settings.rb +3 -0
  14. data/examples/random-people/batch-load-users.rb +1 -4
  15. data/examples/random-people/optimise.rb +1 -4
  16. data/examples/random-people/people.rb +0 -3
  17. data/examples/random-people/query.rb +1 -5
  18. data/examples/random-people/query2.rb +1 -4
  19. data/examples/random-people/settings.rb +3 -0
  20. data/examples/random-people/what-to-query-on.rb +1 -3
  21. data/examples/read-testing/Makefile +10 -0
  22. data/examples/read-testing/load.rb +65 -0
  23. data/examples/read-testing/read.rb +51 -0
  24. data/examples/read-testing/results.read.BASELINE +6 -0
  25. data/examples/read-testing/results.read.FAST +5 -0
  26. data/examples/read-testing/rrr.rb +87 -0
  27. data/examples/read-testing/settings.rb +2 -0
  28. data/examples/read-testing/xampl-gen.rb +36 -0
  29. data/examples/read-testing/xml/text.xml +8 -0
  30. data/lib/xamplr.rb +10 -1
  31. data/lib/xamplr/exceptions.rb +97 -0
  32. data/lib/xamplr/from-xml-orig.rb +350 -0
  33. data/lib/xamplr/from-xml.rb +272 -183
  34. data/lib/xamplr/handwritten/example.rb +0 -58
  35. data/lib/xamplr/handwritten/hand-example.rb +0 -27
  36. data/lib/xamplr/handwritten/test-handwritten.rb +0 -37
  37. data/lib/xamplr/mixins.rb +10 -48
  38. data/lib/xamplr/persist-to-xml.rb +249 -0
  39. data/lib/xamplr/persistence.rb +44 -412
  40. data/lib/xamplr/persistence.rb.more_thread_safe +0 -13
  41. data/lib/xamplr/persistence.rb.partially_thread_safe +0 -13
  42. data/lib/xamplr/persister.rb +298 -0
  43. data/lib/xamplr/{persister → persisters}/caches.rb +0 -0
  44. data/lib/xamplr/{persister → persisters}/caching.rb +1 -1
  45. data/lib/xamplr/{persister → persisters}/filesystem.rb +4 -5
  46. data/lib/xamplr/{persister → persisters}/in-memory.rb +1 -1
  47. data/lib/xamplr/{persister → persisters}/simple.rb +0 -0
  48. data/lib/xamplr/{persister → persisters}/tokyo-cabinet.rb +53 -15
  49. data/lib/xamplr/simpleTemplate/{input-c.r4 → obsolete/input-c.r4} +0 -0
  50. data/lib/xamplr/simpleTemplate/{play.r6.txt → obsolete/play.r6.txt} +0 -0
  51. data/lib/xamplr/simpleTemplate/{play_more.r6.txt → obsolete/play_more.r6.txt} +0 -0
  52. data/lib/xamplr/simpleTemplate/{test001.r5 → obsolete/test001.r5} +0 -0
  53. data/lib/xamplr/simpleTemplate/{test002.r5 → obsolete/test002.r5} +0 -0
  54. data/lib/xamplr/simpleTemplate/{test003.r5 → obsolete/test003.r5} +0 -0
  55. data/lib/xamplr/templates/child_indexed.template +1 -1
  56. data/lib/xamplr/templates/element_classes.template +1 -1
  57. data/lib/xamplr/templates/element_data.template +0 -39
  58. data/lib/xamplr/templates/element_empty.template +0 -40
  59. data/lib/xamplr/templates/element_mixed.template +0 -41
  60. data/lib/xamplr/templates/element_simple.template +0 -40
  61. data/lib/xamplr/test-support/bench.rb +6 -26
  62. data/lib/xamplr/test-support/test.rb +1 -89
  63. data/lib/xamplr/visitor.rb +0 -778
  64. data/lib/xamplr/visitors.rb +573 -0
  65. data/lib/xamplr/xampl-generator.rb +1 -1
  66. data/lib/xamplr/xampl-hand-generated.rb +0 -85
  67. data/lib/xamplr/xampl-module.rb +36 -0
  68. data/lib/xamplr/xampl-object-internals.rb +6 -0
  69. data/lib/xamplr/xampl-object.rb +10 -341
  70. data/lib/xamplr/xampl-persisted-object.rb +122 -0
  71. data/lib/xamplr/xml-text.rb +117 -0
  72. metadata +53 -18
  73. data/lib/xamplr/persister/subversion.rb +0 -61
  74. data/lib/xamplr/rac.sh +0 -6
  75. data/lib/xamplr/rac_gen.sh +0 -1
  76. data/lib/xamplr/templates/child_indexed.template.000 +0 -87
@@ -569,8 +569,6 @@ module Xampl
569
569
  return xampl.persist
570
570
  when :ruby_format then
571
571
  return xampl.to_ruby
572
- when :yaml_format then
573
- return xampl.as_yaml
574
572
  end
575
573
  end
576
574
 
@@ -580,20 +578,9 @@ module Xampl
580
578
 
581
579
  if representation =~ /^</ then
582
580
  return XamplObject.realise_from_xml_string(representation, target)
583
- elsif representation =~ /^-/ then
584
- return XamplObject.from_yaml(representation, target)
585
581
  else
586
582
  XamplObject.from_ruby(representation, target)
587
583
  end
588
-
589
- # case @format
590
- # when nil, :xml_format then
591
- # return XamplObject.realise_from_xml_string(representation, target)
592
- # when :ruby_format then
593
- # XamplObject.from_ruby(representation, target)
594
- # when :yaml_format then
595
- # return XamplObject.from_yaml(representation, target)
596
- # end
597
584
  end
598
585
 
599
586
  def write(xampl)
@@ -561,8 +561,6 @@ module Xampl
561
561
  return xampl.persist
562
562
  when :ruby_format then
563
563
  return xampl.to_ruby
564
- when :yaml_format then
565
- return xampl.as_yaml
566
564
  end
567
565
  end
568
566
 
@@ -572,20 +570,9 @@ module Xampl
572
570
 
573
571
  if representation =~ /^</ then
574
572
  return XamplObject.realise_from_xml_string(representation, target)
575
- elsif representation =~ /^-/ then
576
- return XamplObject.from_yaml(representation, target)
577
573
  else
578
574
  XamplObject.from_ruby(representation, target)
579
575
  end
580
-
581
- # case @format
582
- # when nil, :xml_format then
583
- # return XamplObject.realise_from_xml_string(representation, target)
584
- # when :ruby_format then
585
- # XamplObject.from_ruby(representation, target)
586
- # when :yaml_format then
587
- # return XamplObject.from_yaml(representation, target)
588
- # end
589
576
  end
590
577
 
591
578
  def write(xampl)
@@ -0,0 +1,298 @@
1
+
2
+ require "xamplr/persistence"
3
+
4
+ module Xampl
5
+ class Persister
6
+ attr_accessor :name,
7
+ :automatic,
8
+ :block_changes,
9
+ :read_count, :total_read_count,
10
+ :write_count, :total_write_count,
11
+ :total_sync_count, :total_rollback_count,
12
+ :cache_hits, :total_cache_hits,
13
+ :last_write_count,
14
+ :rolled_back
15
+ attr_reader :syncing, :format
16
+
17
+ def initialize(name=nil, format=nil)
18
+ @name = name
19
+ @format = format
20
+ @automatic = false
21
+ @changed = {}
22
+ @cache_hits = 0
23
+ @total_cache_hits = 0
24
+ @read_count = 0
25
+ @total_read_count = 0
26
+ @write_count = 0
27
+ @total_write_count = 0
28
+ @last_write_count = 0
29
+ @total_sync_count = 0
30
+ @total_rollback_count = 0
31
+ @rolled_back = false
32
+ @syncing = false
33
+
34
+ @busy_count = 0
35
+ end
36
+
37
+ def optimise(opts)
38
+ end
39
+
40
+ def close
41
+ self.sync
42
+ end
43
+
44
+ def busy(yes)
45
+ if yes then
46
+ @busy_count += 1
47
+ elsif 0 < @busy_count then
48
+ @busy_count -= 1
49
+ end
50
+ end
51
+
52
+ def is_busy
53
+ return 0 < @busy_count
54
+ end
55
+
56
+ def introduce(xampl)
57
+ if xampl.introduce_persister(self) then
58
+ cache(xampl)
59
+ end
60
+ has_changed(xampl) if xampl.is_changed
61
+ end
62
+
63
+ def has_changed(xampl)
64
+ #raise XamplException.new(:live_across_rollback) if @rolled_back
65
+ # puts "!!!! has_changed #{xampl} #{xampl.get_the_index} -- persist required: #{xampl.persist_required}"
66
+ if xampl.persist_required && xampl.is_changed then
67
+ unless self == xampl.persister
68
+ raise MixedPersisters.new(xampl.persister, self)
69
+ end
70
+ @changed[xampl] = xampl
71
+ # puts "!!!! change recorded ==> #{@changed.size}/#{count_changed} #{@changed.object_id} !!!!"
72
+ # @changed.each{ | thing, ignore |
73
+ # puts " changed: #{thing}, index: #{thing.get_the_index}, changed: #{thing.is_changed}"
74
+ # }
75
+ end
76
+ end
77
+
78
+ def has_not_changed(xampl)
79
+ # puts "!!!! has_not_changed #{xampl} #{xampl.get_the_index} -- in @changed: #{nil != @changed[xampl]}"
80
+ @changed.delete(xampl) if xampl
81
+ end
82
+
83
+ def count_changed
84
+ # @changed.each{ | thing, ignore |
85
+ # puts "changed: #{thing}, index: #{thing.get_the_index}"
86
+ # }
87
+ return @changed.size
88
+ end
89
+
90
+ def cache(xampl)
91
+ raise XamplException.new(:unimplemented)
92
+ end
93
+
94
+ def uncache(xampl)
95
+ raise XamplException.new(:unimplemented)
96
+ end
97
+
98
+ def clear_cache
99
+ raise XamplException.new(:unimplemented)
100
+ end
101
+
102
+ def Persister.replace(old_xampl, new_xampl)
103
+ pid = old_xampl.get_the_index
104
+ if old_xampl.persister != @@persister then
105
+ raise MixedPersisters.new(@@persister, old_xampl.persister)
106
+ end
107
+ if new_xampl.persister != @@persister then
108
+ raise MixedPersisters.new(@@persister, new_xampl.persister)
109
+ end
110
+
111
+ new_xampl.note_replacing(old_xampl)
112
+
113
+ unless old_xampl.load_needed then
114
+ Xampl.log.warn("Replacing live xampl: #{old_xampl} pid: #{pid}")
115
+ @@persister.uncache(old_xampl)
116
+ old_xampl.invalidate
117
+ end
118
+ new_xampl.pid = nil
119
+ new_xampl.pid = pid
120
+ @@persister.introduce(new_xampl)
121
+ end
122
+
123
+ def represent(xampl, mentions=[])
124
+ #puts "REPRESENT #{xampl} load needed: #{xampl.load_needed}"
125
+ # return nil if xampl.load_needed
126
+ case xampl.default_persister_format || @format
127
+ when nil, :xml_format then
128
+ return xampl.persist("", mentions)
129
+ when :ruby_format then
130
+ return xampl.to_ruby(mentions)
131
+ end
132
+ end
133
+
134
+ def realise(representation, target=nil)
135
+ # Normally we'd expect to see the representation in the @format format, but
136
+ # that isn't necessarily the case. Try to work out what the format might be...
137
+
138
+ if representation =~ /^</ then
139
+ return XamplObject.realise_from_xml_string(representation, target)
140
+ else
141
+ XamplObject.from_ruby(representation, target)
142
+ end
143
+ end
144
+
145
+ def version(stream)
146
+ raise XamplException.new(:unimplemented)
147
+ # catch(:refuse_to_version) do
148
+ # end
149
+ end
150
+
151
+ def write(xampl)
152
+ raise XamplException.new(:unimplemented)
153
+ end
154
+
155
+ def read(klass, pid, target=nil)
156
+ raise XamplException.new(:unimplemented)
157
+ end
158
+
159
+ def lookup(klass, pid)
160
+ #raise XamplException.new(:live_across_rollback) if @rolled_back
161
+ #puts "#{File.basename(__FILE__)} #{__LINE__} LOOKUP:: klass: #{klass} pid: #{pid}"
162
+
163
+ begin
164
+ busy(true)
165
+ xampl = read(klass, pid)
166
+ ensure
167
+ busy(false)
168
+ end
169
+
170
+ #puts "#{File.basename(__FILE__)} #{__LINE__} ---> #{ xampl }"
171
+
172
+ return xampl
173
+ end
174
+
175
+ def find_known(klass, pid)
176
+ #raise XamplException.new(:live_across_rollback) if @rolled_back
177
+
178
+ xampl = read_from_cache(klass, pid, nil)
179
+
180
+ return xampl
181
+ end
182
+
183
+ def lazy_load(target, klass, pid)
184
+ # puts "#{File.basename(__FILE__)} #{__LINE__} LAZY_LOAD:: klass: #{klass} pid: #{pid} target: #{target}"
185
+
186
+ xampl = read(klass, pid, target)
187
+
188
+ # puts " LAZY_LOAD --> #{xampl}"
189
+
190
+ return xampl
191
+ end
192
+
193
+ def put_changed(msg="")
194
+ puts "Changed::#{msg}:"
195
+ @changed.each { | xampl, ignore | puts " #{xampl.tag} #{xampl.get_the_index}" }
196
+ end
197
+
198
+ def do_sync_write
199
+ unchanged_in_changed_list = 0
200
+ @changed.each do |xampl, ignore|
201
+ unchanged_in_changed_list += 1 unless xampl.is_changed
202
+ unless xampl.kind_of?(InvalidXampl) then
203
+ write(xampl)
204
+ end
205
+ end
206
+ end
207
+
208
+ def sync
209
+ #raise XamplException.new(:live_across_rollback) if @rolled_back
210
+ begin
211
+ #puts "SYNC"
212
+ #puts "SYNC"
213
+ #puts "SYNC changed: #{@changed.size}" if 0 < @changed.size
214
+ #@changed.each do | key, value |
215
+ ##puts " #{key.class.name}"
216
+ ##puts "key: #{key.class.name}, value: #{value.class.name}"
217
+ #puts key.to_xml
218
+ #end
219
+ #puts "SYNC"
220
+ #puts "SYNC"
221
+
222
+ #if 0 < @changed.size then
223
+ #puts "SYNC changed: #{@changed.size}"
224
+ ##caller(0).each do | trace |
225
+ ## next if /xamplr/ =~ trace
226
+ ## puts " #{trace}"
227
+ ## break if /actionpack/ =~ trace
228
+ ##end
229
+ #end
230
+ busy(true)
231
+ @syncing = true
232
+
233
+ do_sync_write
234
+
235
+ @changed = {}
236
+
237
+ @total_read_count = @total_read_count + @read_count
238
+ @total_write_count = @total_write_count + @write_count
239
+ @total_cache_hits = @total_cache_hits + @cache_hits
240
+ @total_sync_count = @total_sync_count + 1
241
+
242
+ @read_count = 0
243
+ @last_write_count = @write_count
244
+ @write_count = 0
245
+
246
+ self.sync_done()
247
+
248
+ return @last_write_count
249
+ ensure
250
+ busy(false)
251
+ @syncing = false
252
+ end
253
+ end
254
+
255
+ def sync_done
256
+ raise XamplException.new(:unimplemented)
257
+ end
258
+
259
+ def rollback
260
+ begin
261
+ busy(true)
262
+
263
+ return Xampl.rollback(self)
264
+ ensure
265
+ busy(false)
266
+ end
267
+ end
268
+
269
+ def rollback_cleanup
270
+ @changed = {}
271
+ end
272
+
273
+ def print_stats
274
+ printf("SYNC:: TOTAL cache_hits: %d, reads: %d, writes: %d\n",
275
+ @total_cache_hits, @total_read_count, @total_write_count)
276
+ printf(" cache_hits: %d, reads: %d, last writes: %d\n",
277
+ @cache_hits, @read_count, @last_write_count)
278
+ printf(" syncs: %d\n", @total_sync_count)
279
+ printf(" changed count: %d (%d)\n", count_changed, @changed.size)
280
+ @changed.each do |thing, ignore|
281
+ if thing.is_changed then
282
+ puts " changed: #{thing}, index: #{thing.get_the_index}"
283
+ else
284
+ puts " UNCHANGED: #{thing}, index: #{thing.get_the_index} <<<<<<<<<<<<<<<<<<< BAD!"
285
+ end
286
+ end
287
+ end
288
+ end
289
+
290
+ require "xamplr/persisters/simple"
291
+ require "xamplr/persisters/in-memory"
292
+ require "xamplr/persisters/filesystem"
293
+
294
+ if require 'tokyocabinet' then
295
+ require "xamplr/persisters/tokyo-cabinet"
296
+ end
297
+
298
+ end
@@ -1,7 +1,7 @@
1
1
  module Xampl
2
2
 
3
3
  require "fileutils"
4
- require "xamplr/persister/caches"
4
+ require "xamplr/persisters/caches"
5
5
 
6
6
  class AbstractCachingPersister < Persister
7
7
 
@@ -3,7 +3,7 @@ module Xampl
3
3
  require 'xamplr/version'
4
4
 
5
5
  require "fileutils"
6
- require "xamplr/persister/caching"
6
+ require "xamplr/persisters/caching"
7
7
 
8
8
  class FilesystemPersister < AbstractCachingPersister
9
9
 
@@ -39,9 +39,7 @@ module Xampl
39
39
 
40
40
  representation = represent(xampl)
41
41
  if representation then
42
- File.open(place, "w"){ | out |
43
- out.puts representation
44
- }
42
+ File.open(place, "w"){ | out | out.puts representation }
45
43
  @write_count = @write_count + 1
46
44
  end
47
45
  xampl.changes_accepted
@@ -52,7 +50,8 @@ module Xampl
52
50
  place = File.join(@root_dir, klass.name.split("::"), pid)
53
51
 
54
52
  return nil unless File.exist?(place)
55
- return File.read(place)
53
+ representation = File.read(place)
54
+ return representation
56
55
  end
57
56
  end
58
57
 
@@ -1,6 +1,6 @@
1
1
  module Xampl
2
2
 
3
- require "xamplr/persister/caches"
3
+ require "xamplr/persisters/caches"
4
4
 
5
5
  class InMemoryPersister < Persister
6
6
 
@@ -2,9 +2,11 @@ module Xampl
2
2
 
3
3
  require 'fileutils'
4
4
  require 'tokyocabinet'
5
- require 'xamplr/persister/caching'
5
+ require 'xamplr/persisters/caching'
6
6
  require 'set'
7
7
 
8
+ require 'ruby-prof'
9
+
8
10
  class TokyoCabinetPersister < AbstractCachingPersister
9
11
  include TokyoCabinet
10
12
 
@@ -43,29 +45,32 @@ module Xampl
43
45
 
44
46
  open_tc_db()
45
47
 
46
- # note_errors("TC:: optimisation error: %s\n") do
48
+ # note_errors("TC[[#{ @filename }]]:: optimisation error: %s\n") do
47
49
  # @tc_db.optimize(-1, -1, -1, TDB::TDEFLATE)
48
50
  # end
49
- # note_errors("TC:: close error: %s\n") do
51
+ # note_errors("TC[[#{ @filename }]]:: close error: %s\n") do
50
52
  # @tc_db.close
51
53
  # end
52
54
  end
53
55
 
54
56
  def open_tc_db
55
57
  return if @tc_db
58
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} open tc db: #{ @filename }"
59
+ #puts "#{File.basename(__FILE__)}:#{__LINE__} callers..."
60
+ #caller(0).each { | trace | puts " #{trace}"}
56
61
  @tc_db = TDB.new
57
- note_errors("TC:: tuning error: %s\n") do
62
+ note_errors("TC[[#{ @filename }]]:: tuning error: %s\n") do
58
63
  @tc_db.tune(-1, -1, -1, TDB::TDEFLATE)
59
64
  end
60
65
 
61
- note_errors("TC:: open error: %s\n") do
66
+ note_errors("TC[[#{ @filename }]]:: open [#{ @filename }] error: %s\n") do
62
67
  @tc_db.open(@filename, TDB::OWRITER | TDB::OCREAT | TDB::OLCKNB ) #TDB::OTSYNC slows it down by almost 50 times
63
68
  end
64
69
 
65
70
  # Don't care if there are errors (in fact, if the index exists a failure is the expected thing)
66
71
 
67
72
  $lexical_indexes.each do | index_name |
68
- @tc_db.setindex(index_name, TDB::ITLEXICAL | TDB::ITKEEP)
73
+ r = @tc_db.setindex(index_name, TDB::ITLEXICAL | TDB::ITKEEP)
69
74
  end
70
75
  $numeric_indexes.each do | index_name |
71
76
  @tc_db.setindex(index_name, TDB::ITDECIMAL | TDB::ITKEEP)
@@ -84,7 +89,7 @@ module Xampl
84
89
  @tc_db.setindex(index_name, 9998)
85
90
  end
86
91
  else
87
- note_errors("TC:: optimisation error: %s\n") do
92
+ note_errors("TC[[#{ @filename }]]:: optimisation error: %s\n") do
88
93
  @tc_db.optimize(-1, -1, -1, 0xff)
89
94
  end
90
95
  end
@@ -93,10 +98,11 @@ module Xampl
93
98
  def close
94
99
  if @tc_db then
95
100
  self.sync
96
- note_errors("TC:: close error: %s\n") do
101
+ note_errors("TC[[#{ @filename }]]:: close error: %s\n") do
97
102
  @tc_db.close
98
103
  end
99
104
  @tc_db = nil
105
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} close tc db: #{ @filename }"
100
106
  end
101
107
  end
102
108
 
@@ -274,6 +280,17 @@ module Xampl
274
280
  end
275
281
 
276
282
  def do_sync_write
283
+ # RubyProf.start
284
+ #
285
+ # do_sync_write_work
286
+ #
287
+ # result = RubyProf.stop
288
+ # printer = RubyProf::FlatPrinter.new(result)
289
+ # printer.print(STDOUT, 0)
290
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} stop this profiler"
291
+ # end
292
+ #
293
+ # def do_sync_write_work
277
294
  open_tc_db
278
295
  @time_stamp = Time.now.to_f.to_s
279
296
 
@@ -283,7 +300,7 @@ module Xampl
283
300
  # end
284
301
 
285
302
  begin
286
- note_errors("TC:: tranbegin error: %s\n") do
303
+ note_errors("TC[[#{ @filename }]]:: tranbegin error: %s\n") do
287
304
  @tc_db.tranbegin
288
305
  end
289
306
 
@@ -292,16 +309,16 @@ module Xampl
292
309
  end
293
310
  rescue => e
294
311
  msg = "no TC.abort attempted"
295
- msg = note_errors("TC:: trancommit error: %s\n") do
312
+ msg = note_errors("TC[[#{ @filename }]]:: trancommit error: %s\n") do
296
313
  @tc_db.tranabort
297
314
  end
298
315
  raise "TokyoCabinetPersister Error:: #{ msg }/#{ e }"
299
316
  else
300
- note_errors("TC:: trancommit error: %s\n") do
317
+ note_errors("TC[[#{ @filename }]]:: trancommit error: %s\n") do
301
318
  @tc_db.trancommit
302
319
  end
303
320
  ensure
304
- # note_errors("TC:: close error: %s\n") do
321
+ # note_errors("TC[[#{ @filename }]]:: close error: %s\n") do
305
322
  # @tc_db.close()
306
323
  # end
307
324
  end
@@ -317,7 +334,7 @@ module Xampl
317
334
 
318
335
  query = TableQuery.new(@tc_db)
319
336
  query.add_condition('xampl_from', :equals, place)
320
- note_errors("TC:: failed to remove from mentions, error: %s\n") do
337
+ note_errors("TC[[#{ @filename }]]:: failed to remove from mentions, error: %s\n") do
321
338
  query.searchout
322
339
  end
323
340
 
@@ -333,7 +350,7 @@ module Xampl
333
350
  'xampl_to' => mention_place
334
351
  }
335
352
 
336
- note_errors("TC:: write error: %s\n") do
353
+ note_errors("TC[[#{ @filename }]]:: write error: %s\n") do
337
354
  @tc_db.put(pk, mention_hash)
338
355
  end
339
356
  end
@@ -350,7 +367,7 @@ module Xampl
350
367
  xampl_hash = hash.merge(xampl_hash)
351
368
  end
352
369
 
353
- note_errors("TC:: write error: %s\n") do
370
+ note_errors("TC[[#{ @filename }]]:: write error: %s\n") do
354
371
  @tc_db.put(place, xampl_hash)
355
372
  end
356
373
 
@@ -359,7 +376,15 @@ module Xampl
359
376
  return true
360
377
  end
361
378
 
379
+ $TC_COUNT = 0
380
+ $FS_COUNT = 0
381
+ $NF_COUNT = 0
382
+
362
383
  def read_representation(klass, pid)
384
+ #TODO -- is this being called too often, e.g. by new_xxx???
385
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} READ #{ klass }/#{ pid }"
386
+ # caller(0).each { | trace | puts " #{trace}"}
387
+
363
388
  open_tc_db
364
389
  place = File.join(klass.name.split("::"), pid)
365
390
  representation = nil
@@ -367,9 +392,22 @@ module Xampl
367
392
  meta = @tc_db[place]
368
393
  representation = meta['xampl'] if meta
369
394
 
395
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} TC: #{ klass }/#{ pid }" if representation
396
+ $TC_COUNT += 1 if representation
397
+
370
398
  # puts "read: #{ place }, size: #{ representation.size }"
371
399
  # puts representation[0..100]
372
400
 
401
+ unless representation then
402
+ # try the filesystem if it is not in the TC repository
403
+ place = File.join(@root_dir, klass.name.split("::"), pid)
404
+ representation = File.read(place) if File.exist?(place)
405
+ $FS_COUNT += 1 if representation
406
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} FS: #{ klass }/#{ pid } (FS: #{ $FS_COUNT}, TC: #{ $TC_COUNT }, NF: #{ $NF_COUNT }" if representation
407
+ end
408
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} ??: #{ klass }/#{ pid }" unless representation
409
+ $NF_COUNT += 1
410
+
373
411
  return representation
374
412
  end
375
413
  end