rbbt-util 5.5.68 → 5.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rbbt/association.rb +1 -1
  3. data/lib/rbbt/association/index.rb +2 -1
  4. data/lib/rbbt/entity.rb +2 -0
  5. data/lib/rbbt/persist/tsv.rb +46 -232
  6. data/lib/rbbt/persist/tsv/cdb.rb +139 -0
  7. data/lib/rbbt/persist/tsv/kyotocabinet.rb +168 -0
  8. data/lib/rbbt/persist/tsv/leveldb.rb +121 -0
  9. data/lib/rbbt/persist/tsv/lmdb.rb +148 -0
  10. data/lib/rbbt/persist/tsv/tokyocabinet.rb +158 -0
  11. data/lib/rbbt/resource/rake.rb +2 -1
  12. data/lib/rbbt/tsv/accessor.rb +74 -101
  13. data/lib/rbbt/tsv/parser.rb +2 -5
  14. data/lib/rbbt/tsv/serializers.rb +6 -0
  15. data/lib/rbbt/tsv/util.rb +8 -2
  16. data/lib/rbbt/util/R.rb +6 -0
  17. data/lib/rbbt/util/cmd.rb +7 -4
  18. data/lib/rbbt/util/misc.rb +10 -4
  19. data/lib/rbbt/util/open.rb +8 -6
  20. data/lib/rbbt/util/simpleopt.rb +1 -1
  21. data/lib/rbbt/workflow.rb +17 -3
  22. data/lib/rbbt/workflow/accessor.rb +5 -1
  23. data/lib/rbbt/workflow/definition.rb +6 -0
  24. data/lib/rbbt/workflow/step.rb +10 -4
  25. data/lib/rbbt/workflow/task.rb +1 -1
  26. data/share/rbbt_commands/tsv/json +37 -0
  27. data/share/rbbt_commands/workflow/task +8 -2
  28. data/test/rbbt/persist/test_tsv.rb +77 -0
  29. data/test/rbbt/persist/tsv/test_cdb.rb +23 -0
  30. data/test/rbbt/persist/tsv/test_kyotocabinet.rb +33 -0
  31. data/test/rbbt/persist/tsv/test_leveldb.rb +22 -0
  32. data/test/rbbt/persist/tsv/test_lmdb.rb +22 -0
  33. data/test/rbbt/persist/tsv/test_tokyocabinet.rb +242 -0
  34. data/test/rbbt/test_persist.rb +1 -225
  35. data/test/rbbt/test_workflow.rb +0 -1
  36. data/test/rbbt/workflow/test_step.rb +14 -12
  37. data/test/test_helper.rb +4 -2
  38. metadata +20 -4
  39. data/test/rbbt/workflow/test_soap.rb +0 -105
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d3d30a17283c3778cfd2cd645c141e964f5cbd96
4
- data.tar.gz: d656ccf4110c9286694893e9378eaeb555301d53
3
+ metadata.gz: b772991027bae39d5d75e7d19fdfc628b2a78871
4
+ data.tar.gz: aed0bd56fbd0178bff6cd37b386390a392a5a7ec
5
5
  SHA512:
6
- metadata.gz: 488d486e35e367e10271d1fe11339dd4c9027e5290b0290b1ca4f9a6f4ea9c0735df68c09a988363526a77aa7c21aeda49e0ccaa5ead8011b2ea9c447db820a2
7
- data.tar.gz: d343c02b1236aee587ad6258898b487d9b5c24d17f444746fb4df2a94d12e6cc3b85b3542a6387029768ed9f9385fc7557dd6538131cdca321a2324664993b05
6
+ metadata.gz: 6aeb956836ee4d77b643249dc63c13ba6aed3aa9568b58173eb872c45e384d5202ea8e742c55e775187371f4e5b438198d57f56896e3daad9041158320692677
7
+ data.tar.gz: eab7947a295e70759b50bf6333c589f7c71aa535d5c5c26f0c848aacb5b9f723505799bb4baec4c16f30b5fe3f9a5ed8715f3f6326612b33b342823622428497
@@ -242,7 +242,7 @@ module Association
242
242
  tsv = load_tsv(file, options)
243
243
 
244
244
  tsv.annotate(data)
245
- data.serializer = tsv.type if TokyoCabinet::HDB === data
245
+ data.serializer = tsv.type if data.respond_to? :persistence_path
246
246
 
247
247
  tsv.with_unnamed do
248
248
  tsv.each do |k,v|
@@ -11,6 +11,7 @@ module Association
11
11
  repo.extend Association::Index
12
12
  repo.parse_key_field
13
13
  repo.unnamed = true
14
+ repo
14
15
  end
15
16
 
16
17
  def reverse
@@ -56,7 +57,7 @@ module Association
56
57
  acc
57
58
  end
58
59
  end
59
-
60
+
60
61
  #{{{ Subset
61
62
 
62
63
  def select_entities(entities)
data/lib/rbbt/entity.rb CHANGED
@@ -117,6 +117,8 @@ module Entity
117
117
  Hash === res ? res[self] : res[0]
118
118
  end
119
119
  end
120
+ else
121
+ raise "Type not undestood in property: #{ type }"
120
122
 
121
123
  end
122
124
  end
@@ -1,237 +1,35 @@
1
1
  begin
2
- require 'tokyocabinet'
2
+ require 'rbbt/persist/tsv/tokyocabinet'
3
3
  rescue Exception
4
4
  Log.warn "The tokyocabinet gem could not be loaded: persistence over TSV files will fail"
5
5
  end
6
6
 
7
- module Persist
8
- TC_CONNECTIONS = {}
9
-
10
- def self.open_tokyocabinet(path, write, serializer = nil, tokyocabinet_class = TokyoCabinet::HDB)
11
- write = true unless File.exists? path
12
-
13
- tokyocabinet_class = TokyoCabinet::HDB if tokyocabinet_class == "HDB"
14
- tokyocabinet_class = TokyoCabinet::BDB if tokyocabinet_class == "BDB"
15
-
16
- flags = (write ? tokyocabinet_class::OWRITER | tokyocabinet_class::OCREAT : tokyocabinet_class::OREADER)
17
-
18
- FileUtils.mkdir_p File.dirname(path) unless File.exists?(File.dirname(path))
19
-
20
- database = TC_CONNECTIONS[path] ||= tokyocabinet_class.new
21
- database.close
22
-
23
- if !database.open(path, flags)
24
- ecode = database.ecode
25
- raise "Open error: #{database.errmsg(ecode)}. Trying to open file #{path}"
26
- end
27
-
28
- if not database.respond_to? :old_close
29
- class << database
30
- attr_accessor :writable, :closed, :persistence_path, :tokyocabinet_class
31
-
32
- def prefix(key)
33
- range(key, 1, key + 255.chr, 1)
34
- end
35
-
36
- def get_prefix(key)
37
- keys = prefix(key)
38
- select(:key => keys)
39
- end
40
-
41
- def closed?
42
- @closed
43
- end
44
-
45
- alias old_close close
46
- def close
47
- @closed = true
48
- old_close
49
- end
50
-
51
- def read(force = false)
52
- return if not write? and not closed and not force
53
- self.close
54
- if !self.open(@persistence_path, tokyocabinet_class::OREADER)
55
- ecode = self.ecode
56
- raise "Open error: #{self.errmsg(ecode)}. Trying to open file #{@persistence_path}"
57
- end
58
- @writable = false
59
- @closed = false
60
- self
61
- end
62
-
63
- def write(force = true)
64
- return if write? and not closed and not force
65
- self.close
66
-
67
- if !self.open(@persistence_path, tokyocabinet_class::OWRITER)
68
- ecode = self.ecode
69
- raise "Open error: #{self.errmsg(ecode)}. Trying to open file #{@persistence_path}"
70
- end
71
-
72
- @writable = true
73
- @closed = false
74
- self
75
- end
76
-
77
- def write?
78
- @writable
79
- end
80
-
81
- def collect
82
- res = []
83
- each do |key, value|
84
- res << if block_given?
85
- yield key, value
86
- else
87
- [key, value]
88
- end
89
- end
90
- res
91
- end
92
-
93
- def delete(key)
94
- out(key)
95
- end
96
-
97
- def write_and_read
98
- lock_filename = Persist.persistence_path(persistence_path, {:dir => TSV.lock_dir})
99
- Misc.lock(lock_filename) do
100
- write if @closed or not write?
101
- res = begin
102
- yield
103
- ensure
104
- read
105
- end
106
- res
107
- end
108
- end
109
-
110
- def write_and_close
111
- lock_filename = Persist.persistence_path(persistence_path, {:dir => TSV.lock_dir})
112
- Misc.lock(lock_filename) do
113
- write if @closed or not write?
114
- res = begin
115
- yield
116
- ensure
117
- close
118
- end
119
- res
120
- end
121
- end
122
-
123
- def read_and_close
124
- read if @closed or write?
125
- res = begin
126
- yield
127
- ensure
128
- close
129
- end
130
- res
131
- end
132
-
133
- def merge!(hash)
134
- hash.each do |key,values|
135
- self[key] = values
136
- end
137
- end
138
-
139
- if instance_methods.include? "range"
140
- alias old_range range
141
-
142
- def range(*args)
143
- keys = old_range(*args)
144
- keys - TSV::ENTRY_KEYS
145
- end
146
- end
147
- end
148
- end
149
-
150
- database.persistence_path ||= path
151
- database.tokyocabinet_class = tokyocabinet_class
152
-
153
- unless serializer == :clean
154
- TSV.setup database
155
- database.serializer = serializer || database.serializer
156
- database.fields
157
- end
158
-
159
- database
160
- end
161
-
162
- def self.persist_tsv(source, filename, options = {}, persist_options = {})
163
- persist_options[:prefix] ||= "TSV"
164
-
165
- data = case
166
- when persist_options[:data]
167
- persist_options[:data]
168
- when persist_options[:persist]
169
-
170
- filename ||= case
171
- when Path === source
172
- source
173
- when (source.respond_to?(:filename) and source.filename)
174
- source.filename
175
- when source.respond_to?(:cmd)
176
- "CMD-#{Misc.digest(source.cmd)}"
177
- when TSV === source
178
- "TSV[#{Misc.digest Misc.fingerprint(source)}]"
179
- else
180
- source.object_id.to_s
181
- end
182
-
183
- filename ||= source.object_id.to_s
184
-
185
- path = persistence_path(filename, persist_options, options)
186
-
187
- if is_persisted? path and not persist_options[:update]
188
- Log.debug "TSV persistence up-to-date: #{ path }"
189
- lock_filename = Persist.persistence_path(path, {:dir => TSV.lock_dir})
190
- return Misc.lock(lock_filename) do open_tokyocabinet(path, false, nil, persist_options[:engine] || TokyoCabinet::HDB); end
191
- else
192
- Log.medium "TSV persistence creating: #{ path }"
193
- end
194
-
195
- FileUtils.rm path if File.exists? path
196
-
197
- tmp_path = path + '.persist'
198
-
199
- data = open_tokyocabinet(tmp_path, true, persist_options[:serializer], persist_options[:engine] || TokyoCabinet::HDB)
200
- data.serializer = :type if TSV === data and data.serializer.nil?
201
-
202
- data.close
203
-
204
- data
205
- else
206
- {}
207
- end
7
+ begin
8
+ require 'rbbt/persist/tsv/lmdb'
9
+ rescue Exception
10
+ Log.warn "The lmdb gem could not be loaded. Persistance using this engine will fail."
11
+ end
208
12
 
209
- begin
210
- if data.respond_to? :persistence_path and data != persist_options[:data]
211
- data.write_and_close do
212
- yield data
213
- end
214
- else
215
- yield data
216
- end
217
- rescue Exception
218
- Log.error "Captured error during persist_tsv. Erasing: #{path}"
219
- FileUtils.rm tmp_path if tmp_path and File.exists? tmp_path
220
- raise $!
221
- ensure
222
- data.close if data.respond_to? :close
223
- if tmp_path
224
- FileUtils.mv tmp_path, path if File.exists? tmp_path and not File.exists? path
225
- tsv = TC_CONNECTIONS[path] = TC_CONNECTIONS.delete tmp_path
226
- tsv.persistence_path = path
227
- end
228
- end
13
+ begin
14
+ require 'rbbt/persist/tsv/leveldb'
15
+ rescue Exception
16
+ Log.warn "The LevelDB gem could not be loaded. Persistance using this engine will fail."
17
+ end
229
18
 
230
- data.read if data.respond_to? :read and ((data.respond_to?(:write?) and data.write?) or (data.respond_to?(:closed?) and data.closed?))
19
+ begin
20
+ require 'rbbt/persist/tsv/cdb'
21
+ rescue Exception
22
+ Log.warn "The CDB gem could not be loaded. Persistance using this engine will fail."
23
+ end
231
24
 
25
+ begin
26
+ require 'rbbt/persist/tsv/kyotocabinet'
27
+ rescue Exception
28
+ Log.warn "The kyotocabinet gem could not be loaded. Persistance using this engine will fail."
29
+ end
232
30
 
233
- data
234
- end
31
+ module Persist
32
+ CONNECTIONS = {}
235
33
 
236
34
  def self.get_filename(source)
237
35
  case
@@ -246,6 +44,21 @@ module Persist
246
44
  end || source.object_id.to_s
247
45
  end
248
46
 
47
+ def self.open_database(path, write, serializer = nil, type = "HDB")
48
+ case type
49
+ when "LevelDB"
50
+ Persist.open_leveldb(path, write, serializer)
51
+ when "CDB"
52
+ Persist.open_cdb(path, write, serializer)
53
+ when "LMDB"
54
+ Persist.open_lmdb(path, write, serializer)
55
+ when 'kch', 'kct'
56
+ Persist.open_kyotocabinet(path, write, serializer, type)
57
+ else
58
+ Persist.open_tokyocabinet(path, write, serializer, type)
59
+ end
60
+ end
61
+
249
62
  def self.persist_tsv(source, filename, options = {}, persist_options = {}, &block)
250
63
  persist_options[:prefix] ||= "TSV"
251
64
 
@@ -270,14 +83,14 @@ module Persist
270
83
 
271
84
  if is_persisted? path and not persist_options[:update]
272
85
  Log.debug "TSV persistence up-to-date: #{ path }"
273
- return open_tokyocabinet(path, false, nil, persist_options[:engine] || TokyoCabinet::HDB)
86
+ return open_database(path, false, nil, persist_options[:engine] || TokyoCabinet::HDB)
274
87
  end
275
88
 
276
89
  Misc.lock lock_filename do
277
90
  begin
278
91
  if is_persisted? path
279
92
  Log.debug "TSV persistence up-to-date: #{ path }"
280
- return open_tokyocabinet(path, false, nil, persist_options[:engine] || TokyoCabinet::HDB)
93
+ return open_database(path, false, nil, persist_options[:engine] || TokyoCabinet::HDB)
281
94
  end
282
95
 
283
96
  FileUtils.rm path if File.exists? path
@@ -286,22 +99,23 @@ module Persist
286
99
 
287
100
  tmp_path = path + '.persist'
288
101
 
289
- data = open_tokyocabinet(tmp_path, true, persist_options[:serializer], persist_options[:engine] || TokyoCabinet::HDB)
102
+ data = open_database(tmp_path, true, persist_options[:serializer], persist_options[:engine] || TokyoCabinet::HDB)
290
103
  data.serializer = :type if TSV === data and data.serializer.nil?
291
104
 
292
105
  data.write_and_read do
293
106
  yield data
294
107
  end
295
108
 
296
- FileUtils.mv tmp_path, path if File.exists? tmp_path and not File.exists? path
297
- tsv = TC_CONNECTIONS[path] = TC_CONNECTIONS.delete tmp_path
109
+ FileUtils.mv data.persistence_path, path if File.exists? data.persistence_path and not File.exists? path
110
+ tsv = CONNECTIONS[path] = CONNECTIONS.delete tmp_path
298
111
  tsv.persistence_path = path
112
+ tsv.fix_io if tsv.respond_to? :fix_io
299
113
 
300
114
  data
301
115
  rescue Exception
302
116
  Log.error "Captured error during persist_tsv. Erasing: #{path}"
303
- FileUtils.rm tmp_path if tmp_path and File.exists? tmp_path
304
- FileUtils.rm path if path and File.exists? path
117
+ FileUtils.rm_rf tmp_path if tmp_path and File.exists? tmp_path
118
+ FileUtils.rm_rf path if path and File.exists? path
305
119
  raise $!
306
120
  end
307
121
  end
@@ -0,0 +1,139 @@
1
+ require 'libcdb'
2
+
3
+ module Persist
4
+
5
+ module CDBAdapter
6
+ attr_accessor :persistence_path, :closed
7
+
8
+ def self.open(path, write)
9
+ write = true unless File.exists? path
10
+
11
+ database = CONNECTIONS[path] ||= begin
12
+ file = File.open(path, 'w')
13
+ LibCDB::CDB.new(file)
14
+ end
15
+
16
+ database.extend Persist::CDBAdapter unless Persist::CDBAdapter === database
17
+ database.persistence_path ||= path
18
+
19
+ database
20
+ end
21
+
22
+ def include?(k)
23
+ not write? and super(k)
24
+ end
25
+
26
+ def [](*args)
27
+ write? ? nil : super(*args)
28
+ end
29
+
30
+ def []=(k,v)
31
+ if write?
32
+ add(k,v)
33
+ end
34
+ end
35
+
36
+ def closed?
37
+ @closed
38
+ end
39
+
40
+ def fix_io
41
+ if instance_variable_get(:@io) != persistence_path
42
+ #close_read if read?
43
+ #close_write if write?
44
+ instance_variable_set(:@io, File.open(persistence_path))
45
+ end
46
+ end
47
+
48
+ def close
49
+ self.closed = true
50
+ begin
51
+ fix_io
52
+ super
53
+ rescue
54
+ end
55
+ end
56
+
57
+ def read(force = false)
58
+ self.closed = false
59
+ fix_io
60
+ open_read
61
+ end
62
+
63
+ def write(force = true)
64
+ self.closed = false
65
+ fix_io
66
+ open_write
67
+ self
68
+ end
69
+
70
+ def delete(key)
71
+ out(key)
72
+ end
73
+
74
+ def write_and_read
75
+ lock_filename = Persist.persistence_path(persistence_path, {:dir => TSV.lock_dir})
76
+ Misc.lock(lock_filename) do
77
+ write if @closed or not write?
78
+ res = begin
79
+ yield
80
+ rescue
81
+ Log.error $!.message
82
+ Log.debug $!.backtrace * "\n"
83
+ ensure
84
+ read if write?
85
+ end
86
+ end
87
+ end
88
+
89
+ def write_and_close
90
+ lock_filename = Persist.persistence_path(persistence_path, {:dir => TSV.lock_dir})
91
+ Misc.lock(lock_filename) do
92
+ write if @closed or not write?
93
+ res = begin
94
+ yield
95
+ ensure
96
+ close
97
+ end
98
+ res
99
+ end
100
+ end
101
+
102
+ def read_and_close
103
+ read if @closed or write?
104
+ res = begin
105
+ yield
106
+ ensure
107
+ close
108
+ end
109
+ res
110
+ end
111
+
112
+ def merge!(hash)
113
+ hash.each do |key,values|
114
+ self[key] = values
115
+ end
116
+ end
117
+
118
+
119
+ def range(*args)
120
+ super(*args) - TSV::ENTRY_KEYS.to_a
121
+ end
122
+ end
123
+
124
+
125
+ def self.open_cdb(path, write, serializer = nil)
126
+ write = true unless File.exists? path
127
+
128
+ FileUtils.mkdir_p File.dirname(path) unless File.exists?(File.dirname(path))
129
+
130
+ database = Persist::CDBAdapter.open(path, write)
131
+
132
+ unless serializer == :clean
133
+ TSV.setup database
134
+ database.serializer = serializer || database.serializer
135
+ end
136
+
137
+ database
138
+ end
139
+ end