assistance 0.0.1 → 0.0.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.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.0.2 (2008-01-10)
2
+
3
+ * Removed Sequel namespace for ConnectionPool.
4
+
1
5
  === 0.0.1 (2008-01-10)
2
6
 
3
7
  * Imported #blank? from DataMapper.
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ include FileUtils
9
9
  # Configuration
10
10
  ##############################################################################
11
11
  NAME = "assistance"
12
- VERS = "0.0.1"
12
+ VERS = "0.0.2"
13
13
  CLEAN.include ["**/.*.sw?", "pkg/*", ".config", "doc/*", "coverage/*"]
14
14
  RDOC_OPTS = [
15
15
  "--quiet",
@@ -33,6 +33,13 @@ Rake::RDocTask.new do |rdoc|
33
33
  rdoc.rdoc_files.add ["README", "COPYING", "lib/assistance.rb", "lib/**/*.rb"]
34
34
  end
35
35
 
36
+ task :doc_rforge => [:doc]
37
+
38
+ desc "Update docs and upload to rubyforge.org"
39
+ task :doc_rforge do
40
+ sh %{scp -r doc/rdoc/* ciconia@rubyforge.org:/var/www/gforge-projects/assistance}
41
+ end
42
+
36
43
  ##############################################################################
37
44
  # Gem packaging
38
45
  ##############################################################################
@@ -85,7 +92,7 @@ end
85
92
 
86
93
  task :tag do
87
94
  cwd = FileUtils.pwd
88
- sh %{cd ../.. && svn copy #{cwd} tags/#{NAME}-#{VERS} && svn commit -m "#{NAME}-#{VERS} tag." tags}
95
+ sh %{cd .. && svn copy #{cwd} tags/#{NAME}-#{VERS} && svn commit -m "#{NAME}-#{VERS} tag." tags}
89
96
  end
90
97
 
91
98
  ##############################################################################
@@ -1,152 +1,150 @@
1
1
  require 'thread'
2
2
 
3
- module Sequel
4
- # A ConnectionPool manages access to database connections by keeping
5
- # multiple connections and giving threads exclusive access to each
6
- # connection.
7
- class ConnectionPool
8
- attr_reader :mutex
9
-
10
- # The maximum number of connections.
11
- attr_reader :max_size
12
-
13
- # The proc used to create a new connection.
14
- attr_accessor :connection_proc
15
-
16
- attr_reader :available_connections, :allocated, :created_count
3
+ # A ConnectionPool manages access to database connections by keeping
4
+ # multiple connections and giving threads exclusive access to each
5
+ # connection.
6
+ class ConnectionPool
7
+ attr_reader :mutex
17
8
 
18
- # Constructs a new pool with a maximum size. If a block is supplied, it
19
- # is used to create new connections as they are needed.
20
- #
21
- # pool = ConnectionPool.new(10) {MyConnection.new(opts)}
22
- #
23
- # The connection creation proc can be changed at any time by assigning a
24
- # Proc to pool#connection_proc.
25
- #
26
- # pool = ConnectionPool.new(10)
27
- # pool.connection_proc = proc {MyConnection.new(opts)}
28
- def initialize(max_size = 4, &block)
29
- @max_size = max_size
30
- @mutex = Mutex.new
31
- @connection_proc = block
9
+ # The maximum number of connections.
10
+ attr_reader :max_size
11
+
12
+ # The proc used to create a new connection.
13
+ attr_accessor :connection_proc
14
+
15
+ attr_reader :available_connections, :allocated, :created_count
32
16
 
33
- @available_connections = []
34
- @allocated = {}
35
- @created_count = 0
17
+ # Constructs a new pool with a maximum size. If a block is supplied, it
18
+ # is used to create new connections as they are needed.
19
+ #
20
+ # pool = ConnectionPool.new(10) {MyConnection.new(opts)}
21
+ #
22
+ # The connection creation proc can be changed at any time by assigning a
23
+ # Proc to pool#connection_proc.
24
+ #
25
+ # pool = ConnectionPool.new(10)
26
+ # pool.connection_proc = proc {MyConnection.new(opts)}
27
+ def initialize(max_size = 4, &block)
28
+ @max_size = max_size
29
+ @mutex = Mutex.new
30
+ @connection_proc = block
31
+
32
+ @available_connections = []
33
+ @allocated = {}
34
+ @created_count = 0
35
+ end
36
+
37
+ # Returns the number of created connections.
38
+ def size
39
+ @created_count
40
+ end
41
+
42
+ # Assigns a connection to the current thread, yielding the connection
43
+ # to the supplied block.
44
+ #
45
+ # pool.hold {|conn| conn.execute('DROP TABLE posts')}
46
+ #
47
+ # Pool#hold is re-entrant, meaning it can be called recursively in
48
+ # the same thread without blocking.
49
+ #
50
+ # If no connection is available, Pool#hold will block until a connection
51
+ # is available.
52
+ def hold
53
+ t = Thread.current
54
+ if (conn = owned_connection(t))
55
+ return yield(conn)
36
56
  end
37
-
38
- # Returns the number of created connections.
39
- def size
40
- @created_count
57
+ while !(conn = acquire(t))
58
+ sleep 0.001
41
59
  end
42
-
43
- # Assigns a connection to the current thread, yielding the connection
44
- # to the supplied block.
45
- #
46
- # pool.hold {|conn| conn.execute('DROP TABLE posts')}
47
- #
48
- # Pool#hold is re-entrant, meaning it can be called recursively in
49
- # the same thread without blocking.
50
- #
51
- # If no connection is available, Pool#hold will block until a connection
52
- # is available.
53
- def hold
54
- t = Thread.current
55
- if (conn = owned_connection(t))
56
- return yield(conn)
57
- end
58
- while !(conn = acquire(t))
59
- sleep 0.001
60
- end
61
- begin
62
- yield conn
63
- ensure
64
- release(t)
65
- end
66
- rescue Exception => e
67
- # if the error is not a StandardError it is converted into RuntimeError.
68
- raise e.is_a?(StandardError) ? e : e.message
60
+ begin
61
+ yield conn
62
+ ensure
63
+ release(t)
69
64
  end
70
-
71
- # Removes all connection currently available, optionally yielding each
72
- # connection to the given block. This method has the effect of
73
- # disconnecting from the database. Once a connection is requested using
74
- # #hold, the connection pool creates new connections to the database.
75
- def disconnect(&block)
76
- @mutex.synchronize do
77
- @available_connections.each {|c| block[c]} if block
78
- @available_connections = []
79
- @created_count = @allocated.size
80
- end
65
+ rescue Exception => e
66
+ # if the error is not a StandardError it is converted into RuntimeError.
67
+ raise e.is_a?(StandardError) ? e : e.message
68
+ end
69
+
70
+ # Removes all connection currently available, optionally yielding each
71
+ # connection to the given block. This method has the effect of
72
+ # disconnecting from the database. Once a connection is requested using
73
+ # #hold, the connection pool creates new connections to the database.
74
+ def disconnect(&block)
75
+ @mutex.synchronize do
76
+ @available_connections.each {|c| block[c]} if block
77
+ @available_connections = []
78
+ @created_count = @allocated.size
79
+ end
80
+ end
81
+
82
+ private
83
+ # Returns the connection owned by the supplied thread, if any.
84
+ def owned_connection(thread)
85
+ @mutex.synchronize {@allocated[thread]}
81
86
  end
82
87
 
83
- private
84
- # Returns the connection owned by the supplied thread, if any.
85
- def owned_connection(thread)
86
- @mutex.synchronize {@allocated[thread]}
87
- end
88
-
89
- # Assigns a connection to the supplied thread, if one is available.
90
- def acquire(thread)
91
- @mutex.synchronize do
92
- if conn = available
93
- @allocated[thread] = conn
94
- end
95
- end
96
- end
97
-
98
- # Returns an available connection. If no connection is available,
99
- # tries to create a new connection.
100
- def available
101
- @available_connections.pop || make_new
102
- end
103
-
104
- # Creates a new connection if the size of the pool is less than the
105
- # maximum size.
106
- def make_new
107
- if @created_count < @max_size
108
- @created_count += 1
109
- @connection_proc ? @connection_proc.call : \
110
- (raise Error, "No connection proc specified")
111
- end
112
- end
113
-
114
- # Releases the connection assigned to the supplied thread.
115
- def release(thread)
116
- @mutex.synchronize do
117
- @available_connections << @allocated[thread]
118
- @allocated.delete(thread)
88
+ # Assigns a connection to the supplied thread, if one is available.
89
+ def acquire(thread)
90
+ @mutex.synchronize do
91
+ if conn = available
92
+ @allocated[thread] = conn
119
93
  end
120
94
  end
121
- end
122
-
123
- # A SingleThreadedPool acts as a replacement for a ConnectionPool for use
124
- # in single-threaded applications. ConnectionPool imposes a substantial
125
- # performance penalty, so SingleThreadedPool is used to gain some speed.
126
- class SingleThreadedPool
127
- attr_reader :conn
128
- attr_writer :connection_proc
95
+ end
129
96
 
130
- # Initializes the instance with the supplied block as the connection_proc.
131
- def initialize(&block)
132
- @connection_proc = block
97
+ # Returns an available connection. If no connection is available,
98
+ # tries to create a new connection.
99
+ def available
100
+ @available_connections.pop || make_new
133
101
  end
134
102
 
135
- # Yields the connection to the supplied block. This method simulates the
136
- # ConnectionPool#hold API.
137
- def hold
138
- @conn ||= @connection_proc.call
139
- yield @conn
140
- rescue Exception => e
141
- # if the error is not a StandardError it is converted into RuntimeError.
142
- raise e.is_a?(StandardError) ? e : e.message
103
+ # Creates a new connection if the size of the pool is less than the
104
+ # maximum size.
105
+ def make_new
106
+ if @created_count < @max_size
107
+ @created_count += 1
108
+ @connection_proc ? @connection_proc.call : \
109
+ (raise Error, "No connection proc specified")
110
+ end
143
111
  end
144
112
 
145
- # Disconnects from the database. Once a connection is requested using
146
- # #hold, the connection is reestablished.
147
- def disconnect(&block)
148
- block[@conn] if block && @conn
149
- @conn = nil
113
+ # Releases the connection assigned to the supplied thread.
114
+ def release(thread)
115
+ @mutex.synchronize do
116
+ @available_connections << @allocated[thread]
117
+ @allocated.delete(thread)
118
+ end
150
119
  end
120
+ end
121
+
122
+ # A SingleThreadedPool acts as a replacement for a ConnectionPool for use
123
+ # in single-threaded applications. ConnectionPool imposes a substantial
124
+ # performance penalty, so SingleThreadedPool is used to gain some speed.
125
+ class SingleThreadedPool
126
+ attr_reader :conn
127
+ attr_writer :connection_proc
128
+
129
+ # Initializes the instance with the supplied block as the connection_proc.
130
+ def initialize(&block)
131
+ @connection_proc = block
132
+ end
133
+
134
+ # Yields the connection to the supplied block. This method simulates the
135
+ # ConnectionPool#hold API.
136
+ def hold
137
+ @conn ||= @connection_proc.call
138
+ yield @conn
139
+ rescue Exception => e
140
+ # if the error is not a StandardError it is converted into RuntimeError.
141
+ raise e.is_a?(StandardError) ? e : e.message
142
+ end
143
+
144
+ # Disconnects from the database. Once a connection is requested using
145
+ # #hold, the connection is reestablished.
146
+ def disconnect(&block)
147
+ block[@conn] if block && @conn
148
+ @conn = nil
151
149
  end
152
150
  end
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), 'spec_helper')
2
2
 
3
3
  context "An empty ConnectionPool" do
4
4
  setup do
5
- @cpool = Sequel::ConnectionPool.new
5
+ @cpool = ConnectionPool.new
6
6
  end
7
7
 
8
8
  specify "should have no available connections" do
@@ -21,7 +21,7 @@ end
21
21
  context "A connection pool handling connections" do
22
22
  setup do
23
23
  @max_size = 2
24
- @cpool = Sequel::ConnectionPool.new(@max_size) {:got_connection}
24
+ @cpool = ConnectionPool.new(@max_size) {:got_connection}
25
25
  end
26
26
 
27
27
  specify "#hold should increment #created_count" do
@@ -73,7 +73,7 @@ end
73
73
 
74
74
  context "ConnectionPool#hold" do
75
75
  setup do
76
- @pool = Sequel::ConnectionPool.new {DummyConnection.new}
76
+ @pool = ConnectionPool.new {DummyConnection.new}
77
77
  end
78
78
 
79
79
  specify "should pass the result of the connection maker proc to the supplied block" do
@@ -109,7 +109,7 @@ end
109
109
 
110
110
  context "ConnectionPool#connection_proc" do
111
111
  setup do
112
- @pool = Sequel::ConnectionPool.new
112
+ @pool = ConnectionPool.new
113
113
  end
114
114
 
115
115
  specify "should be nil if no block is supplied to the pool" do
@@ -128,7 +128,7 @@ end
128
128
  context "A connection pool with a max size of 1" do
129
129
  setup do
130
130
  @invoked_count = 0
131
- @pool = Sequel::ConnectionPool.new(1) {@invoked_count += 1; 'herro'}
131
+ @pool = ConnectionPool.new(1) {@invoked_count += 1; 'herro'}
132
132
  end
133
133
 
134
134
  specify "should let only one thread access the connection at any time" do
@@ -204,7 +204,7 @@ end
204
204
  context "A connection pool with a max size of 5" do
205
205
  setup do
206
206
  @invoked_count = 0
207
- @pool = Sequel::ConnectionPool.new(5) {@invoked_count += 1}
207
+ @pool = ConnectionPool.new(5) {@invoked_count += 1}
208
208
  end
209
209
 
210
210
  specify "should let five threads simultaneously access separate connections" do
@@ -274,7 +274,7 @@ end
274
274
  context "ConnectionPool#disconnect" do
275
275
  setup do
276
276
  @count = 0
277
- @pool = Sequel::ConnectionPool.new(5) {{:id => @count += 1}}
277
+ @pool = ConnectionPool.new(5) {{:id => @count += 1}}
278
278
  end
279
279
 
280
280
  specify "should invoke the given block for each available connection" do
@@ -338,7 +338,7 @@ end
338
338
 
339
339
  context "SingleThreadedPool" do
340
340
  setup do
341
- @pool = Sequel::SingleThreadedPool.new {1234}
341
+ @pool = SingleThreadedPool.new {1234}
342
342
  end
343
343
 
344
344
  specify "should provide a #hold method" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: assistance
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ezra Zygmuntowicz, Sam Smoot, Sharon Rosner