strokedb 0.0.2.1 → 0.0.2.2

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 (192) hide show
  1. data/README +18 -20
  2. data/bench.html +4001 -0
  3. data/bin/strokedb +14 -0
  4. data/examples/movies.rb +105 -0
  5. data/examples/movies2.rb +97 -0
  6. data/examples/strokewiki/README +28 -0
  7. data/examples/strokewiki/view/edit.xhtml +27 -0
  8. data/examples/strokewiki/view/new.xhtml +26 -0
  9. data/examples/strokewiki/view/pages.xhtml +27 -0
  10. data/examples/strokewiki/view/show.xhtml +40 -0
  11. data/examples/strokewiki/view/versions.xhtml +25 -0
  12. data/examples/strokewiki/wiki.rb +106 -0
  13. data/examples/todo.rb +92 -0
  14. data/lib/strokedb.rb +85 -0
  15. data/lib/{config → strokedb}/config.rb +14 -9
  16. data/lib/strokedb/console.rb +87 -0
  17. data/lib/strokedb/core_ext.rb +10 -0
  18. data/lib/{util/ext → strokedb/core_ext}/blank.rb +1 -1
  19. data/lib/{util/ext → strokedb/core_ext}/enumerable.rb +0 -0
  20. data/lib/{util/ext → strokedb/core_ext}/fixnum.rb +0 -0
  21. data/lib/strokedb/core_ext/float.rb +4 -0
  22. data/lib/{util/ext → strokedb/core_ext}/hash.rb +0 -0
  23. data/lib/strokedb/core_ext/infinity.rb +33 -0
  24. data/lib/strokedb/core_ext/kernel.rb +41 -0
  25. data/lib/strokedb/core_ext/object.rb +16 -0
  26. data/lib/{util/ext → strokedb/core_ext}/string.rb +28 -1
  27. data/lib/strokedb/core_ext/symbol.rb +13 -0
  28. data/lib/strokedb/data_structures.rb +5 -0
  29. data/lib/strokedb/data_structures/chunked_skiplist.rb +123 -0
  30. data/lib/{data_structures → strokedb/data_structures}/inverted_list.rb +0 -0
  31. data/lib/{data_structures → strokedb/data_structures}/point_query.rb +0 -0
  32. data/lib/strokedb/data_structures/simple_skiplist.rb +350 -0
  33. data/lib/{data_structures → strokedb/data_structures}/skiplist.rb +1 -1
  34. data/lib/{document → strokedb}/document.rb +180 -71
  35. data/lib/{document → strokedb/document}/callback.rb +0 -0
  36. data/lib/{document → strokedb/document}/delete.rb +2 -2
  37. data/lib/strokedb/document/dsl.rb +4 -0
  38. data/lib/{document → strokedb/document/dsl}/associations.rb +0 -0
  39. data/lib/{document → strokedb/document/dsl}/coercions.rb +0 -0
  40. data/lib/strokedb/document/dsl/meta_dsl.rb +7 -0
  41. data/lib/{document → strokedb/document/dsl}/validations.rb +26 -21
  42. data/lib/{document → strokedb/document/dsl}/virtualize.rb +0 -0
  43. data/lib/{document → strokedb/document}/meta.rb +92 -29
  44. data/lib/{document → strokedb/document}/slot.rb +17 -5
  45. data/lib/{document → strokedb/document}/util.rb +0 -0
  46. data/lib/{document → strokedb/document}/versions.rb +2 -2
  47. data/lib/strokedb/index.rb +2 -0
  48. data/lib/strokedb/nsurl.rb +24 -0
  49. data/lib/strokedb/store.rb +149 -0
  50. data/lib/strokedb/stores.rb +6 -0
  51. data/lib/{stores → strokedb/stores}/chainable_storage.rb +20 -14
  52. data/lib/strokedb/stores/file_storage.rb +118 -0
  53. data/lib/{stores/inverted_list_index → strokedb/stores}/inverted_list_file_storage.rb +50 -0
  54. data/lib/strokedb/stores/memory_storage.rb +80 -0
  55. data/lib/{stores → strokedb/stores}/remote_store.rb +10 -4
  56. data/lib/strokedb/sync.rb +4 -0
  57. data/lib/{sync → strokedb/sync}/chain_sync.rb +0 -0
  58. data/lib/{sync → strokedb/sync}/diff.rb +12 -1
  59. data/lib/{sync/stroke_diff → strokedb/sync/diff}/array.rb +1 -1
  60. data/lib/{sync/stroke_diff → strokedb/sync/diff}/default.rb +0 -0
  61. data/lib/{sync/stroke_diff → strokedb/sync/diff}/hash.rb +1 -1
  62. data/lib/{sync/stroke_diff → strokedb/sync/diff}/string.rb +1 -1
  63. data/lib/{sync → strokedb/sync}/lamport_timestamp.rb +0 -0
  64. data/lib/{sync → strokedb/sync}/store_sync.rb +15 -7
  65. data/lib/strokedb/transaction.rb +78 -0
  66. data/lib/{util → strokedb}/util.rb +14 -7
  67. data/lib/strokedb/util/attach_dsl.rb +29 -0
  68. data/lib/{util → strokedb/util}/blankslate.rb +0 -0
  69. data/lib/strokedb/util/class_optimization.rb +93 -0
  70. data/lib/{util → strokedb/util}/inflect.rb +0 -0
  71. data/lib/strokedb/util/java_util.rb +13 -0
  72. data/lib/{util → strokedb/util}/lazy_array.rb +0 -0
  73. data/lib/{util → strokedb/util}/lazy_mapping_array.rb +4 -0
  74. data/lib/{util → strokedb/util}/lazy_mapping_hash.rb +0 -0
  75. data/lib/{util → strokedb/util}/serialization.rb +21 -0
  76. data/lib/strokedb/util/uuid.rb +159 -0
  77. data/lib/{util → strokedb/util}/xml.rb +0 -0
  78. data/lib/{view → strokedb}/view.rb +2 -2
  79. data/lib/strokedb/volumes.rb +5 -0
  80. data/lib/strokedb/volumes/archive_volume.rb +165 -0
  81. data/lib/strokedb/volumes/block_volume.rb +169 -0
  82. data/lib/strokedb/volumes/distributed_pointer.rb +43 -0
  83. data/lib/strokedb/volumes/fixed_length_skiplist_volume.rb +109 -0
  84. data/lib/strokedb/volumes/map_volume.rb +268 -0
  85. data/meta/MANIFEST +175 -0
  86. data/script/console +2 -70
  87. data/spec/integration/remote_store_spec.rb +70 -0
  88. data/spec/integration/search_spec.rb +76 -0
  89. data/spec/integration/spec_helper.rb +1 -0
  90. data/spec/lib/spec_helper.rb +1 -0
  91. data/spec/lib/strokedb/config_spec.rb +250 -0
  92. data/spec/lib/strokedb/core_ext/blank_spec.rb +20 -0
  93. data/spec/lib/strokedb/core_ext/extract_spec.rb +42 -0
  94. data/spec/lib/strokedb/core_ext/float_spec.rb +62 -0
  95. data/spec/lib/strokedb/core_ext/infinity_spec.rb +40 -0
  96. data/spec/lib/strokedb/core_ext/spec_helper.rb +1 -0
  97. data/spec/lib/strokedb/core_ext/string_spec.rb +25 -0
  98. data/spec/lib/strokedb/core_ext/symbol_spec.rb +8 -0
  99. data/spec/lib/strokedb/data_structures/chunked_skiplist_spec.rb +144 -0
  100. data/spec/lib/strokedb/data_structures/inverted_list_spec.rb +172 -0
  101. data/spec/lib/strokedb/data_structures/simple_skiplist_spec.rb +200 -0
  102. data/spec/lib/strokedb/data_structures/skiplist_spec.rb +253 -0
  103. data/spec/lib/strokedb/data_structures/spec_helper.rb +1 -0
  104. data/spec/lib/strokedb/document/associations_spec.rb +319 -0
  105. data/spec/lib/strokedb/document/callbacks_spec.rb +134 -0
  106. data/spec/lib/strokedb/document/coercions_spec.rb +110 -0
  107. data/spec/lib/strokedb/document/document_spec.rb +1063 -0
  108. data/spec/lib/strokedb/document/meta_meta_spec.rb +30 -0
  109. data/spec/lib/strokedb/document/meta_spec.rb +435 -0
  110. data/spec/lib/strokedb/document/metaslot_spec.rb +43 -0
  111. data/spec/lib/strokedb/document/slot_spec.rb +130 -0
  112. data/spec/lib/strokedb/document/spec_helper.rb +1 -0
  113. data/spec/lib/strokedb/document/validations_spec.rb +1081 -0
  114. data/spec/lib/strokedb/document/virtualize_spec.rb +80 -0
  115. data/spec/lib/strokedb/nsurl_spec.rb +73 -0
  116. data/spec/lib/strokedb/spec_helper.rb +1 -0
  117. data/spec/lib/strokedb/stores/chained_storages_spec.rb +116 -0
  118. data/spec/lib/strokedb/stores/spec_helper.rb +1 -0
  119. data/spec/lib/strokedb/stores/store_spec.rb +201 -0
  120. data/spec/lib/strokedb/stores/transaction_spec.rb +107 -0
  121. data/spec/lib/strokedb/sync/chain_sync_spec.rb +43 -0
  122. data/spec/lib/strokedb/sync/diff_spec.rb +111 -0
  123. data/spec/lib/strokedb/sync/lamport_timestamp_spec.rb +174 -0
  124. data/spec/lib/strokedb/sync/slot_diff_spec.rb +164 -0
  125. data/spec/lib/strokedb/sync/spec_helper.rb +1 -0
  126. data/spec/lib/strokedb/sync/store_sync_spec.rb +181 -0
  127. data/spec/lib/strokedb/sync/stroke_diff/array_spec.rb +97 -0
  128. data/spec/lib/strokedb/sync/stroke_diff/complex_spec.rb +58 -0
  129. data/spec/lib/strokedb/sync/stroke_diff/hash_spec.rb +144 -0
  130. data/spec/lib/strokedb/sync/stroke_diff/scalar_spec.rb +23 -0
  131. data/spec/lib/strokedb/sync/stroke_diff/spec_helper.rb +25 -0
  132. data/spec/lib/strokedb/sync/stroke_diff/string_spec.rb +61 -0
  133. data/spec/lib/strokedb/util/attach_dsl_spec.rb +45 -0
  134. data/spec/lib/strokedb/util/inflect_spec.rb +14 -0
  135. data/spec/lib/strokedb/util/lazy_array_spec.rb +157 -0
  136. data/spec/lib/strokedb/util/lazy_mapping_array_spec.rb +174 -0
  137. data/spec/lib/strokedb/util/lazy_mapping_hash_spec.rb +92 -0
  138. data/spec/lib/strokedb/util/spec_helper.rb +1 -0
  139. data/spec/lib/strokedb/util/uuid_spec.rb +46 -0
  140. data/spec/lib/strokedb/view_spec.rb +228 -0
  141. data/spec/lib/strokedb/volumes/archive_volume_spec.rb +105 -0
  142. data/spec/lib/strokedb/volumes/block_volume_spec.rb +100 -0
  143. data/spec/lib/strokedb/volumes/distributed_pointer_spec.rb +14 -0
  144. data/spec/lib/strokedb/volumes/fixed_length_skiplist_volume_spec.rb +177 -0
  145. data/spec/lib/strokedb/volumes/map_volume_spec.rb +172 -0
  146. data/spec/lib/strokedb/volumes/spec_helper.rb +1 -0
  147. data/spec/regression/docref_spec.rb +94 -0
  148. data/spec/regression/meta_spec.rb +23 -0
  149. data/spec/regression/spec_helper.rb +1 -0
  150. data/spec/regression/sync_spec.rb +36 -0
  151. data/spec/spec.opts +7 -0
  152. data/spec/spec_helper.rb +37 -0
  153. data/spec/temp/storages/TIMESTAMP +1 -0
  154. data/spec/temp/storages/UUID +1 -0
  155. data/spec/temp/storages/database-sync/TIMESTAMP +1 -0
  156. data/spec/temp/storages/database-sync/UUID +1 -0
  157. data/spec/temp/storages/database-sync/config +1 -0
  158. data/spec/temp/storages/database-sync/file/LAST +1 -0
  159. data/spec/temp/storages/database-sync/file/bd/f6/bdf675e5-8a7b-494e-97f2-f74a14ccd95d.av +0 -0
  160. data/spec/temp/storages/database-sync/file/uindex.wal +0 -0
  161. data/spec/temp/storages/database-sync/inverted_list_file/INVERTED_INDEX +1 -0
  162. data/spec/temp/storages/inverted_list_storage/INVERTED_INDEX +0 -0
  163. data/strokedb.gemspec +120 -0
  164. data/task/benchmark.task +9 -0
  165. data/task/ditz.task +30 -0
  166. data/task/echoe.rb +17 -0
  167. data/task/rcov.task +50 -0
  168. data/task/rdoc.task +10 -0
  169. data/task/rspec.task +0 -0
  170. data/vendor/java_inline.rb +106 -0
  171. data/vendor/rbmodexcl/mrimodexcl.rb +82 -0
  172. data/vendor/rbmodexcl/rbmodexcl.rb +5 -0
  173. data/vendor/rbmodexcl/rbxmodexcl.rb +48 -0
  174. data/vendor/rbmodexcl/spec/unextend_spec.rb +50 -0
  175. data/vendor/rbmodexcl/spec/uninclude_spec.rb +26 -0
  176. metadata +271 -79
  177. data/CONTRIBUTORS +0 -7
  178. data/CREDITS +0 -13
  179. data/bin/sdbc +0 -2
  180. data/lib/init.rb +0 -57
  181. data/lib/stores/inverted_list_index/inverted_list_index.rb +0 -49
  182. data/lib/stores/skiplist_store/chunk.rb +0 -119
  183. data/lib/stores/skiplist_store/chunk_storage.rb +0 -21
  184. data/lib/stores/skiplist_store/file_chunk_storage.rb +0 -44
  185. data/lib/stores/skiplist_store/memory_chunk_storage.rb +0 -37
  186. data/lib/stores/skiplist_store/skiplist_store.rb +0 -217
  187. data/lib/stores/store.rb +0 -5
  188. data/lib/sync/stroke_diff/stroke_diff.rb +0 -9
  189. data/lib/util/ext/object.rb +0 -8
  190. data/lib/util/java_util.rb +0 -9
  191. data/lib/util/trigger_partition.rb +0 -136
  192. data/strokedb.rb +0 -75
@@ -1,3 +1,7 @@
1
+ require 'drb'
2
+ require 'drb/acl'
3
+ require 'drb/unix'
4
+
1
5
  module StrokeDB
2
6
  class Store
3
7
  def remote_server(addr, protocol=:drb)
@@ -29,9 +33,10 @@ module StrokeDB
29
33
  @server.search(*args).map{ |e| safe_document_from_undumped(e) }
30
34
  end
31
35
 
32
- def exists?(uuid, version=nil)
33
- @server.exists?(uuid, version)
36
+ def include?(uuid, version=nil)
37
+ @server.include?(uuid, version)
34
38
  end
39
+ alias_method :contains?, :include?
35
40
 
36
41
  def head_version(uuid)
37
42
  raw_doc = find(uuid,nil, :no_instantiation => true)
@@ -111,9 +116,10 @@ module StrokeDB
111
116
  @mutex.synchronize { @store.search(*args) }
112
117
  end
113
118
 
114
- def exists?(*args)
115
- !!@mutex.synchronize { @store.exists?(*args) }
119
+ def include?(*args)
120
+ !!@mutex.synchronize { @store.include?(*args) }
116
121
  end
122
+ alias_method :contains?, :include?
117
123
 
118
124
  def head_version(uuid)
119
125
  raw_doc = @mutex.synchronize { find(uuid, nil, :no_instantiation => true) }
@@ -0,0 +1,4 @@
1
+ require 'sync/diff'
2
+ require 'sync/chain_sync'
3
+ require 'sync/store_sync'
4
+ require 'sync/lamport_timestamp'
@@ -1,5 +1,11 @@
1
1
  require 'diff/lcs'
2
+
2
3
  module StrokeDB
4
+
5
+ PATCH_REPLACE = 'R'.freeze
6
+ PATCH_PLUS = '+'.freeze
7
+ PATCH_MINUS = '-'.freeze
8
+ PATCH_DIFF = 'D'.freeze
3
9
 
4
10
  class SlotDiffStrategy
5
11
  def self.diff(from, to)
@@ -62,7 +68,7 @@ module StrokeDB
62
68
  end
63
69
  end
64
70
 
65
- Diff = Meta.new(:uuid => DIFF_UUID) do
71
+ Diff = Meta.new do
66
72
 
67
73
  on_initialization do |diff|
68
74
  diff.added_slots = {} unless diff[:added_slots]
@@ -124,3 +130,8 @@ module StrokeDB
124
130
  end
125
131
 
126
132
  end
133
+
134
+ require 'sync/diff/default'
135
+ require 'sync/diff/string'
136
+ require 'sync/diff/array'
137
+ require 'sync/diff/hash'
@@ -6,7 +6,7 @@ module StrokeDB
6
6
  '!' => PATCH_DIFF
7
7
  }.freeze
8
8
  def stroke_diff(to)
9
- return super(to) unless Array === to
9
+ return super(to) unless to.is_a?(Array)
10
10
  return nil if self == to
11
11
 
12
12
  # sdiff: + - ! =
@@ -1,7 +1,7 @@
1
1
  module StrokeDB
2
2
  class ::Hash
3
3
  def stroke_diff(to)
4
- return super(to) unless Hash === to
4
+ return super(to) unless to.is_a?(Hash)
5
5
  return nil if self == to
6
6
 
7
7
  all_keys = self.keys | to.keys
@@ -1,7 +1,7 @@
1
1
  module StrokeDB
2
2
  class ::String
3
3
  def stroke_diff(to)
4
- return super(to) unless String === to
4
+ return super(to) unless to.is_a?(String)
5
5
  return nil if self == to
6
6
 
7
7
  _f = self[0,2]
@@ -1,6 +1,6 @@
1
1
  module StrokeDB
2
2
 
3
- SynchronizationReport = Meta.new(:uuid => SYNCHRONIZATION_REPORT_UUID) do
3
+ SynchronizationReport = Meta.new do
4
4
  on_new_document do |report|
5
5
  report.conflicts = []
6
6
  report.added_documents = []
@@ -9,7 +9,7 @@ module StrokeDB
9
9
  end
10
10
  end
11
11
 
12
- SynchronizationConflict = Meta.new(:uuid => SYNCHRONIZATION_CONFLICT_UUID) do
12
+ SynchronizationConflict = Meta.new do
13
13
  def resolve!
14
14
  # by default, do nothing
15
15
  end
@@ -22,7 +22,7 @@ module StrokeDB
22
22
  existing_chain = {}
23
23
  docs.group_by {|doc| doc.uuid}.each_pair do |uuid, versions|
24
24
  doc = find(uuid)
25
- existing_chain[uuid] = doc.versions.all_versions if doc
25
+ existing_chain[uuid] = doc.versions.all_versions.map {|v| [v, doc.versions[v].to_json ]} if doc
26
26
  end
27
27
  case _timestamp
28
28
  when Numeric
@@ -31,9 +31,11 @@ module StrokeDB
31
31
  @timestamp = LTS.new(_timestamp.counter, timestamp.uuid)
32
32
  else
33
33
  end
34
- docs.each {|doc| save!(doc) unless exists?(doc.uuid, doc.version)}
34
+ @txn = Transaction.new(:store => self)
35
+ @txn.execute do |txn|
36
+ docs.each {|doc| save!(doc) }
35
37
  docs.group_by {|doc| doc.uuid}.each_pair do |uuid, versions|
36
- incoming_chain = find(uuid, versions.last.version).versions.all_versions
38
+ incoming_chain = find(uuid, versions.last.version).versions.all_versions.map {|v| [v, find(uuid,v).to_json ]}
37
39
  if existing_chain[uuid].nil? or existing_chain[uuid].empty? # It is a new document
38
40
  added_doc = find(uuid, versions.last.version)
39
41
  save_as_head!(added_doc)
@@ -43,6 +45,7 @@ module StrokeDB
43
45
  sync = sync_chains(incoming_chain.reverse, existing_chain[uuid].reverse)
44
46
  rescue NonMatchingChains
45
47
  # raise NonMatchingDocumentCondition.new(uuid) # that will definitely leave garbage in the store (FIXME?)
48
+ txn.rollback!
46
49
  non_matching_doc = find(uuid)
47
50
  report.non_matching_documents << non_matching_doc
48
51
  next
@@ -51,17 +54,22 @@ module StrokeDB
51
54
  case resolution
52
55
  when :up_to_date
53
56
  # nothing to do
57
+ txn.commit!
54
58
  when :merge
55
- report.conflicts << SynchronizationConflict.create!(self, :document => find(uuid), :rev1 => sync[1], :rev2 => sync[2])
59
+ report.conflicts << SynchronizationConflict.create!(self, :document => find(uuid), :rev1 => sync[1].map{|e| e[0]}.reverse, :rev2 => sync[2].map{|e| e[0]}.reverse)
60
+ txn.commit!
56
61
  when :fast_forward
57
- fast_forwarded_doc = find(uuid, sync[1].last)
62
+ fast_forwarded_doc = find(uuid, sync[1].last.first)
58
63
  save_as_head!(fast_forwarded_doc)
59
64
  report.fast_forwarded_documents << fast_forwarded_doc
65
+ txn.commit!
60
66
  else
67
+ txn.rollback!
61
68
  raise "Invalid sync resolution #{resolution}"
62
69
  end
63
70
  end
64
71
  end
72
+ end
65
73
  report.conflicts.each do |conflict|
66
74
  if resolution_strategy = conflict.document.meta[:resolution_strategy]
67
75
  conflict.metas << resolution_strategy
@@ -0,0 +1,78 @@
1
+ module StrokeDB
2
+
3
+ class Transaction
4
+
5
+ attr_reader :uuid
6
+
7
+ def initialize(options = {})
8
+ @options = options.stringify_keys
9
+ @uuid = Util.random_uuid
10
+ storage.add_chained_storage!(store.storage)
11
+ end
12
+
13
+ def storage
14
+ @options['storage'] ||= setup_storage
15
+ end
16
+
17
+ def store
18
+ @options['store']
19
+ end
20
+
21
+ def inspect
22
+ "#<Transaction #{@uuid}>"
23
+ end
24
+
25
+ def find(uuid, version=nil, opts = {})
26
+ storage.find(uuid,version,opts.merge(:store => self))
27
+ end
28
+
29
+ def head_version(uuid)
30
+ storage.head_version(uuid,{ :store => self })
31
+ end
32
+
33
+ def save!(doc)
34
+ @timestamp = @timestamp.next
35
+ storage.save!(doc,@timestamp)
36
+ end
37
+
38
+ def execute
39
+ raise ArgumentError, "no block provided" unless block_given?
40
+
41
+ Thread.current[:strokedb_transactions] ||= []
42
+ Thread.current[:strokedb_transactions].push self
43
+
44
+ @timestamp = LTS.new(store.timestamp.counter,uuid)
45
+
46
+ begin
47
+ result = yield(self)
48
+ rescue
49
+ throw $!
50
+ ensure
51
+ Thread.current[:strokedb_transactions].pop
52
+ end
53
+
54
+
55
+ result
56
+ end
57
+
58
+ def commit!
59
+ storage.sync_chained_storage!(store.storage)
60
+ true
61
+ end
62
+
63
+ def rollback!
64
+ @options['storage'] = setup_storage
65
+ true
66
+ end
67
+
68
+ private
69
+
70
+ def setup_storage
71
+ storage = MemoryStorage.new
72
+ storage.authoritative_source = store.storage
73
+ storage
74
+ end
75
+
76
+ end
77
+
78
+ end
@@ -17,13 +17,6 @@ module StrokeDB
17
17
  end
18
18
  end
19
19
 
20
- unless RUBY_PLATFORM =~ /java/
21
- require 'uuidtools'
22
- def self.random_uuid
23
- ::UUID.random_create.to_s
24
- end
25
- end
26
-
27
20
  class CircularReferenceCondition < Exception ; end
28
21
  class << self
29
22
  def catch_circular_reference(value,name = 'StrokeDB.reference_stack')
@@ -35,4 +28,18 @@ module StrokeDB
35
28
  end
36
29
  end
37
30
  end
31
+
38
32
  end
33
+
34
+ require 'util/blankslate'
35
+ require 'util/class_optimization'
36
+ require 'util/inflect'
37
+ require 'util/lazy_array'
38
+ require 'util/lazy_mapping_array'
39
+ require 'util/lazy_mapping_hash'
40
+ require 'util/serialization'
41
+ require 'util/uuid'
42
+ require 'util/xml'
43
+ require 'util/attach_dsl'
44
+ require 'time'
45
+ require 'util/java_util' if RUBY_PLATFORM =~ /java/
@@ -0,0 +1,29 @@
1
+ module StrokeDB
2
+ class ::Module
3
+
4
+ # Attach module as DSL. Module may use store_dsl_options
5
+ # method to store DSL.
6
+ #
7
+ def attach_dsl(*mods)
8
+ @dsl_options ||= {}
9
+ mods.each do |mod|
10
+ extend(mod)
11
+ end
12
+ end
13
+ alias :attach_dsls :attach_dsl
14
+
15
+ # Store some data associated with a DSL name.
16
+ #
17
+ def store_dsl_options(name, opts)
18
+ @dsl_options[name] = opts
19
+ end
20
+
21
+ # Return a map of registered DSLs.
22
+ #
23
+ def dsl
24
+ @dsl_options
25
+ end
26
+ end
27
+ end
28
+
29
+
@@ -0,0 +1,93 @@
1
+ module StrokeDB
2
+ class ::Class
3
+ # Declare which methods are optimized for particular language.
4
+ # It is assumed, that optimized method name looks that way:
5
+ # <tt>method_name_(language name)</tt>
6
+ #
7
+ # If you supply a block of code, it will be executed in a context of a class
8
+ # each time <tt>optimize!</tt> is called.
9
+ #
10
+ # You may add some exception handling where you call <tt>optimize!</tt>.
11
+ #
12
+ # Example:
13
+ #
14
+ # # assume, there're methods find_C and insert_C
15
+ # declare_optimized_methods(:C, :find, :insert) { require 'bundle' }</tt>
16
+ #
17
+ def declare_optimized_methods(lang, *meths, &block)
18
+ meths.flatten!
19
+ @optimized_methods ||= {}
20
+ @optimized_methods_init ||= {}
21
+ @optimized_methods[lang.to_s] = meths
22
+ @optimized_methods_init[lang.to_s] = block
23
+ extend ClassOptimization::ClassMethods
24
+ end
25
+
26
+ # Returns a list of optimized methods for a given language.
27
+ # If no language given, a Hash is returned where key is a language name.
28
+ #
29
+ def optimized_methods(lang = nil)
30
+ @optimized_methods ||= {}
31
+ return @optimized_methods unless lang
32
+ @optimized_methods[lang.to_s] || []
33
+ end
34
+ end
35
+ module ClassOptimization
36
+ module ClassMethods
37
+ # Switches methods into optimized versions as declared in
38
+ # <tt>declare_optimized_methods</tt>.
39
+ # Pure ruby methods become accessible with suffix _PureRuby.
40
+ #
41
+ def optimize!(lang)
42
+ if block = @optimized_methods_init[lang.to_s]
43
+ self.instance_eval(&block)
44
+ end
45
+ optimized_methods(lang).each do |meth|
46
+ alias_method(:"#{meth}_PureRuby", :"#{meth}")
47
+ alias_method(:"#{meth}", :"#{meth}_#{lang}")
48
+ end
49
+ end
50
+
51
+ # Reverts method optimization done with <tt>optimize!</tt>
52
+ # Note: you may call this method only after optimize! was called.
53
+ #
54
+ def deoptimize!(lang)
55
+ optimized_methods(lang).each do |meth|
56
+ alias_method(:"#{meth}", :"#{meth}_PureRuby")
57
+ end
58
+ end
59
+
60
+ # Executes code in a block with optimizations turned on.
61
+ # This ensures that appropriate <tt>deoptimize!</tt> method is called.
62
+ #
63
+ def optimized_with(lang)
64
+ optimize!(lang)
65
+ yield
66
+ ensure
67
+ deoptimize!(lang)
68
+ end
69
+
70
+ # Iterates through all the optimizations. Non-optimized
71
+ # mode ("pure Ruby") is yielded first.
72
+ # Useful for testing and benchmarks.
73
+ #
74
+ # Example:
75
+ #
76
+ # Klass.with_optimizations(:InlineC) do |lang|
77
+ # puts "Klass#some_method is written in #{lang}"
78
+ # puts Klass.new.some_method
79
+ # end
80
+ #
81
+ def with_optimizations(*langs)
82
+ langs.flatten!
83
+ yield("pure Ruby")
84
+ langs.each do |lang|
85
+ optimized_with(lang) do
86
+ yield(lang)
87
+ end
88
+ end
89
+ self
90
+ end
91
+ end
92
+ end
93
+ end
File without changes
@@ -0,0 +1,13 @@
1
+ require 'java'
2
+ # Some java overrides
3
+ module StrokeDB
4
+ module Util
5
+ def self.random_uuid
6
+ java.util.UUID.random_uuid.to_s
7
+ end
8
+ def self.random_uuid_raw
9
+ uuid = java.util.UUID.random_uuid
10
+ [uuid.most_significant_bits, uuid.least_significant_bits].pack("Q2")
11
+ end
12
+ end
13
+ end
@@ -135,6 +135,10 @@ module StrokeDB
135
135
  def to_a
136
136
  Array.new(map{|v| v})
137
137
  end
138
+
139
+ def ==(arr)
140
+ to_a == arr
141
+ end
138
142
 
139
143
  def class
140
144
  Array