data_objects 0.9.4 → 0.9.5
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.
- data/Rakefile +1 -1
- data/lib/data_objects.rb +1 -1
- data/lib/data_objects/support/pooling.rb +17 -17
- data/lib/data_objects/transaction.rb +2 -1
- data/lib/data_objects/version.rb +2 -2
- data/spec/connection_spec.rb +4 -4
- data/spec/support/pooling_spec.rb +32 -32
- metadata +4 -4
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ AUTHOR = "Yehuda Katz"
|
|
9
9
|
EMAIL = "wycats@gmail.com"
|
10
10
|
GEM_NAME = "data_objects"
|
11
11
|
GEM_VERSION = DataObjects::VERSION
|
12
|
-
GEM_DEPENDENCIES = ["addressable", ">=1.0.3"], ["extlib", "
|
12
|
+
GEM_DEPENDENCIES = ["addressable", ">=1.0.3"], ["extlib", ">=0.9.5"]
|
13
13
|
GEM_CLEAN = "{coverage,doc,log}/", "profile_results.*", "**/.*.sw?", "*.gem", ".config", "**/.DS_Store"
|
14
14
|
GEM_EXTRAS = {}
|
15
15
|
|
data/lib/data_objects.rb
CHANGED
@@ -9,7 +9,7 @@ class Object
|
|
9
9
|
# because instances are keeped in memory reused.
|
10
10
|
#
|
11
11
|
# Classes that include Pooling module have re-defined new
|
12
|
-
# method that returns instances
|
12
|
+
# method that returns instances acquired from pool.
|
13
13
|
#
|
14
14
|
# Term resource is used for any type of poolable objects
|
15
15
|
# and should NOT be thought as DataMapper Resource or
|
@@ -43,18 +43,18 @@ class Object
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# ==== Notes
|
46
|
-
# Instances of poolable resource are
|
46
|
+
# Instances of poolable resource are acquired from
|
47
47
|
# pool. This quires a new instance from pool and
|
48
48
|
# returns it.
|
49
49
|
#
|
50
50
|
# ==== Returns
|
51
|
-
# Resource instance
|
51
|
+
# Resource instance acquired from the pool.
|
52
52
|
#
|
53
53
|
# ==== Raises
|
54
54
|
# ArgumentError:: when pool is exhausted and no instance
|
55
|
-
# can be
|
55
|
+
# can be acquired.
|
56
56
|
def new
|
57
|
-
pool.
|
57
|
+
pool.acquire
|
58
58
|
end
|
59
59
|
|
60
60
|
# ==== Notes
|
@@ -118,20 +118,20 @@ class Object
|
|
118
118
|
end
|
119
119
|
|
120
120
|
# ==== Notes
|
121
|
-
# Indicates if pool has resources to
|
121
|
+
# Indicates if pool has resources to acquire.
|
122
122
|
#
|
123
123
|
# ==== Returns
|
124
|
-
# <Boolean>:: true if pool has resources can be
|
124
|
+
# <Boolean>:: true if pool has resources can be acquired,
|
125
125
|
# false otherwise.
|
126
126
|
def available?
|
127
127
|
@reserved.size < size_limit
|
128
128
|
end
|
129
129
|
|
130
130
|
# ==== Notes
|
131
|
-
#
|
131
|
+
# Acquires last used available resource and returns it.
|
132
132
|
# If no resources available, current implementation
|
133
133
|
# throws an exception.
|
134
|
-
def
|
134
|
+
def acquire
|
135
135
|
@lock.synchronize do
|
136
136
|
if available?
|
137
137
|
instance = prepair_available_resource
|
@@ -145,10 +145,10 @@ class Object
|
|
145
145
|
end
|
146
146
|
|
147
147
|
# ==== Notes
|
148
|
-
# Releases previously
|
148
|
+
# Releases previously acquired instance.
|
149
149
|
#
|
150
150
|
# ==== Parameters
|
151
|
-
# instance <Anything>:: previosly
|
151
|
+
# instance <Anything>:: previosly acquired instance.
|
152
152
|
#
|
153
153
|
# ==== Raises
|
154
154
|
# RuntimeError:: when given not pooled instance.
|
@@ -178,12 +178,12 @@ class Object
|
|
178
178
|
end
|
179
179
|
|
180
180
|
# ==== Notes
|
181
|
-
# Check if instance has been
|
181
|
+
# Check if instance has been acquired from the pool.
|
182
182
|
#
|
183
183
|
# ==== Returns
|
184
|
-
# <Boolean>:: true if given resource instance has been
|
184
|
+
# <Boolean>:: true if given resource instance has been acquired from pool,
|
185
185
|
# false otherwise.
|
186
|
-
def
|
186
|
+
def acquired?(instance)
|
187
187
|
@reserved.include?(instance)
|
188
188
|
end
|
189
189
|
|
@@ -208,7 +208,7 @@ class Object
|
|
208
208
|
# ==== Returns
|
209
209
|
# <Boolean>:: true if instance should be released, false otherwise.
|
210
210
|
def time_to_release?(instance)
|
211
|
-
(Time.now - instance.instance_variable_get("@
|
211
|
+
(Time.now - instance.instance_variable_get("@__pool_acquire_timestamp")) > @expiration_period
|
212
212
|
end
|
213
213
|
|
214
214
|
protected
|
@@ -220,13 +220,13 @@ class Object
|
|
220
220
|
def prepair_available_resource
|
221
221
|
if @available.size > 0
|
222
222
|
res = @available.pop
|
223
|
-
res.instance_variable_set("@
|
223
|
+
res.instance_variable_set("@__pool_acquire_timestamp", Time.now)
|
224
224
|
|
225
225
|
res
|
226
226
|
else
|
227
227
|
res = @class_of_resources.allocate
|
228
228
|
res.send(:initialize, *@initialization_args)
|
229
|
-
res.instance_variable_set("@
|
229
|
+
res.instance_variable_set("@__pool_acquire_timestamp", Time.now)
|
230
230
|
|
231
231
|
res
|
232
232
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'digest'
|
2
|
+
require 'digest/sha2'
|
2
3
|
|
3
4
|
module DataObjects
|
4
5
|
|
@@ -23,7 +24,7 @@ module DataObjects
|
|
23
24
|
#
|
24
25
|
def initialize(uri)
|
25
26
|
@connection = DataObjects::Connection.new(uri)
|
26
|
-
@id = Digest::
|
27
|
+
@id = Digest::SHA256.hexdigest("#{HOST}:#{$$}:#{Time.now.to_f}:#{@@counter += 1}")
|
27
28
|
end
|
28
29
|
|
29
30
|
def close
|
data/lib/data_objects/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module DataObjects
|
2
|
-
VERSION = "0.9.
|
3
|
-
end
|
2
|
+
VERSION = "0.9.5" unless defined?(DataObjects::VERSION)
|
3
|
+
end
|
data/spec/connection_spec.rb
CHANGED
@@ -49,7 +49,7 @@ describe DataObjects::Connection do
|
|
49
49
|
uri.path.should == '/database'
|
50
50
|
end
|
51
51
|
|
52
|
-
it "should accept a
|
52
|
+
it "should accept a connection uri as a Addressable::URI" do
|
53
53
|
c = DataObjects::Connection.new(Addressable::URI::parse('mock://localhost/database'))
|
54
54
|
# relying on the fact that mock connection sets @uri
|
55
55
|
uri = c.instance_variable_get("@uri")
|
@@ -58,17 +58,17 @@ describe DataObjects::Connection do
|
|
58
58
|
uri.to_s.should == 'mock://localhost/database'
|
59
59
|
end
|
60
60
|
|
61
|
-
it "should determine which DataObject adapter from the uri scheme" do
|
61
|
+
it "should determine which DataObject adapter to use from the uri scheme" do
|
62
62
|
DataObjects::Mock::Connection.should_receive(:__new)
|
63
63
|
DataObjects::Connection.new('mock://localhost/database')
|
64
64
|
end
|
65
65
|
|
66
|
-
it "should determine which DataObject adapter from a JDBC URL scheme" do
|
66
|
+
it "should determine which DataObject adapter to use from a JDBC URL scheme" do
|
67
67
|
DataObjects::Mock::Connection.should_receive(:__new)
|
68
68
|
DataObjects::Connection.new('jdbc:mock://localhost/database')
|
69
69
|
end
|
70
70
|
|
71
|
-
it "should
|
71
|
+
it "should acquire a connection" do
|
72
72
|
uri = Addressable::URI.parse('mock://localhost/database')
|
73
73
|
DataObjects::Mock::Connection.should_receive(:__new).with(uri)
|
74
74
|
|
@@ -33,8 +33,8 @@ describe Object::Pooling::ResourcePool do
|
|
33
33
|
@pool.should respond_to(:flush!)
|
34
34
|
end
|
35
35
|
|
36
|
-
it "responds to
|
37
|
-
@pool.should respond_to(:
|
36
|
+
it "responds to acquire" do
|
37
|
+
@pool.should respond_to(:acquire)
|
38
38
|
end
|
39
39
|
|
40
40
|
it "responds to release" do
|
@@ -100,7 +100,7 @@ end
|
|
100
100
|
|
101
101
|
|
102
102
|
|
103
|
-
describe "
|
103
|
+
describe "Acquire from constant size pool" do
|
104
104
|
before :each do
|
105
105
|
DisposableResource.initialize_pool(2)
|
106
106
|
end
|
@@ -110,53 +110,53 @@ describe "Aquire from contant size pool" do
|
|
110
110
|
end
|
111
111
|
|
112
112
|
it "increased size of the pool" do
|
113
|
-
@time = DisposableResource.pool.
|
113
|
+
@time = DisposableResource.pool.acquire
|
114
114
|
DisposableResource.pool.size.should == 1
|
115
115
|
end
|
116
116
|
|
117
117
|
it "places initialized instance in the reserved set" do
|
118
|
-
@time = DisposableResource.pool.
|
118
|
+
@time = DisposableResource.pool.acquire
|
119
119
|
DisposableResource.pool.instance_variable_get("@reserved").size.should == 1
|
120
120
|
end
|
121
121
|
|
122
122
|
it "raises an exception when pool size limit is hit" do
|
123
|
-
@t1 = DisposableResource.pool.
|
124
|
-
@t2 = DisposableResource.pool.
|
123
|
+
@t1 = DisposableResource.pool.acquire
|
124
|
+
@t2 = DisposableResource.pool.acquire
|
125
125
|
|
126
|
-
lambda { DisposableResource.pool.
|
126
|
+
lambda { DisposableResource.pool.acquire }.should raise_error(RuntimeError)
|
127
127
|
end
|
128
128
|
|
129
129
|
it "returns last released resource" do
|
130
|
-
@t1 = DisposableResource.pool.
|
131
|
-
@t2 = DisposableResource.pool.
|
130
|
+
@t1 = DisposableResource.pool.acquire
|
131
|
+
@t2 = DisposableResource.pool.acquire
|
132
132
|
DisposableResource.pool.release(@t1)
|
133
133
|
|
134
|
-
DisposableResource.pool.
|
134
|
+
DisposableResource.pool.acquire.should == @t1
|
135
135
|
end
|
136
136
|
|
137
137
|
it "really truly returns last released resource" do
|
138
|
-
@t1 = DisposableResource.pool.
|
138
|
+
@t1 = DisposableResource.pool.acquire
|
139
139
|
DisposableResource.pool.release(@t1)
|
140
140
|
|
141
|
-
@t2 = DisposableResource.pool.
|
141
|
+
@t2 = DisposableResource.pool.acquire
|
142
142
|
DisposableResource.pool.release(@t2)
|
143
143
|
|
144
|
-
@t3 = DisposableResource.pool.
|
144
|
+
@t3 = DisposableResource.pool.acquire
|
145
145
|
DisposableResource.pool.release(@t3)
|
146
146
|
|
147
|
-
DisposableResource.pool.
|
147
|
+
DisposableResource.pool.acquire.should == @t1
|
148
148
|
@t1.should == @t3
|
149
149
|
end
|
150
150
|
|
151
151
|
it "sets allocation timestamp on resource instance" do
|
152
152
|
@t1 = DisposableResource.new
|
153
|
-
@t1.instance_variable_get("@
|
153
|
+
@t1.instance_variable_get("@__pool_acquire_timestamp").should be_close(Time.now, 2)
|
154
154
|
end
|
155
155
|
end
|
156
156
|
|
157
157
|
|
158
158
|
|
159
|
-
describe "Releasing from
|
159
|
+
describe "Releasing from constant size pool" do
|
160
160
|
before :each do
|
161
161
|
DisposableResource.initialize_pool(2)
|
162
162
|
end
|
@@ -166,8 +166,8 @@ describe "Releasing from contant size pool" do
|
|
166
166
|
end
|
167
167
|
|
168
168
|
it "decreases size of the pool" do
|
169
|
-
@t1 = DisposableResource.pool.
|
170
|
-
@t2 = DisposableResource.pool.
|
169
|
+
@t1 = DisposableResource.pool.acquire
|
170
|
+
@t2 = DisposableResource.pool.acquire
|
171
171
|
DisposableResource.pool.release(@t1)
|
172
172
|
|
173
173
|
DisposableResource.pool.size.should == 1
|
@@ -182,14 +182,14 @@ describe "Releasing from contant size pool" do
|
|
182
182
|
end
|
183
183
|
|
184
184
|
it "disposes released object" do
|
185
|
-
@t1 = DisposableResource.pool.
|
185
|
+
@t1 = DisposableResource.pool.acquire
|
186
186
|
|
187
187
|
@t1.should_receive(:dispose)
|
188
188
|
DisposableResource.pool.release(@t1)
|
189
189
|
end
|
190
190
|
|
191
191
|
it "removes released object from reserved set" do
|
192
|
-
@t1 = DisposableResource.pool.
|
192
|
+
@t1 = DisposableResource.pool.acquire
|
193
193
|
|
194
194
|
lambda {
|
195
195
|
DisposableResource.pool.release(@t1)
|
@@ -197,27 +197,27 @@ describe "Releasing from contant size pool" do
|
|
197
197
|
end
|
198
198
|
|
199
199
|
it "returns released object back to available set" do
|
200
|
-
@t1 = DisposableResource.pool.
|
200
|
+
@t1 = DisposableResource.pool.acquire
|
201
201
|
|
202
202
|
lambda {
|
203
203
|
DisposableResource.pool.release(@t1)
|
204
204
|
}.should change(DisposableResource.pool.instance_variable_get("@available"), :size).by(1)
|
205
205
|
end
|
206
206
|
|
207
|
-
it "updates
|
208
|
-
#
|
207
|
+
it "updates acquire timestamp on already allocated resource instance" do
|
208
|
+
# acquire it once
|
209
209
|
@t1 = DisposableResource.new
|
210
210
|
# wait a bit
|
211
211
|
sleep 3
|
212
212
|
|
213
213
|
# check old timestamp
|
214
|
-
@t1.instance_variable_get("@
|
214
|
+
@t1.instance_variable_get("@__pool_acquire_timestamp").should be_close(Time.now, 4)
|
215
215
|
|
216
|
-
# re-
|
216
|
+
# re-acquire
|
217
217
|
DisposableResource.pool.release(@t1)
|
218
218
|
@t1 = DisposableResource.new
|
219
219
|
# see timestamp is updated
|
220
|
-
@t1.instance_variable_get("@
|
220
|
+
@t1.instance_variable_get("@__pool_acquire_timestamp").should be_close(Time.now, 2)
|
221
221
|
end
|
222
222
|
end
|
223
223
|
|
@@ -238,7 +238,7 @@ describe Object::Pooling::ResourcePool, "#available?" do
|
|
238
238
|
end
|
239
239
|
|
240
240
|
it "returns false when pool is exhausted" do
|
241
|
-
#
|
241
|
+
# acquires the last available resource
|
242
242
|
DisposableResource.new
|
243
243
|
DisposableResource.pool.should_not be_available
|
244
244
|
end
|
@@ -246,7 +246,7 @@ end
|
|
246
246
|
|
247
247
|
|
248
248
|
|
249
|
-
describe "Flushing of
|
249
|
+
describe "Flushing of constant size pool" do
|
250
250
|
before :each do
|
251
251
|
DisposableResource.initialize_pool(2)
|
252
252
|
|
@@ -291,10 +291,10 @@ describe "Poolable resource class" do
|
|
291
291
|
DisposableResource.instance_variable_set("@__pool", nil)
|
292
292
|
end
|
293
293
|
|
294
|
-
it "
|
294
|
+
it "acquires new instances from pool" do
|
295
295
|
@instance_one = DisposableResource.new
|
296
296
|
|
297
|
-
DisposableResource.pool.
|
297
|
+
DisposableResource.pool.acquired?(@instance_one).should be(true)
|
298
298
|
end
|
299
299
|
|
300
300
|
it "flushed existing pool on re-initialization" do
|
@@ -344,7 +344,7 @@ describe Object::Pooling::ResourcePool, "#time_to_dispose?" do
|
|
344
344
|
DisposableResource.instance_variable_set("@__pool", nil)
|
345
345
|
end
|
346
346
|
|
347
|
-
it "returns true when object's last
|
347
|
+
it "returns true when object's last acquisition time is greater than limit" do
|
348
348
|
@t1 = DisposableResource.new
|
349
349
|
DisposableResource.pool.time_to_release?(@t1).should be(false)
|
350
350
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: data_objects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yehuda Katz
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-08-
|
12
|
+
date: 2008-08-26 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -28,9 +28,9 @@ dependencies:
|
|
28
28
|
version_requirement:
|
29
29
|
version_requirements: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.9.
|
33
|
+
version: 0.9.5
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: hoe
|