xamplr 1.2.0 → 1.3.15
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +12 -0
- data/CHANGES.txt +37 -0
- data/COPYING +661 -0
- data/Makefile +13 -0
- data/README.rdoc +24 -4
- data/Rakefile +2 -2
- data/VERSION.yml +3 -2
- data/bin/xampl-gen +17 -0
- data/docs/intro/.gitignore +1 -0
- data/docs/intro/example1/example1.rb +6 -0
- data/docs/intro/example1/xml/hello.xml +1 -0
- data/docs/intro/example2/example2.rb +38 -0
- data/docs/intro/example2/project-generator.rb +22 -0
- data/docs/intro/example2/xml/hello.xml +2 -0
- data/docs/intro/example3/example3.rb +30 -0
- data/docs/intro/example3/example3a.rb +16 -0
- data/docs/intro/example3/generated.png +0 -0
- data/docs/intro/example3/grab-yuml.rb +10 -0
- data/docs/intro/example3/greeter.rb +15 -0
- data/docs/intro/example3/greeting.rb +9 -0
- data/docs/intro/example3/project-generator.rb +25 -0
- data/docs/intro/example3/xml/greeter.xml +6 -0
- data/docs/intro/example4/example4.rb +27 -0
- data/docs/intro/example4/example4a.rb +19 -0
- data/docs/intro/example4/grab-yuml.rb +10 -0
- data/docs/intro/example4/greeter.rb +15 -0
- data/docs/intro/example4/greeting.rb +9 -0
- data/docs/intro/example4/project-generator.rb +25 -0
- data/docs/intro/example4/xml/greeter.xml +6 -0
- data/docs/intro/grab-yuml.rb +10 -0
- data/docs/intro/project-generator.rb +51 -0
- data/docs/intro/xampl.lyx +1494 -0
- data/docs/intro/xampl.pdf +0 -0
- data/examples/employees/final/xampl-gen.rb +38 -0
- data/examples/employees/final/xml/ddd-final.xml +86 -0
- data/examples/employees/final-xampl/xampl-gen.rb +38 -0
- data/examples/employees/final-xampl/xml/ddd-final-xampl.xml +86 -0
- data/examples/employees/first/xampl-gen.rb +38 -0
- data/examples/employees/first/xml/ddd-first.xml +48 -0
- data/examples/employees/twist/twist.graphml +333 -0
- data/examples/employees/twist/xampl-gen.rb +38 -0
- data/examples/employees/twist/xml/twist.xml +90 -0
- data/examples/employees/xamplr-twist.xml +2 -0
- data/examples/employees/yuml-diagrams/DDD-final-approach.graphml +393 -0
- data/examples/employees/yuml-diagrams/DDD-final-xampl-approach.graphml +265 -0
- data/examples/employees/yuml-diagrams/DDD-ideal-final-approach.graphml +357 -0
- data/examples/employees/yuml-diagrams/ddd-final.png +0 -0
- data/examples/employees/yuml-diagrams/ddd-final.yuml +8 -0
- data/examples/employees/yuml-diagrams/ddd-first.png +0 -0
- data/examples/employees/yuml-diagrams/ddd-first.yuml +7 -0
- data/examples/employees/yuml-diagrams/final-yed.png +0 -0
- data/examples/employees/yuml-diagrams/first-yed.png +0 -0
- data/examples/employees/yuml-diagrams/twist.png +0 -0
- data/examples/employees/yuml-diagrams/twist.yuml +12 -0
- data/examples/employees/yuml-diagrams/xamplr-final-no-mixins.png +0 -0
- data/examples/employees/yuml-diagrams/xamplr-final-simplified.png +0 -0
- data/examples/employees/yuml-diagrams/xamplr-final-with-mixins.png +0 -0
- data/examples/employees/yuml-diagrams/yuml-simplified.txt +19 -0
- data/examples/employees/yuml-diagrams/yuml-with-mixins.txt +53 -0
- data/examples/employees/yuml-diagrams/yuml.txt +27 -0
- data/examples/hobbies/Makefile +5 -0
- data/examples/hobbies/hobbies.rb +193 -0
- data/examples/hobbies/project-generator.rb +25 -0
- data/examples/hobbies/xampl-gen.rb +38 -0
- data/examples/hobbies/xml/hobby.xml +3 -0
- data/examples/hobbies/xml/people.xml +5 -0
- data/examples/random-people/.gitignore +2 -0
- data/examples/random-people/Makefile +5 -1
- data/examples/random-people/xampl-gen.rb +5 -2
- data/examples/random-people-shared-addresses/.gitignore +2 -0
- data/examples/random-people-shared-addresses/Makefile +8 -9
- data/examples/random-people-shared-addresses/batch-load-users-profiled.rb +91 -0
- data/examples/random-people-shared-addresses/batch-load-users-safe.rb +81 -0
- data/examples/random-people-shared-addresses/batch-load-users.rb +59 -63
- data/examples/random-people-shared-addresses/xampl-gen.rb +2 -0
- data/examples/read-testing/.gitignore +2 -0
- data/examples/read-testing/rrr.rb +2 -1
- data/examples/read-testing/xampl-gen.rb +2 -0
- data/examples/tokyo-cabinet-experimental/.gitignore +2 -0
- data/examples/tokyo-cabinet-experimental/xampl-gen.rb +2 -0
- data/examples/write-testing/README +4 -0
- data/examples/write-testing/RESULTS.home +33 -0
- data/examples/write-testing/RESULTS.raconteur +33 -0
- data/examples/write-testing/write-speed-test.rb +40 -0
- data/lib/xamplr/.cvsignore +1 -0
- data/lib/xamplr/TODO +2 -1
- data/lib/xamplr/exceptions.rb +24 -1
- data/lib/xamplr/from-xml.rb +13 -5
- data/lib/xamplr/graphml-out.rb +6 -25
- data/lib/xamplr/indexed-array.rb +10 -2
- data/lib/xamplr/persist-to-xml.rb +6 -7
- data/lib/xamplr/persistence.rb +132 -48
- data/lib/xamplr/persister.rb +48 -25
- data/lib/xamplr/persisters/filesystem.rb +8 -2
- data/lib/xamplr/persisters/tokyo-cabinet.rb +243 -63
- data/lib/xamplr/persisters/tokyo-cabinet.rb.1-DB +694 -0
- data/lib/xamplr/persisters/tokyo-cabinet.rb.N-DB +692 -0
- data/lib/xamplr/persisters/tokyo-cabinet.rb.NICE-TRY +807 -0
- data/lib/xamplr/templates/.cvsignore +3 -0
- data/lib/xamplr/templates/child_indexed.template +6 -6
- data/lib/xamplr/templates/element_data.template +2 -1
- data/lib/xamplr/templates/element_empty.template +2 -10
- data/lib/xamplr/templates/element_mixed.template +2 -1
- data/lib/xamplr/templates/element_simple.template +2 -1
- data/lib/xamplr/templates/package.template +13 -1
- data/lib/xamplr/visitor.rb +7 -6
- data/lib/xamplr/visitors.rb +2 -1
- data/lib/xamplr/xampl-cl-gen.rb +89 -0
- data/lib/xamplr/xampl-generator.rb +86 -50
- data/lib/xamplr/xampl-object.rb +51 -0
- data/lib/xamplr/xampl-persisted-object.rb +13 -4
- data/lib/xamplr/yuml-out.rb +129 -0
- data/lib/xamplr-generator.rb +0 -1
- data/lib/xamplr.rb +18 -18
- data/regression/tc-indexes-crossing-pid-boundaries/Makefile +14 -0
- data/regression/tc-indexes-crossing-pid-boundaries/bad-idea.rb +40 -0
- data/regression/tc-indexes-crossing-pid-boundaries/fail-badly.rb +17 -0
- data/regression/tc-indexes-crossing-pid-boundaries/fail.rb +11 -0
- data/regression/tc-indexes-crossing-pid-boundaries/fucking-bad-idea.rb +44 -0
- data/regression/tc-indexes-crossing-pid-boundaries/setup.rb +15 -0
- data/regression/tc-indexes-crossing-pid-boundaries/xml/bad-idea.xml +4 -0
- data/regression/tightly-nested-mutual-mentions/Makefile +14 -0
- data/regression/tightly-nested-mutual-mentions/build.rb +31 -0
- data/regression/tightly-nested-mutual-mentions/load.rb +21 -0
- data/regression/tightly-nested-mutual-mentions/repo-keep.tgz +0 -0
- data/regression/tightly-nested-mutual-mentions/setup.rb +8 -0
- data/regression/tightly-nested-mutual-mentions/xampl-gen.rb +36 -0
- data/regression/tightly-nested-mutual-mentions/xml/stuff.xml +7 -0
- data/xamplr.gemspec +322 -0
- metadata +116 -13
- data/test/test_helper.rb +0 -10
- data/test/xamplr_test.rb +0 -7
@@ -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
|
-
--
|
1
|
+
-- use the libxml form of escape attrs (look for apos)
|
2
|
+
|
data/lib/xamplr/exceptions.rb
CHANGED
@@ -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
|
|
data/lib/xamplr/from-xml.rb
CHANGED
@@ -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?)
|
data/lib/xamplr/graphml-out.rb
CHANGED
@@ -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
|
-
|
87
|
-
|
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#{
|
390
|
-
target="n#{
|
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="
|
401
|
-
target="
|
381
|
+
<y:Arrows source="white_delta"
|
382
|
+
target="none"/>
|
402
383
|
<y:EdgeLabel alignment="center"
|
403
384
|
distance="2.0"
|
404
385
|
fontFamily="Dialog"
|
data/lib/xamplr/indexed-array.rb
CHANGED
@@ -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
|
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
|
-
|
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!("&", "&")
|
100
98
|
result.gsub!("<", "<")
|
99
|
+
result.gsub!(">", ">")
|
101
100
|
|
102
101
|
return result
|
103
102
|
end
|
data/lib/xamplr/persistence.rb
CHANGED
@@ -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
|
-
|
41
|
-
|
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
|
-
@@
|
65
|
+
@@default_persister_options[:kind]
|
45
66
|
end
|
67
|
+
|
46
68
|
def Xampl.set_default_persister_kind(kind)
|
47
|
-
@@
|
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
|
-
@@
|
73
|
+
@@default_persister_options[:format]
|
53
74
|
end
|
75
|
+
|
54
76
|
def Xampl.set_default_persister_format(format)
|
55
|
-
@@
|
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 ||
|
61
|
-
format = 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
|
-
|
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 "
|
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 "
|
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
|
-
|
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
|
-
|
153
|
-
|
154
|
-
Xampl.
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
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
|
-
|
177
|
-
|
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
|
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}"
|