em-postgresql-sequel 0.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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
["mutex", "fibered_connection_pool", "pgconn", "watcher"].each { |f| require "em-postgresql-sequel/#{f}" }
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module EM
|
|
2
|
+
module Sequel
|
|
3
|
+
|
|
4
|
+
class FiberedConnectionPool < ::Sequel::ConnectionPool
|
|
5
|
+
def initialize(opts={}, &block)
|
|
6
|
+
super
|
|
7
|
+
@available = []
|
|
8
|
+
@waiting = []
|
|
9
|
+
|
|
10
|
+
Integer(opts[:max_connections] || 4).times do
|
|
11
|
+
@available << make_new(DEFAULT_SERVER)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
@mutex = Mutex.new
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def disconnect(opts={}, &block)
|
|
18
|
+
@mutex.synchronize do
|
|
19
|
+
block ||= @disconnection_proc
|
|
20
|
+
if block
|
|
21
|
+
m = Mutex.new
|
|
22
|
+
@available.each do |conn|
|
|
23
|
+
m.synchronize do
|
|
24
|
+
block.call(conn)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
@available.clear
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def size
|
|
33
|
+
@available.length
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def hold(server=nil, &blk)
|
|
37
|
+
if @available.empty?
|
|
38
|
+
@waiting << Fiber.current
|
|
39
|
+
Fiber.yield
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
@waiting.delete Fiber.current
|
|
43
|
+
conn = @available.pop
|
|
44
|
+
|
|
45
|
+
begin
|
|
46
|
+
blk.call(conn)
|
|
47
|
+
rescue ::Sequel::DatabaseDisconnectError
|
|
48
|
+
_conn = conn
|
|
49
|
+
conn = nil
|
|
50
|
+
@mutex.synchronize do
|
|
51
|
+
@disconnection_proc.call(_conn) if @disconnection_proc && _conn
|
|
52
|
+
@available << make_new(DEFAULT_SERVER)
|
|
53
|
+
end
|
|
54
|
+
raise
|
|
55
|
+
ensure
|
|
56
|
+
@available << conn if conn
|
|
57
|
+
if waiting = @waiting.shift
|
|
58
|
+
waiting.resume
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module EM
|
|
2
|
+
module Sequel
|
|
3
|
+
class Mutex
|
|
4
|
+
def initialize
|
|
5
|
+
@waiting = []
|
|
6
|
+
@current = nil
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def synchronize
|
|
10
|
+
if @current
|
|
11
|
+
if @current == Fiber.current
|
|
12
|
+
raise "already in synchronize"
|
|
13
|
+
else
|
|
14
|
+
@waiting << Fiber.current
|
|
15
|
+
Fiber.yield
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
@current = Fiber.current
|
|
20
|
+
|
|
21
|
+
begin
|
|
22
|
+
yield if block_given?
|
|
23
|
+
ensure
|
|
24
|
+
@current = nil
|
|
25
|
+
if waiting = @waiting.shift
|
|
26
|
+
waiting.resume
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Sequel
|
|
2
|
+
module Postgres
|
|
3
|
+
class ::PGconn
|
|
4
|
+
def async_exec(sql, args=nil)
|
|
5
|
+
send_query(sql, args)
|
|
6
|
+
|
|
7
|
+
deferrable = ::EM::DefaultDeferrable.new
|
|
8
|
+
::EM.watch(self.socket, EM::Sequel::Postgres::Watcher, self, deferrable).notify_readable = true
|
|
9
|
+
|
|
10
|
+
f = Fiber.current
|
|
11
|
+
|
|
12
|
+
deferrable.callback do |res|
|
|
13
|
+
# puts "!!! callback: #{res}"
|
|
14
|
+
|
|
15
|
+
# check for alive?, otherwise we probably resume a dead fiber, because someone has killed our session e.g. "select pg_terminate_backend('procpid');"
|
|
16
|
+
f.resume(res) if f.alive?
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
deferrable.errback do |err|
|
|
20
|
+
# puts "!!! errback: #{err}"
|
|
21
|
+
|
|
22
|
+
# check for alive?, otherwise we probably resume a dead fiber, because someone has killed our session e.g. "select pg_terminate_backend('procpid');"
|
|
23
|
+
f.resume(err) if f.alive?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
Fiber.yield.tap do |result|
|
|
27
|
+
raise result if result.is_a?(Exception)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module EM
|
|
2
|
+
module Sequel
|
|
3
|
+
module Postgres
|
|
4
|
+
module Watcher
|
|
5
|
+
def initialize(client, deferrable)
|
|
6
|
+
@client = client
|
|
7
|
+
@deferrable = deferrable
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def notify_readable
|
|
11
|
+
detach
|
|
12
|
+
begin
|
|
13
|
+
@client.block
|
|
14
|
+
@deferrable.succeed(@client.get_last_result)
|
|
15
|
+
rescue Exception => e
|
|
16
|
+
@deferrable.fail(e)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: em-postgresql-sequel
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: '0.1'
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Jan Zimmek
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2012-01-22 00:00:00.000000000Z
|
|
13
|
+
dependencies: []
|
|
14
|
+
description: glue together eventmachine, postgresql and sequel
|
|
15
|
+
email: jan.zimmek@web.de
|
|
16
|
+
executables: []
|
|
17
|
+
extensions: []
|
|
18
|
+
extra_rdoc_files: []
|
|
19
|
+
files:
|
|
20
|
+
- lib/em-postgresql-sequel/fibered_connection_pool.rb
|
|
21
|
+
- lib/em-postgresql-sequel/mutex.rb
|
|
22
|
+
- lib/em-postgresql-sequel/pgconn.rb
|
|
23
|
+
- lib/em-postgresql-sequel/watcher.rb
|
|
24
|
+
- lib/em-postgresql-sequel.rb
|
|
25
|
+
homepage:
|
|
26
|
+
licenses: []
|
|
27
|
+
post_install_message:
|
|
28
|
+
rdoc_options: []
|
|
29
|
+
require_paths:
|
|
30
|
+
- lib
|
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
32
|
+
none: false
|
|
33
|
+
requirements:
|
|
34
|
+
- - ! '>='
|
|
35
|
+
- !ruby/object:Gem::Version
|
|
36
|
+
version: '0'
|
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
38
|
+
none: false
|
|
39
|
+
requirements:
|
|
40
|
+
- - ! '>='
|
|
41
|
+
- !ruby/object:Gem::Version
|
|
42
|
+
version: '0'
|
|
43
|
+
requirements: []
|
|
44
|
+
rubyforge_project:
|
|
45
|
+
rubygems_version: 1.8.6
|
|
46
|
+
signing_key:
|
|
47
|
+
specification_version: 3
|
|
48
|
+
summary: glue together eventmachine, postgresql and sequel
|
|
49
|
+
test_files: []
|