xamplr 1.2.0 → 1.3.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. data/.document +5 -0
  2. data/.gitignore +12 -0
  3. data/CHANGES.txt +37 -0
  4. data/COPYING +661 -0
  5. data/Makefile +13 -0
  6. data/README.rdoc +24 -4
  7. data/Rakefile +2 -2
  8. data/VERSION.yml +3 -2
  9. data/bin/xampl-gen +17 -0
  10. data/docs/intro/.gitignore +1 -0
  11. data/docs/intro/example1/example1.rb +6 -0
  12. data/docs/intro/example1/xml/hello.xml +1 -0
  13. data/docs/intro/example2/example2.rb +38 -0
  14. data/docs/intro/example2/project-generator.rb +22 -0
  15. data/docs/intro/example2/xml/hello.xml +2 -0
  16. data/docs/intro/example3/example3.rb +30 -0
  17. data/docs/intro/example3/example3a.rb +16 -0
  18. data/docs/intro/example3/generated.png +0 -0
  19. data/docs/intro/example3/grab-yuml.rb +10 -0
  20. data/docs/intro/example3/greeter.rb +15 -0
  21. data/docs/intro/example3/greeting.rb +9 -0
  22. data/docs/intro/example3/project-generator.rb +25 -0
  23. data/docs/intro/example3/xml/greeter.xml +6 -0
  24. data/docs/intro/example4/example4.rb +27 -0
  25. data/docs/intro/example4/example4a.rb +19 -0
  26. data/docs/intro/example4/grab-yuml.rb +10 -0
  27. data/docs/intro/example4/greeter.rb +15 -0
  28. data/docs/intro/example4/greeting.rb +9 -0
  29. data/docs/intro/example4/project-generator.rb +25 -0
  30. data/docs/intro/example4/xml/greeter.xml +6 -0
  31. data/docs/intro/grab-yuml.rb +10 -0
  32. data/docs/intro/project-generator.rb +51 -0
  33. data/docs/intro/xampl.lyx +1494 -0
  34. data/docs/intro/xampl.pdf +0 -0
  35. data/examples/employees/final/xampl-gen.rb +38 -0
  36. data/examples/employees/final/xml/ddd-final.xml +86 -0
  37. data/examples/employees/final-xampl/xampl-gen.rb +38 -0
  38. data/examples/employees/final-xampl/xml/ddd-final-xampl.xml +86 -0
  39. data/examples/employees/first/xampl-gen.rb +38 -0
  40. data/examples/employees/first/xml/ddd-first.xml +48 -0
  41. data/examples/employees/twist/twist.graphml +333 -0
  42. data/examples/employees/twist/xampl-gen.rb +38 -0
  43. data/examples/employees/twist/xml/twist.xml +90 -0
  44. data/examples/employees/xamplr-twist.xml +2 -0
  45. data/examples/employees/yuml-diagrams/DDD-final-approach.graphml +393 -0
  46. data/examples/employees/yuml-diagrams/DDD-final-xampl-approach.graphml +265 -0
  47. data/examples/employees/yuml-diagrams/DDD-ideal-final-approach.graphml +357 -0
  48. data/examples/employees/yuml-diagrams/ddd-final.png +0 -0
  49. data/examples/employees/yuml-diagrams/ddd-final.yuml +8 -0
  50. data/examples/employees/yuml-diagrams/ddd-first.png +0 -0
  51. data/examples/employees/yuml-diagrams/ddd-first.yuml +7 -0
  52. data/examples/employees/yuml-diagrams/final-yed.png +0 -0
  53. data/examples/employees/yuml-diagrams/first-yed.png +0 -0
  54. data/examples/employees/yuml-diagrams/twist.png +0 -0
  55. data/examples/employees/yuml-diagrams/twist.yuml +12 -0
  56. data/examples/employees/yuml-diagrams/xamplr-final-no-mixins.png +0 -0
  57. data/examples/employees/yuml-diagrams/xamplr-final-simplified.png +0 -0
  58. data/examples/employees/yuml-diagrams/xamplr-final-with-mixins.png +0 -0
  59. data/examples/employees/yuml-diagrams/yuml-simplified.txt +19 -0
  60. data/examples/employees/yuml-diagrams/yuml-with-mixins.txt +53 -0
  61. data/examples/employees/yuml-diagrams/yuml.txt +27 -0
  62. data/examples/hobbies/Makefile +5 -0
  63. data/examples/hobbies/hobbies.rb +193 -0
  64. data/examples/hobbies/project-generator.rb +25 -0
  65. data/examples/hobbies/xampl-gen.rb +38 -0
  66. data/examples/hobbies/xml/hobby.xml +3 -0
  67. data/examples/hobbies/xml/people.xml +5 -0
  68. data/examples/random-people/.gitignore +2 -0
  69. data/examples/random-people/Makefile +5 -1
  70. data/examples/random-people/xampl-gen.rb +5 -2
  71. data/examples/random-people-shared-addresses/.gitignore +2 -0
  72. data/examples/random-people-shared-addresses/Makefile +8 -9
  73. data/examples/random-people-shared-addresses/batch-load-users-profiled.rb +91 -0
  74. data/examples/random-people-shared-addresses/batch-load-users-safe.rb +81 -0
  75. data/examples/random-people-shared-addresses/batch-load-users.rb +59 -63
  76. data/examples/random-people-shared-addresses/xampl-gen.rb +2 -0
  77. data/examples/read-testing/.gitignore +2 -0
  78. data/examples/read-testing/rrr.rb +2 -1
  79. data/examples/read-testing/xampl-gen.rb +2 -0
  80. data/examples/tokyo-cabinet-experimental/.gitignore +2 -0
  81. data/examples/tokyo-cabinet-experimental/xampl-gen.rb +2 -0
  82. data/examples/write-testing/README +4 -0
  83. data/examples/write-testing/RESULTS.home +33 -0
  84. data/examples/write-testing/RESULTS.raconteur +33 -0
  85. data/examples/write-testing/write-speed-test.rb +40 -0
  86. data/lib/xamplr/.cvsignore +1 -0
  87. data/lib/xamplr/TODO +2 -1
  88. data/lib/xamplr/exceptions.rb +24 -1
  89. data/lib/xamplr/from-xml.rb +13 -5
  90. data/lib/xamplr/graphml-out.rb +6 -25
  91. data/lib/xamplr/indexed-array.rb +10 -2
  92. data/lib/xamplr/persist-to-xml.rb +6 -7
  93. data/lib/xamplr/persistence.rb +132 -48
  94. data/lib/xamplr/persister.rb +48 -25
  95. data/lib/xamplr/persisters/filesystem.rb +8 -2
  96. data/lib/xamplr/persisters/tokyo-cabinet.rb +243 -63
  97. data/lib/xamplr/persisters/tokyo-cabinet.rb.1-DB +694 -0
  98. data/lib/xamplr/persisters/tokyo-cabinet.rb.N-DB +692 -0
  99. data/lib/xamplr/persisters/tokyo-cabinet.rb.NICE-TRY +807 -0
  100. data/lib/xamplr/templates/.cvsignore +3 -0
  101. data/lib/xamplr/templates/child_indexed.template +6 -6
  102. data/lib/xamplr/templates/element_data.template +2 -1
  103. data/lib/xamplr/templates/element_empty.template +2 -10
  104. data/lib/xamplr/templates/element_mixed.template +2 -1
  105. data/lib/xamplr/templates/element_simple.template +2 -1
  106. data/lib/xamplr/templates/package.template +13 -1
  107. data/lib/xamplr/visitor.rb +7 -6
  108. data/lib/xamplr/visitors.rb +2 -1
  109. data/lib/xamplr/xampl-cl-gen.rb +89 -0
  110. data/lib/xamplr/xampl-generator.rb +86 -50
  111. data/lib/xamplr/xampl-object.rb +51 -0
  112. data/lib/xamplr/xampl-persisted-object.rb +13 -4
  113. data/lib/xamplr/yuml-out.rb +129 -0
  114. data/lib/xamplr-generator.rb +0 -1
  115. data/lib/xamplr.rb +18 -18
  116. data/regression/tc-indexes-crossing-pid-boundaries/Makefile +14 -0
  117. data/regression/tc-indexes-crossing-pid-boundaries/bad-idea.rb +40 -0
  118. data/regression/tc-indexes-crossing-pid-boundaries/fail-badly.rb +17 -0
  119. data/regression/tc-indexes-crossing-pid-boundaries/fail.rb +11 -0
  120. data/regression/tc-indexes-crossing-pid-boundaries/fucking-bad-idea.rb +44 -0
  121. data/regression/tc-indexes-crossing-pid-boundaries/setup.rb +15 -0
  122. data/regression/tc-indexes-crossing-pid-boundaries/xml/bad-idea.xml +4 -0
  123. data/regression/tightly-nested-mutual-mentions/Makefile +14 -0
  124. data/regression/tightly-nested-mutual-mentions/build.rb +31 -0
  125. data/regression/tightly-nested-mutual-mentions/load.rb +21 -0
  126. data/regression/tightly-nested-mutual-mentions/repo-keep.tgz +0 -0
  127. data/regression/tightly-nested-mutual-mentions/setup.rb +8 -0
  128. data/regression/tightly-nested-mutual-mentions/xampl-gen.rb +36 -0
  129. data/regression/tightly-nested-mutual-mentions/xml/stuff.xml +7 -0
  130. data/xamplr.gemspec +322 -0
  131. metadata +116 -13
  132. data/test/test_helper.rb +0 -10
  133. data/test/xamplr_test.rb +0 -7
@@ -8,6 +8,8 @@ if $0 == __FILE__ then
8
8
  end
9
9
  end
10
10
 
11
+ $LOAD_PATH.unshift('../../lib/')
12
+
11
13
  require 'xamplr-generator'
12
14
 
13
15
  include XamplGenerator
@@ -0,0 +1,4 @@
1
+
2
+ -- raconteur.info is about 114 times faster writing unsynced
3
+ -- raconteur.info is about 12 times faster writing synced
4
+
@@ -0,0 +1,33 @@
1
+ time puts: 0.004565
2
+ time puts: 0.001416
3
+ time puts: 0.001879
4
+ time puts: 0.000844
5
+ time puts: 0.000763
6
+ time puts: 0.000973
7
+ time puts: 0.000936
8
+ time puts: 0.000788
9
+ time puts: 0.000849
10
+ time puts: 0.000917
11
+ TOTAL: 0.033575
12
+ time sync write: 0.045199
13
+ time sync write: 0.149448
14
+ time sync write: 0.110496
15
+ time sync write: 0.121815
16
+ time sync write: 0.133079
17
+ time sync write: 0.122049
18
+ time sync write: 0.122168
19
+ time sync write: 0.132572
20
+ time sync write: 0.110322
21
+ time sync write: 0.133309
22
+ TOTAL: 1.188656
23
+ time write: 0.004363
24
+ time write: 0.000237
25
+ time write: 0.000394
26
+ time write: 0.000243
27
+ time write: 0.000378
28
+ time write: 0.000506
29
+ time write: 0.000242
30
+ time write: 0.000377
31
+ time write: 0.000743
32
+ time write: 0.000599
33
+ TOTAL: 0.009168
@@ -0,0 +1,33 @@
1
+ time print: 9.2e-05
2
+ time print: 6.0e-05
3
+ time print: 5.3e-05
4
+ time print: 5.4e-05
5
+ time print: 5.8e-05
6
+ time print: 5.4e-05
7
+ time print: 5.3e-05
8
+ time print: 6.1e-05
9
+ time print: 5.4e-05
10
+ time print: 5.2e-05
11
+ TOTAL: 0.00077
12
+ time sync write: 0.002917
13
+ time sync write: 0.00076
14
+ time sync write: 0.00077
15
+ time sync write: 0.001231
16
+ time sync write: 0.000767
17
+ time sync write: 0.000771
18
+ time sync write: 0.000768
19
+ time sync write: 0.000773
20
+ time sync write: 0.000782
21
+ time sync write: 0.000761
22
+ TOTAL: 0.010476
23
+ time write: 7.9e-05
24
+ time write: 6.9e-05
25
+ time write: 7.5e-05
26
+ time write: 7.6e-05
27
+ time write: 5.2e-05
28
+ time write: 5.2e-05
29
+ time write: 5.2e-05
30
+ time write: 5.2e-05
31
+ time write: 5.5e-05
32
+ time write: 5.3e-05
33
+ TOTAL: 0.000767
@@ -0,0 +1,40 @@
1
+
2
+ is_darwin = RUBY_PLATFORM.include? 'darwin'
3
+
4
+ #output = (1..1000000).to_a.inspect
5
+ output = (1..1000).to_a.inspect
6
+
7
+ file_name = "./junk.out"
8
+
9
+ ss = Time.now
10
+ 10.times do | i |
11
+ s = Time.now
12
+ File.open("./junk-a-#{ i }.out", 'w') { | f | f.print output; f.fsync }
13
+ puts "time puts: #{ Time.now - s }"
14
+ end
15
+
16
+ puts "TOTAL: #{ Time.now - ss}\n"
17
+
18
+ ss = Time.now
19
+ 10.times do | i |
20
+ s = Time.now
21
+ File.open("./junk-b-#{ i }.out", 'w') do | f |
22
+ f.write output
23
+ f.fsync
24
+ if is_darwin then
25
+ f.fcntl(51, 0) # Attempt an F_FULLFSYNC fcntl to commit data to disk
26
+ end
27
+ end
28
+ puts "time sync write: #{ Time.now - s }"
29
+ end
30
+
31
+ puts "TOTAL: #{ Time.now - ss}\n"
32
+
33
+ ss = Time.now
34
+ 10.times do | i |
35
+ s = Time.now
36
+ File.open("./junk-b-#{ i }.out", 'w') { | f | f.write output }
37
+ puts "time write: #{ Time.now - s }"
38
+ end
39
+
40
+ puts "TOTAL: #{ Time.now - ss}\n"
@@ -0,0 +1 @@
1
+ .cvs.log
data/lib/xamplr/TODO CHANGED
@@ -1 +1,2 @@
1
- -- escaped content is being repeatedly escaped (confirm, just a suspiscion from a long time ago)
1
+ -- use the libxml form of escape attrs (look for apos)
2
+
@@ -1,4 +1,3 @@
1
-
2
1
  module Xampl
3
2
 
4
3
  class XamplIsInvalid < Exception
@@ -58,6 +57,18 @@ module Xampl
58
57
  end
59
58
  end
60
59
 
60
+ class ReturnOrThrowInTransaction < Exception
61
+ attr_reader :xampl
62
+
63
+ def initialize(xampl=nil)
64
+ @xampl = xampl
65
+ end
66
+
67
+ def message
68
+ "attempt to change #{@xampl}, pid: #{@xampl.get_the_index}, oid: #{@xampl.object_id} when changes are blocked"
69
+ end
70
+ end
71
+
61
72
  class UnmanagedChange < Exception
62
73
  attr_reader :xampl
63
74
 
@@ -82,6 +93,18 @@ module Xampl
82
93
  end
83
94
  end
84
95
 
96
+ class IncompatiblePersisterConfiguration < Exception
97
+ attr_reader :msg
98
+
99
+ def initialize(persister_kind, feature_name)
100
+ @msg = "persister kind #{persister_kind}:: requested feature: #{feature_name}"
101
+ end
102
+
103
+ def message
104
+ @msg
105
+ end
106
+ end
107
+
85
108
  class MixedPersisters < Exception
86
109
  attr_reader :msg
87
110
 
@@ -4,9 +4,9 @@ module Xampl
4
4
 
5
5
  class FromXML
6
6
 
7
- attr :checkWellFormed, false
8
- attr :is_realising, false
9
- attr :tokenise_content, false
7
+ attr :checkWellFormed #1.9.1 , false
8
+ attr :is_realising #1.9.1 , false
9
+ attr :tokenise_content #1.9.1 , false
10
10
 
11
11
  @reader = nil
12
12
 
@@ -65,7 +65,8 @@ module Xampl
65
65
  LibXML::XML::Parser::Options::NONET |
66
66
  LibXML::XML::Parser::Options::NOCDATA |
67
67
  LibXML::XML::Parser::Options::DTDATTR |
68
- LibXML::XML::Parser::Options::COMPACT)
68
+ # LibXML::XML::Parser::Options::COMPACT |
69
+ 0)
69
70
  #TODO CLOSE THIS THING!!
70
71
  end
71
72
 
@@ -81,7 +82,8 @@ module Xampl
81
82
  LibXML::XML::Parser::Options::NONET |
82
83
  LibXML::XML::Parser::Options::NOCDATA |
83
84
  LibXML::XML::Parser::Options::DTDATTR |
84
- LibXML::XML::Parser::Options::COMPACT)
85
+ # LibXML::XML::Parser::Options::COMPACT) |
86
+ 0)
85
87
  #TODO CLOSE THIS THING!!
86
88
  end
87
89
 
@@ -355,7 +357,13 @@ TODO -- can these ever happen?
355
357
 
356
358
  #describe_current_element_type
357
359
 
360
+ #TODO -- get rid of this, it is for debugging only
361
+ begin
358
362
  okay = @reader.read
363
+ rescue => e
364
+ puts "WHAT???? #{ e }"
365
+ raise e
366
+ end
359
367
 
360
368
  @just_opened_an_element = start_element?
361
369
  @insert_end_element = (@just_opened_an_element and @reader.empty_element?)
@@ -9,13 +9,6 @@ module XamplGenerator
9
9
  @elements_map = elements_map
10
10
  end
11
11
 
12
- def devise_filename(filename)
13
- bn = File.basename(filename)
14
- ext = File.extname(bn)
15
- bn = bn[0..(bn.size - ext.size - 1)]
16
- fn = "#{bn}.graphml"
17
- end
18
-
19
12
  def generate_class_nodes(element, include_mixins)
20
13
 
21
14
  node = @element_to_node_map[element.nstag]
@@ -83,20 +76,8 @@ module XamplGenerator
83
76
  return false
84
77
  end
85
78
 
86
- # def ignore_package(package)
87
- # puts "#{File.basename(__FILE__)}:#{__LINE__} pkg: [#{ package }], exclude: #{ @excluded_packages.inspect }, include: #{ @included_packages.inspect }"
88
- # r = ignore_package_work(package)
89
- # puts "#{File.basename(__FILE__)}:#{__LINE__} ignore? #{ r }"
90
- # r
91
- # end
92
-
93
- #def write_graph_ml(filename, excluded_packages=[ 'C2', 'NavRelationships', 'App' ], included_packages=nil, include_mixins=false)
94
- def write_graph_ml(filename, excluded_packages=[ ], included_packages=nil, include_mixins=true)
95
-
96
- #puts "#{File.basename(__FILE__)}:#{__LINE__} no graphml yet"
97
- #return
98
-
99
- filename = devise_filename(filename)
79
+ def write_graph_ml(base_filename, excluded_packages=[ ], included_packages=nil, include_mixins=true)
80
+ filename = "#{base_filename}.graphml"
100
81
 
101
82
  @excluded_packages = Set.new(excluded_packages)
102
83
  @included_packages = included_packages ? Set.new(included_packages) : nil
@@ -386,8 +367,8 @@ EOS
386
367
  def write_mixin_ref_edge(edge, class_node, mixin_node)
387
368
  @out << <<EOS
388
369
  <edge id="e#{ edge }"
389
- source="n#{ class_node }"
390
- target="n#{ mixin_node }">
370
+ source="n#{ mixin_node }"
371
+ target="n#{ class_node }">
391
372
  <data key="d2">
392
373
  <y:PolyLineEdge>
393
374
  <y:Path sx="0.0"
@@ -397,8 +378,8 @@ EOS
397
378
  <y:LineStyle color="#000000"
398
379
  type="line"
399
380
  width="1.0"/>
400
- <y:Arrows source="none"
401
- target="white_delta"/>
381
+ <y:Arrows source="white_delta"
382
+ target="none"/>
402
383
  <y:EdgeLabel alignment="center"
403
384
  distance="2.0"
404
385
  fontFamily="Dialog"
@@ -48,14 +48,22 @@ class IndexedArray
48
48
  if String === index or Symbol === index then
49
49
  pos = @map.delete(index)
50
50
  if pos then
51
- @map.each{ | k, v| @map[k] = (v - 1) if pos < v }
51
+ # @map.each{ | k, v| @map[k] = (v - 1) if pos < v }
52
+ @map.keys.each do |k|
53
+ v = @map[k]
54
+ @map[k] = (v - 1) if pos < v
55
+ end
52
56
  return @store.delete_at(pos)
53
57
  end
54
58
  else
55
59
  key = @map.index(index)
56
60
  pos = @map.delete(key) if key
57
61
  if pos then
58
- @map.each{ | k, v | @map[k] = (v - 1) if pos < v }
62
+ # @map.each{ | k, v | @map[k] = (v - 1) if pos < v }
63
+ @map.keys.each do |k|
64
+ v = @map[k]
65
+ @map[k] = (v - 1) if pos < v
66
+ end
59
67
  return @store.delete_at(pos)
60
68
  end
61
69
  end
@@ -43,7 +43,9 @@ module Xampl
43
43
  return prefix
44
44
  end
45
45
 
46
- def attr_esc(s)
46
+ def attr_esc_fast(s)
47
+ #NOTE -- there are known issues with using Ruby 1.9.1 and libxml-ruby, which this is using. Seems to mostly
48
+ # be related to DOM and XPATH but...
47
49
  unless defined?(@@doc) then
48
50
  @@doc = LibXML::XML::Document.new()
49
51
  @@doc.root = LibXML::XML::Node.new('r')
@@ -54,10 +56,7 @@ module Xampl
54
56
  (@@doc.root.to_s)[6..-4]
55
57
  end
56
58
 
57
-
58
- =begin
59
-
60
- def attr_esc_old(s)
59
+ def attr_esc_slow(s)
61
60
  if (s.kind_of? XamplObject)
62
61
  return attr_esc(s.to_xml)
63
62
  end
@@ -75,8 +74,7 @@ module Xampl
75
74
  return result
76
75
  end
77
76
 
78
- =end
79
-
77
+ alias attr_esc attr_esc_fast
80
78
 
81
79
  # def content_esc(s)
82
80
  # #NO! the attribute has the right to compact white space
@@ -98,6 +96,7 @@ module Xampl
98
96
 
99
97
  result.gsub!("&", "&amp;")
100
98
  result.gsub!("<", "&lt;")
99
+ result.gsub!(">", "&gt;")
101
100
 
102
101
  return result
103
102
  end
@@ -1,4 +1,3 @@
1
-
2
1
  require 'sync'
3
2
 
4
3
  module Xampl
@@ -24,6 +23,7 @@ module Xampl
24
23
  end
25
24
 
26
25
  def Xampl.register_persister_kind(klass)
26
+ #puts "#{ __FILE__ }:#{ __LINE__ } [#{__method__}] REGISTER: #{ klass.kind } --> #{ klass }"
27
27
  @@persister_kinds[klass.kind] = klass
28
28
  end
29
29
 
@@ -37,28 +37,49 @@ module Xampl
37
37
  @@persister = nil
38
38
  end
39
39
 
40
- @@default_persister_kind = :simple
41
- @@default_persister_format = :xml_format
40
+ $is_darwin = RUBY_PLATFORM.include? 'darwin'
41
+
42
+ @@factory_default_persister_options = {
43
+ :kind => :simple,
44
+ :format => :xml_format
45
+ }
46
+ @@default_persister_options = {}.merge(@@factory_default_persister_options)
47
+
48
+ def Xampl.default_persister_options
49
+ {}.merge(@@default_persister_options)
50
+ end
51
+
52
+ def Xampl.raw_persister_options
53
+ @@default_persister_options
54
+ end
55
+
56
+ def Xampl.set_default_persister_properties(options)
57
+ if options[:reset] then
58
+ @@default_persister_options = @@factory_default_persister_options.merge(options)
59
+ else
60
+ @@default_persister_options = @@default_persister_options.merge(options)
61
+ end
62
+ end
42
63
 
43
64
  def Xampl.default_persister_kind
44
- @@default_persister_kind
65
+ @@default_persister_options[:kind]
45
66
  end
67
+
46
68
  def Xampl.set_default_persister_kind(kind)
47
- @@default_persister_kind = kind
48
- #puts "SET KIND format: #{@@default_persister_format}, kind: #{@@default_persister_kind}"
69
+ @@default_persister_options[:kind] = kind
49
70
  end
50
71
 
51
72
  def Xampl.default_persister_format
52
- @@default_persister_format
73
+ @@default_persister_options[:format]
53
74
  end
75
+
54
76
  def Xampl.set_default_persister_format(format)
55
- @@default_persister_format = format
56
- #puts "SET FORMAT format: #{@@default_persister_format}, kind: #{@@default_persister_kind}"
77
+ @@default_persister_options[:format] = format
57
78
  end
58
79
 
59
80
  def Xampl.enable_persister(name, kind=nil, format=nil)
60
- kind = kind || @@default_persister_kind
61
- format = format || @@default_persister_format
81
+ kind = kind || Xampl.default_persister_kind
82
+ format = format || Xampl.default_persister_format
62
83
  @@persister = @@known_persisters[name]
63
84
 
64
85
  if @@persister then
@@ -68,7 +89,6 @@ module Xampl
68
89
  kind = @@persister.kind || kind
69
90
  format = @@persister.format || format
70
91
 
71
- #raise XamplException.new(:live_across_rollback) if @@persister.rolled_back
72
92
  if kind and kind != @@persister.kind then
73
93
  raise IncompatiblePersisterRequest.new(@@persister, "kind", kind, @@persister.kind)
74
94
  end
@@ -78,7 +98,8 @@ module Xampl
78
98
  end
79
99
 
80
100
  unless @@persister then
81
- # puts "CREATE PERSISTER #{name}, format: #{format}, kind: #{kind}"
101
+ # puts "CREATE PERSISTER #{name}, format: #{format}, kind: #{kind}"
102
+ # puts "#{ __FILE__ }:#{ __LINE__ } [#{__method__}] kinds available: #{ @@persister_kinds.keys.inspect }"
82
103
  @@persister = @@persister_kinds[kind].new(name, format)
83
104
  if (nil != name) then
84
105
  @@known_persisters[name] = @@persister
@@ -90,7 +111,7 @@ module Xampl
90
111
 
91
112
  def Xampl.print_known_persisters
92
113
  puts "Known Persisters:: --------------------------"
93
- @@known_persisters.each { | n, k | puts " #{n} #{k}" }
114
+ @@known_persisters.each { | n, k | puts " #{n} #{k}" }
94
115
  puts "---------------------------------------------"
95
116
  end
96
117
 
@@ -104,7 +125,7 @@ module Xampl
104
125
  def Xampl.drop_all_persisters(verbose=false)
105
126
  puts "Drop All Persisters:: --------------------------" if verbose
106
127
  @@known_persisters.each do |name, persister|
107
- puts " #{ name } #{ persister.class.name }" if verbose
128
+ puts " #{ name } #{ persister.class.name }" if verbose
108
129
  next if persister == @@persister
109
130
  persister.close
110
131
  persister.clear_cache
@@ -123,9 +144,28 @@ module Xampl
123
144
  Xampl.print_known_persisters
124
145
  end
125
146
 
147
+ def Xampl.add_lexical_indexs(indexes)
148
+ case Xampl.default_persister_kind
149
+ when :tokyo_cabinet then
150
+ Xampl::TokyoCabinetPersister.add_lexical_indexs(indexes)
151
+ else
152
+ raise IncompatiblePersisterConfiguration.new(Xampl.default_persister_kind, "lexical_indexes")
153
+ end
154
+ end
155
+
156
+ def Xampl.add_numerical_indexs(indexes)
157
+ case Xampl.default_persister_kind
158
+ when :tokyo_cabinet then
159
+ Xampl::TokyoCabinetPersister.add_numerical_indexs(indexes)
160
+ else
161
+ raise IncompatiblePersisterConfiguration.new(Xampl.default_persister_kind, "numerical_indexs")
162
+ end
163
+ end
164
+
126
165
  @@xampl_lock = Sync.new
127
166
 
128
167
  @@verbose_transactions = true
168
+
129
169
  def Xampl.verboseTransactions(v)
130
170
  @@verbose_transactions = v
131
171
  end
@@ -141,40 +181,80 @@ module Xampl
141
181
 
142
182
  if block_given? then
143
183
  @@xampl_lock.synchronize(:EX) do
144
- initial_persister = @@persister
145
- Xampl.enable_persister(name, kind, format)
146
-
147
- rollback = true
148
- exception = nil
149
- original_automatic = @@persister.automatic
150
-
184
+ # if true then
151
185
  begin
152
- #TODO -- impose some rules on nested transactions/enable_persisters??
153
-
154
- Xampl.auto_persistence(automatic)
155
- result = yield
156
- Xampl.block_future_changes(true)
157
- Xampl.sync
158
- rollback = false
159
- return result
160
- rescue => e
161
- exception = e
162
- ensure
163
- Xampl.block_future_changes(false)
164
- Xampl.auto_persistence(original_automatic)
165
- if rollback then
166
- if exception then
167
- puts "ROLLBACK(#{__LINE__}):: #{exception}" if rollback and @@verbose_transactions
168
- #print exception.backtrace.join("\n") if rollback
169
- raise exception
170
- else
171
- if @@verbose_transactions and rollback then
172
- puts "ROLLBACK(#{__LINE__}):: UNKNOWN CAUSE" if rollback
186
+ # @@xampl_lock.sync_lock(:EX)
187
+ initial_persister = @@persister
188
+ Xampl.enable_persister(name, kind, format)
189
+
190
+ rollback = true
191
+ exception = nil
192
+ original_automatic = @@persister.automatic
193
+
194
+ begin
195
+ #TODO -- impose some rules on nested transactions/enable_persisters??
196
+
197
+ Xampl.auto_persistence(automatic)
198
+ result = yield
199
+ Xampl.block_future_changes(true)
200
+ Xampl.sync
201
+ rollback = false
202
+ return result
203
+ rescue => e
204
+ exception = e
205
+ ensure
206
+ Xampl.block_future_changes(false)
207
+ Xampl.auto_persistence(original_automatic)
208
+ if rollback then
209
+ # we get here if the transaction block finishes early
210
+ if exception then
211
+ # the early finish was caused by an exception
212
+ puts "ROLLBACK(#{__LINE__}):: #{exception}" if rollback and @@verbose_transactions
213
+ raise exception
214
+ else
215
+ # How could we have arrived at this point???
216
+ # Well, I don't know all the reasons, but the ones I do know are:
217
+ # - return was used in the block passed into the transaction
218
+ # - a throw was made
219
+ # There's no way that I know of to distinguish, so, assume that the transaction worked
220
+ # 20091202 -- well maybe not...
221
+
222
+ # Xampl.rollback # this is bad
223
+ rollback = true
224
+ # raise ReturnOrThrowInTransaction
225
+ STDERR.puts "---------"
226
+ STDERR.puts "Either a return or a throw from a transaction. The DB is possibly not synced."
227
+ caller(0).each do |trace|
228
+ STDERR.puts(trace)
229
+ end
230
+ STDERR.puts "---------"
231
+
232
+ =begin
233
+
234
+ begin
235
+ puts "#{ __FILE__ }:#{ __LINE__ } [#{__method__}] "
236
+ Xampl.block_future_changes(true)
237
+ puts "#{ __FILE__ }:#{ __LINE__ } [#{__method__}] "
238
+ Xampl.sync
239
+ rollback = false
240
+ rescue => e
241
+ puts "#{ __FILE__ }:#{ __LINE__ } [#{__method__}] "
242
+ # so we know the persister had a problem
243
+ puts "PERSISTER ERROR(#{__LINE__}) #{ e }"
244
+ ensure
245
+ puts "#{ __FILE__ }:#{ __LINE__ } [#{__method__}] "
246
+ Xampl.block_future_changes(false)
247
+ end
248
+
249
+ =end
173
250
  end
174
251
  end
252
+ Xampl.rollback if rollback
253
+ @@persister = initial_persister
175
254
  end
176
- Xampl.rollback if rollback
177
- @@persister = initial_persister
255
+ raise exception if exception
256
+ # ensure
257
+ # @@xampl_lock.sync_unlock
178
258
  end
179
259
  end
180
260
  end
@@ -216,11 +296,15 @@ module Xampl
216
296
  if 0 == @changed.size then
217
297
  @changed = original_changed
218
298
 
219
- if rollback then
299
+ if exception then
220
300
  puts "ROLLBACK(#{__LINE__}):: #{exception}"
221
- print exception.backtrace.join("\n")
222
- Xampl.rollback
301
+ print exception.backtrace.join("\n") if exception
223
302
  end
303
+
304
+ #no change so don't bother with rollback
305
+ # if rollback then
306
+ # Xampl.rollback
307
+ # end
224
308
  @@persister = initial_persister
225
309
  else
226
310
  puts "CHANGED COUNT: #{@changed.size}"