espace-neverblock 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- require 'mysql'
1
+ require 'mysqlplus'
2
2
 
3
3
  module NeverBlock
4
4
 
@@ -18,27 +18,48 @@ module NeverBlock
18
18
  # Creates a new mysql connection, sets it
19
19
  # to nonblocking and wraps the descriptor in an IO
20
20
  # object.
21
- def real_connect(*args)
22
- super(*args)
23
- @fd = socket
24
- @io = IO.new(socket)
21
+ def self.real_connect(*args)
22
+ me = super(*args)
23
+ me.init_descriptor
24
+ me
25
25
  end
26
26
  #alias :real_connect :initialize
27
27
  #alias :connect :initialize
28
+
29
+ def init_descriptor
30
+ @fd = socket
31
+ @io = IO.new(socket)
32
+ end
28
33
 
29
34
  # Assuming the use of NeverBlock fiber extensions and that the exec is run in
30
35
  # the context of a fiber. One that have the value :neverblock set to true.
31
36
  # All neverblock IO classes check this value, setting it to false will force
32
37
  # the execution in a blocking way.
33
38
  def query(sql)
34
- if Fiber.respond_to? :current and Fiber.current[:neverblock]
35
- send_query sql
36
- @fiber = Fiber.current
37
- Fiber.yield
38
- else
39
- super(sql)
39
+ begin
40
+ if Fiber.respond_to? :current and Fiber.current[:neverblock]
41
+ send_query sql
42
+ @fiber = Fiber.current
43
+ Fiber.yield
44
+ get_result
45
+ else
46
+ super(sql)
47
+ end
48
+ rescue Exception => e
49
+ reconnect if e.msg.include? "not connected"
50
+ raise e
40
51
  end
41
52
  end
53
+
54
+ # reset the connection
55
+ # and reattach to the
56
+ # event loop
57
+ def reconnect
58
+ unregister_from_event_loop
59
+ super
60
+ init_descriptor
61
+ register_with_event_loop(@loop)
62
+ end
42
63
 
43
64
  # Attaches the connection socket to an event loop.
44
65
  # Currently only supports EM, but Rev support will be
@@ -73,8 +94,8 @@ module NeverBlock
73
94
 
74
95
  # The callback, this is called whenever
75
96
  # there is data available at the socket
76
- def process_command
77
- @fiber.resume get_result
97
+ def resume_command
98
+ @fiber.resume
78
99
  end
79
100
 
80
101
  end #FiberedPostgresConnection
@@ -86,7 +107,7 @@ module NeverBlock
86
107
  @connection = connection
87
108
  end
88
109
  def notify_readable
89
- @connection.process_command
110
+ @connection.resume_command
90
111
  end
91
112
  end
92
113
 
@@ -20,24 +20,52 @@ module NeverBlock
20
20
  # object.
21
21
  def initialize(*args)
22
22
  super(*args)
23
- @fd = socket
24
- @io = IO.new(socket)
23
+ init_descriptor
25
24
  #setnonblocking(true)
26
25
  end
27
-
26
+
27
+ def init_descriptor
28
+ @fd = socket
29
+ @io = IO.new(socket)
30
+ end
28
31
  # Assuming the use of NeverBlock fiber extensions and that the exec is run in
29
32
  # the context of a fiber. One that have the value :neverblock set to true.
30
33
  # All neverblock IO classes check this value, setting it to false will force
31
34
  # the execution in a blocking way.
32
35
  def exec(sql)
33
- if Fiber.respond_to? :current and Fiber.current[:neverblock]
34
- self.send_query sql
35
- @fiber = Fiber.current
36
- Fiber.yield
37
- else
38
- super(sql)
36
+ begin
37
+ if Fiber.respond_to? :current and Fiber.current[:neverblock]
38
+ send_query sql
39
+ @fiber = Fiber.current
40
+ Fiber.yield
41
+ while is_busy
42
+ consume_input
43
+ Fiber.yield if is_busy
44
+ end
45
+ res, data = 0, []
46
+ while res != nil
47
+ res = self.get_result
48
+ data << res unless res.nil?
49
+ end
50
+ data.last
51
+ else
52
+ super(sql)
53
+ end
54
+ rescue Exception => e
55
+ reset if e.msg.include? "not connected"
56
+ raise e
39
57
  end
40
58
  end
59
+
60
+ # reset the connection
61
+ # and reattach to the
62
+ # event loop
63
+ def reset
64
+ unregister_from_event_loop
65
+ super
66
+ init_descriptor
67
+ register_with_event_loop(@loop)
68
+ end
41
69
 
42
70
  # Attaches the connection socket to an event loop.
43
71
  # Currently only supports EM, but Rev support will be
@@ -73,20 +101,9 @@ module NeverBlock
73
101
 
74
102
  # The callback, this is called whenever
75
103
  # there is data available at the socket
76
- def process_command
77
- # make sure all commands are sent
78
- # before attempting to read
79
- #return unless self.flush
80
- self.consume_input
81
- unless is_busy
82
- res, data = 0, []
83
- while res != nil
84
- res = self.get_result
85
- data << res unless res.nil?
86
- end
87
- #let the fiber continue its work
88
- @fiber.resume(data.last)
89
- end
104
+ def resume_command
105
+ #let the fiber continue its work
106
+ @fiber.resume
90
107
  end
91
108
 
92
109
  end #FiberedPostgresConnection
@@ -98,7 +115,7 @@ module NeverBlock
98
115
  @connection = connection
99
116
  end
100
117
  def notify_readable
101
- @connection.process_command
118
+ @connection.resume_command
102
119
  end
103
120
  end
104
121
 
data/neverblock.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "neverblock"
3
- s.version = "0.1.3"
3
+ s.version = "0.1.4"
4
4
  s.date = "2008-09-04"
5
5
  s.summary = "Utilities for non-blocking stack components"
6
6
  s.email = "oldmoe@gmail.com"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: espace-neverblock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Muhammad A. Ali