perobs 2.1.0 → 2.1.1
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.
- checksums.yaml +4 -4
- data/lib/perobs/DataBase.rb +0 -14
- data/lib/perobs/Object.rb +6 -7
- data/lib/perobs/ObjectBase.rb +5 -4
- data/lib/perobs/Store.rb +25 -5
- data/lib/perobs/version.rb +1 -1
- data/test/Store_spec.rb +31 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 231bcc1e34113cad62eefa5bdac4b84d18937638
|
4
|
+
data.tar.gz: dfe932b0e210297a4a24a5a2c076d52db04c5ff6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 433b39b2568538a634e53adc0bf6ae2ac8f4f8d6a24178b406d5b6de92981d141f6a29ce6a344388eedc5b1c0632e02d4bef6c2996c18650b7805501de29718a
|
7
|
+
data.tar.gz: 78904802a71bb2b958f79eebb70c945d5506267bf83c1e921de8ec4478a4e88e5fcfe9bf5409beecda8dd7fb4ea6358a366e3640dbd0965365a387f9b324d4e0
|
data/lib/perobs/DataBase.rb
CHANGED
@@ -83,20 +83,6 @@ module PEROBS
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
-
# Generate a new unique ID. It uses random numbers between 0 and 2**64 -
|
87
|
-
# 1.
|
88
|
-
# @return [Fixnum or Bignum]
|
89
|
-
def new_id
|
90
|
-
begin
|
91
|
-
# Generate a random number. It's recommended to not store more than
|
92
|
-
# 2**62 objects in the same store.
|
93
|
-
id = rand(2**64)
|
94
|
-
# Ensure that we don't have already another object with this ID.
|
95
|
-
end while include?(id)
|
96
|
-
|
97
|
-
id
|
98
|
-
end
|
99
|
-
|
100
86
|
# Check a config option and adjust it if needed.
|
101
87
|
# @param name [String] Name of the config option.
|
102
88
|
def check_option(name)
|
data/lib/perobs/Object.rb
CHANGED
@@ -182,18 +182,17 @@ module PEROBS
|
|
182
182
|
end
|
183
183
|
|
184
184
|
def _set(attr, val)
|
185
|
-
if val.
|
185
|
+
if val.respond_to?(:is_poxreference?)
|
186
186
|
# References to other PEROBS::Objects must be handled somewhat
|
187
187
|
# special.
|
188
188
|
if @store != val.store
|
189
189
|
raise ArgumentError, 'The referenced object is not part of this store'
|
190
190
|
end
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
end
|
191
|
+
elsif val.is_a?(ObjectBase)
|
192
|
+
raise ArgumentError, 'A PEROBS::ObjectBase object escaped! ' +
|
193
|
+
'Have you used self() instead of myself() to' +
|
194
|
+
'get the reference of the PEROBS object that ' +
|
195
|
+
'you are trying to assign here?'
|
197
196
|
end
|
198
197
|
instance_variable_set(('@' + attr.to_s).to_sym, val)
|
199
198
|
# Let the store know that we have a modified object.
|
data/lib/perobs/ObjectBase.rb
CHANGED
@@ -127,7 +127,8 @@ module PEROBS
|
|
127
127
|
"All PEROBS objects must exclusively be created by calling " +
|
128
128
|
"Store.new(). Never call the object constructor directly."
|
129
129
|
end
|
130
|
-
@_id = @store.
|
130
|
+
@_id = @store._new_id
|
131
|
+
@store._register_in_memory(self, @_id)
|
131
132
|
ObjectSpace.define_finalizer(self, ObjectBase._finalize(@store, @_id))
|
132
133
|
@_stash_map = nil
|
133
134
|
# Allocate a proxy object for this object. User code should only operate
|
@@ -146,8 +147,6 @@ module PEROBS
|
|
146
147
|
proc { store._collect(id) }
|
147
148
|
end
|
148
149
|
|
149
|
-
public
|
150
|
-
|
151
150
|
# This method can be overloaded by derived classes to do some massaging on
|
152
151
|
# the data after it has been restored from the database. This could either
|
153
152
|
# be some sanity check or code to migrate the object from one version to
|
@@ -226,7 +225,7 @@ module PEROBS
|
|
226
225
|
}
|
227
226
|
@_stash_map = [] unless @_stash_map
|
228
227
|
# Get a new ID to store this version of the object.
|
229
|
-
@_stash_map[level] = stash_id = @store.
|
228
|
+
@_stash_map[level] = stash_id = @store._new_id
|
230
229
|
@store.db.put_object(db_obj, stash_id)
|
231
230
|
end
|
232
231
|
|
@@ -236,6 +235,8 @@ module PEROBS
|
|
236
235
|
# Unregister the object with the old ID from the write cache to prevent
|
237
236
|
# cache corruption. The objects are index by ID in the cache.
|
238
237
|
@store.cache.unwrite(self)
|
238
|
+
@store._collect(@_id)
|
239
|
+
@store._register_in_memory(self, id)
|
239
240
|
@_id = id
|
240
241
|
end
|
241
242
|
|
data/lib/perobs/Store.rb
CHANGED
@@ -173,11 +173,6 @@ module PEROBS
|
|
173
173
|
@object_creation_in_progress = false
|
174
174
|
# If a specific object ID was requested we need to set it now.
|
175
175
|
obj._change_id(id) if id
|
176
|
-
# Add the new object to the in-memory list. We only store a weak
|
177
|
-
# reference to the object so it can be garbage collected. When this
|
178
|
-
# happens the object finalizer is triggered and calls _forget() to
|
179
|
-
# remove the object from this hash again.
|
180
|
-
@in_memory_objects[obj._id] = WeakRef.new(obj)
|
181
176
|
obj
|
182
177
|
end
|
183
178
|
|
@@ -349,6 +344,31 @@ module PEROBS
|
|
349
344
|
def rename_classes(rename_map)
|
350
345
|
@class_map.rename(rename_map)
|
351
346
|
end
|
347
|
+
# Internal method. Don't use this outside of this library!
|
348
|
+
# Generate a new unique ID that is not used by any other object. It uses
|
349
|
+
# random numbers between 0 and 2**64 - 1.
|
350
|
+
# @return [Fixnum or Bignum]
|
351
|
+
def _new_id
|
352
|
+
begin
|
353
|
+
# Generate a random number. It's recommended to not store more than
|
354
|
+
# 2**62 objects in the same store.
|
355
|
+
id = rand(2**64)
|
356
|
+
# Ensure that we don't have already another object with this ID.
|
357
|
+
end while @in_memory_objects.include?(id) || @db.include?(id)
|
358
|
+
|
359
|
+
id
|
360
|
+
end
|
361
|
+
|
362
|
+
# Internal method. Don't use this outside of this library!
|
363
|
+
# Add the new object to the in-memory list. We only store a weak
|
364
|
+
# reference to the object so it can be garbage collected. When this
|
365
|
+
# happens the object finalizer is triggered and calls _forget() to
|
366
|
+
# remove the object from this hash again.
|
367
|
+
# @param obj [BasicObject] Object to register
|
368
|
+
# @param id [Fixnum or Bignum] object ID
|
369
|
+
def _register_in_memory(obj, id)
|
370
|
+
@in_memory_objects[id] = WeakRef.new(obj)
|
371
|
+
end
|
352
372
|
|
353
373
|
# Remove the object from the in-memory list. This is an internal method
|
354
374
|
# and should never be called from user code.
|
data/lib/perobs/version.rb
CHANGED
data/test/Store_spec.rb
CHANGED
@@ -55,6 +55,27 @@ class PersonN < PEROBS::Object
|
|
55
55
|
|
56
56
|
end
|
57
57
|
|
58
|
+
class O0 < PEROBS::Object
|
59
|
+
|
60
|
+
po_attr :r
|
61
|
+
|
62
|
+
def initialize(store)
|
63
|
+
super
|
64
|
+
r = @store.new(O1, myself)
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
class O1 < PEROBS::Object
|
69
|
+
|
70
|
+
po_attr :p
|
71
|
+
|
72
|
+
def initialize(store, p = nil)
|
73
|
+
super(store)
|
74
|
+
parent = p
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
58
79
|
describe PEROBS::Store do
|
59
80
|
|
60
81
|
before(:all) do
|
@@ -398,6 +419,7 @@ describe PEROBS::Store do
|
|
398
419
|
|
399
420
|
it 'should track in-memory objects properly' do
|
400
421
|
@store = PEROBS::Store.new(@db_file)
|
422
|
+
expect(@store.statistics[:in_memory_objects]).to eq(1)
|
401
423
|
@store['person'] = @store.new(Person)
|
402
424
|
# We have the root hash and the Person object.
|
403
425
|
expect(@store.statistics[:in_memory_objects]).to eq(2)
|
@@ -407,6 +429,15 @@ describe PEROBS::Store do
|
|
407
429
|
expect(@store.statistics[:in_memory_objects]).to eq(1)
|
408
430
|
end
|
409
431
|
|
432
|
+
it 'should handle nested constructors' do
|
433
|
+
@store = PEROBS::Store.new(@db_file)
|
434
|
+
@store['r'] = @store.new(O0)
|
435
|
+
@store.sync
|
436
|
+
expect(@store.check).to eq(0)
|
437
|
+
@store = PEROBS::Store.new(@db_file)
|
438
|
+
expect(@store.check).to eq(0)
|
439
|
+
end
|
440
|
+
|
410
441
|
it 'should survive a real world usage test' do
|
411
442
|
options = { :engine => PEROBS::BTreeDB, :dir_bits => 4 }
|
412
443
|
@store = PEROBS::Store.new(@db_file, options)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: perobs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Schlaeger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|