groonga-client 0.0.4 → 0.0.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.
- checksums.yaml +7 -0
- data/doc/text/news.md +19 -0
- data/lib/groonga/client.rb +57 -58
- data/lib/groonga/client/{connection/request.rb → empty-request.rb} +4 -16
- data/lib/groonga/client/error.rb +22 -0
- data/lib/groonga/client/{connection → protocol}/error.rb +7 -2
- data/lib/groonga/client/{connection → protocol}/gqtp.rb +9 -4
- data/lib/groonga/client/protocol/http.rb +70 -0
- data/lib/groonga/client/protocol/http/coolio.rb +92 -0
- data/lib/groonga/client/protocol/http/thread.rb +95 -0
- data/lib/groonga/client/version.rb +1 -1
- data/test/{connection → protocol}/test-gqtp.rb +35 -26
- data/test/{connection → protocol}/test-http.rb +15 -16
- data/test/test-client.rb +1 -0
- metadata +38 -59
- data/lib/groonga/client/connection/http.rb +0 -83
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 421c54a9bc6c48ecfa2324010d0fd8e51d1bfb5d
|
4
|
+
data.tar.gz: 2588991abfffd393e18b43e5ebe8db807af463a5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f7a4b01cee40b67dd1c8225c90ae22c2fc4e0b9403df4345c68f8fb641cdb4c5282fbcb4668b2c4646092a36fc275cb408ff7fb0a84b1a719d903cd97e0ef6cd
|
7
|
+
data.tar.gz: a846c1f591bb17d996a521b6c4d5b7e28f5f8d2c0b06d9ec09a4b8feda6967e3057073464fa3f5413058bb1e09f401c7db9415b181b9936a3d7f6cbe1a74c3b7
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
1
|
# NEWS
|
2
2
|
|
3
|
+
## 0.0.5 - 2014-03-25
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* Wrapped internal connection errors by
|
8
|
+
`Groonga::Client::Connection::Error`.
|
9
|
+
* Supported asynchronous request by calling with block.
|
10
|
+
* Added Cool.io HTTP backend.
|
11
|
+
|
12
|
+
### Changes
|
13
|
+
|
14
|
+
* Changed protocol implementation module/directory name to
|
15
|
+
`protocol` from `connection`.
|
16
|
+
|
17
|
+
### Fixes
|
18
|
+
|
19
|
+
* Fixed a bug that options passed to `Groonga::Client.new` is
|
20
|
+
changed destructively.
|
21
|
+
|
3
22
|
## 0.0.4 - 2013-10-29
|
4
23
|
|
5
24
|
### Improvements
|
data/lib/groonga/client.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
#
|
3
3
|
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
4
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
5
5
|
#
|
6
6
|
# This library is free software; you can redistribute it and/or
|
7
7
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -18,8 +18,9 @@
|
|
18
18
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
19
19
|
|
20
20
|
require "groonga/client/command"
|
21
|
-
require "groonga/client/
|
22
|
-
require "groonga/client/
|
21
|
+
require "groonga/client/empty-request"
|
22
|
+
require "groonga/client/protocol/gqtp"
|
23
|
+
require "groonga/client/protocol/http"
|
23
24
|
|
24
25
|
module Groonga
|
25
26
|
class Client
|
@@ -59,18 +60,16 @@ module Groonga
|
|
59
60
|
end
|
60
61
|
end
|
61
62
|
|
62
|
-
attr_reader :protocol
|
63
|
-
attr_reader :connection
|
64
|
-
|
65
63
|
# @macro initialize_options
|
66
|
-
def initialize(options)
|
67
|
-
|
64
|
+
def initialize(options={})
|
65
|
+
options = options.dup
|
66
|
+
protocol = options.delete(:protocol) || :gqtp
|
68
67
|
|
69
68
|
@connection = nil
|
70
|
-
if
|
71
|
-
@connection = Groonga::Client::
|
69
|
+
if protocol == :gqtp
|
70
|
+
@connection = Groonga::Client::Protocol::GQTP.new(options)
|
72
71
|
else
|
73
|
-
@connection = Groonga::Client::
|
72
|
+
@connection = Groonga::Client::Protocol::HTTP.new(options)
|
74
73
|
end
|
75
74
|
end
|
76
75
|
|
@@ -108,101 +107,101 @@ module Groonga
|
|
108
107
|
if sync
|
109
108
|
false
|
110
109
|
else
|
111
|
-
|
110
|
+
EmptryReqest.new
|
112
111
|
end
|
113
112
|
end
|
114
113
|
end
|
115
114
|
|
116
|
-
def cache_limit(parameters)
|
117
|
-
execute_command("cache_limit", parameters)
|
115
|
+
def cache_limit(parameters, &block)
|
116
|
+
execute_command("cache_limit", parameters, &block)
|
118
117
|
end
|
119
118
|
|
120
|
-
def check(parameters)
|
121
|
-
execute_command("check", parameters)
|
119
|
+
def check(parameters, &block)
|
120
|
+
execute_command("check", parameters, &block)
|
122
121
|
end
|
123
122
|
|
124
|
-
def clearlock(parameters={})
|
125
|
-
execute_command("clearlock", parameters)
|
123
|
+
def clearlock(parameters={}, &block)
|
124
|
+
execute_command("clearlock", parameters, &block)
|
126
125
|
end
|
127
126
|
|
128
|
-
def column_create(parameters)
|
129
|
-
execute_command("column_create", parameters)
|
127
|
+
def column_create(parameters, &block)
|
128
|
+
execute_command("column_create", parameters, &block)
|
130
129
|
end
|
131
130
|
|
132
|
-
def column_list(parameters)
|
133
|
-
execute_command("column_list", parameters)
|
131
|
+
def column_list(parameters, &block)
|
132
|
+
execute_command("column_list", parameters, &block)
|
134
133
|
end
|
135
134
|
|
136
|
-
def column_remove(parameters)
|
137
|
-
execute_command("column_remove", parameters)
|
135
|
+
def column_remove(parameters, &block)
|
136
|
+
execute_command("column_remove", parameters, &block)
|
138
137
|
end
|
139
138
|
|
140
|
-
def column_rename(parameters)
|
141
|
-
execute_command("column_rename", parameters)
|
139
|
+
def column_rename(parameters, &block)
|
140
|
+
execute_command("column_rename", parameters, &block)
|
142
141
|
end
|
143
142
|
|
144
|
-
def defrag(parameters={})
|
145
|
-
execute_command("defrag", parameters)
|
143
|
+
def defrag(parameters={}, &block)
|
144
|
+
execute_command("defrag", parameters, &block)
|
146
145
|
end
|
147
146
|
|
148
|
-
def delete(parameters)
|
149
|
-
execute_command("delete", parameters)
|
147
|
+
def delete(parameters, &block)
|
148
|
+
execute_command("delete", parameters, &block)
|
150
149
|
end
|
151
150
|
|
152
|
-
def dump(parameters={})
|
153
|
-
execute_command("dump", parameters)
|
151
|
+
def dump(parameters={}, &block)
|
152
|
+
execute_command("dump", parameters, &block)
|
154
153
|
end
|
155
154
|
|
156
|
-
def load(parameters)
|
157
|
-
execute_command("load", parameters)
|
155
|
+
def load(parameters, &block)
|
156
|
+
execute_command("load", parameters, &block)
|
158
157
|
end
|
159
158
|
|
160
|
-
def log_level(parameters)
|
161
|
-
execute_command("log_level", parameters)
|
159
|
+
def log_level(parameters, &block)
|
160
|
+
execute_command("log_level", parameters, &block)
|
162
161
|
end
|
163
162
|
|
164
|
-
def log_put(parameters)
|
165
|
-
execute_command("log_put", parameters)
|
163
|
+
def log_put(parameters, &block)
|
164
|
+
execute_command("log_put", parameters, &block)
|
166
165
|
end
|
167
166
|
|
168
|
-
def log_reopen(parameters={})
|
169
|
-
execute_command("log_reopen", parameters)
|
167
|
+
def log_reopen(parameters={}, &block)
|
168
|
+
execute_command("log_reopen", parameters, &block)
|
170
169
|
end
|
171
170
|
|
172
|
-
def quit(parameters={})
|
173
|
-
execute_command("quit", parameters)
|
171
|
+
def quit(parameters={}, &block)
|
172
|
+
execute_command("quit", parameters, &block)
|
174
173
|
end
|
175
174
|
|
176
|
-
def register(parameters)
|
177
|
-
execute_command("register", parameters)
|
175
|
+
def register(parameters, &block)
|
176
|
+
execute_command("register", parameters, &block)
|
178
177
|
end
|
179
178
|
|
180
|
-
def select(parameters)
|
181
|
-
execute_command("select", parameters)
|
179
|
+
def select(parameters, &block)
|
180
|
+
execute_command("select", parameters, &block)
|
182
181
|
end
|
183
182
|
|
184
|
-
def shutdown(parameters={})
|
183
|
+
def shutdown(parameters={}, &block)
|
185
184
|
end
|
186
185
|
|
187
|
-
def status(parameters={})
|
188
|
-
execute_command("status", parameters)
|
186
|
+
def status(parameters={}, &block)
|
187
|
+
execute_command("status", parameters, &block)
|
189
188
|
end
|
190
189
|
|
191
|
-
def table_create(parameters)
|
192
|
-
execute_command("table_create", parameters)
|
190
|
+
def table_create(parameters, &block)
|
191
|
+
execute_command("table_create", parameters, &block)
|
193
192
|
end
|
194
193
|
|
195
|
-
def table_list(parameters={})
|
196
|
-
execute_command("table_list", parameters)
|
194
|
+
def table_list(parameters={}, &block)
|
195
|
+
execute_command("table_list", parameters, &block)
|
197
196
|
end
|
198
197
|
|
199
|
-
def table_remove(parameters)
|
198
|
+
def table_remove(parameters, &block)
|
200
199
|
end
|
201
200
|
|
202
|
-
def table_rename(parameters)
|
201
|
+
def table_rename(parameters, &block)
|
203
202
|
end
|
204
203
|
|
205
|
-
def truncate(parameters)
|
204
|
+
def truncate(parameters, &block)
|
206
205
|
end
|
207
206
|
|
208
207
|
def execute(command, &block)
|
@@ -210,11 +209,11 @@ module Groonga
|
|
210
209
|
end
|
211
210
|
|
212
211
|
private
|
213
|
-
def execute_command(command_name, parameters={})
|
212
|
+
def execute_command(command_name, parameters={}, &block)
|
214
213
|
parameters = normalize_parameters(parameters)
|
215
214
|
command_class = Groonga::Command.find(command_name)
|
216
215
|
command = command_class.new(command_name, parameters)
|
217
|
-
execute(command)
|
216
|
+
execute(command, &block)
|
218
217
|
end
|
219
218
|
|
220
219
|
def normalize_parameters(parameters)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
#
|
3
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
3
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
4
4
|
#
|
5
5
|
# This library is free software; you can redistribute it and/or
|
6
6
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -18,23 +18,11 @@
|
|
18
18
|
|
19
19
|
module Groonga
|
20
20
|
class Client
|
21
|
-
|
22
|
-
|
23
|
-
def initialize(thread)
|
24
|
-
@thread = thread
|
25
|
-
end
|
26
|
-
|
27
|
-
def wait
|
28
|
-
@thread.join
|
29
|
-
end
|
21
|
+
class EmptyRequest
|
22
|
+
def initialize
|
30
23
|
end
|
31
24
|
|
32
|
-
|
33
|
-
def initialize
|
34
|
-
end
|
35
|
-
|
36
|
-
def wait
|
37
|
-
end
|
25
|
+
def wait
|
38
26
|
end
|
39
27
|
end
|
40
28
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# Copyright (C) 2014 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
module Groonga
|
18
|
+
class Client
|
19
|
+
class Error < StandardError
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -16,10 +16,15 @@
|
|
16
16
|
# License along with this library; if not, write to the Free Software
|
17
17
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
18
|
|
19
|
+
require "groonga/client/error"
|
20
|
+
|
19
21
|
module Groonga
|
20
22
|
class Client
|
21
|
-
module
|
22
|
-
class Error <
|
23
|
+
module Protocol
|
24
|
+
class Error < Client::Error
|
25
|
+
end
|
26
|
+
|
27
|
+
class WrappedError < Error
|
23
28
|
attr_reader :raw_error
|
24
29
|
def initialize(raw_error)
|
25
30
|
@raw_error = raw_error
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
#
|
3
3
|
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
4
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
5
5
|
#
|
6
6
|
# This library is free software; you can redistribute it and/or
|
7
7
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -22,14 +22,19 @@ require "erb"
|
|
22
22
|
require "gqtp"
|
23
23
|
require "json"
|
24
24
|
|
25
|
-
require "groonga/client/
|
25
|
+
require "groonga/client/empty-request"
|
26
|
+
require "groonga/client/protocol/error"
|
26
27
|
|
27
28
|
module Groonga
|
28
29
|
class Client
|
29
|
-
module
|
30
|
+
module Protocol
|
30
31
|
class GQTP
|
31
32
|
def initialize(options)
|
32
|
-
|
33
|
+
begin
|
34
|
+
@client = ::GQTP::Client.new(options)
|
35
|
+
rescue ::GQTP::ConnectionError
|
36
|
+
raise WrappedError.new($!)
|
37
|
+
end
|
33
38
|
end
|
34
39
|
|
35
40
|
def send(command)
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
+
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
5
|
+
#
|
6
|
+
# This library is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
8
|
+
# License as published by the Free Software Foundation; either
|
9
|
+
# version 2.1 of the License, or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
17
|
+
# License along with this library; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
19
|
+
|
20
|
+
require "groonga/client/protocol/error"
|
21
|
+
|
22
|
+
module Groonga
|
23
|
+
class Client
|
24
|
+
module Protocol
|
25
|
+
class HTTP
|
26
|
+
class UnknownBackendError < Error
|
27
|
+
attr_reader :backend
|
28
|
+
def initialize(backend, detail)
|
29
|
+
@backend = backend
|
30
|
+
super("Unknown HTTP backend: <#{backend}>: #{detail}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(options)
|
35
|
+
@host = options[:host] || "127.0.0.1"
|
36
|
+
@port = options[:port] || 10041
|
37
|
+
@options = options
|
38
|
+
@backend = create_backend
|
39
|
+
end
|
40
|
+
|
41
|
+
def send(command, &block)
|
42
|
+
@backend.send(command, &block)
|
43
|
+
end
|
44
|
+
|
45
|
+
def connected?
|
46
|
+
@backend.connected?
|
47
|
+
end
|
48
|
+
|
49
|
+
def close(&block)
|
50
|
+
@backend.close(&block)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
def create_backend
|
55
|
+
backend = @options[:backend] || :thread
|
56
|
+
|
57
|
+
begin
|
58
|
+
require "groonga/client/protocol/http/#{backend}"
|
59
|
+
rescue LoadError
|
60
|
+
raise UnknownBackendError.new(backend, $!.message)
|
61
|
+
end
|
62
|
+
|
63
|
+
backend_name = backend.to_s.capitalize
|
64
|
+
backend_class = self.class.const_get(backend_name)
|
65
|
+
backend_class.new(@host, @port, @options)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# Copyright (C) 2014 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License as published by the Free Software Foundation; either
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
# Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
14
|
+
# License along with this library; if not, write to the Free Software
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
16
|
+
|
17
|
+
require "coolio"
|
18
|
+
|
19
|
+
require "groonga/client/empty-request"
|
20
|
+
require "groonga/client/protocol/error"
|
21
|
+
|
22
|
+
module Groonga
|
23
|
+
class Client
|
24
|
+
module Protocol
|
25
|
+
class HTTP
|
26
|
+
class Coolio
|
27
|
+
class Request
|
28
|
+
def initialize(client, loop)
|
29
|
+
@client = client
|
30
|
+
@loop = loop
|
31
|
+
end
|
32
|
+
|
33
|
+
def wait
|
34
|
+
until @client.finished?
|
35
|
+
@loop.run_once
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class GroongaHTTPClient < ::Coolio::HttpClient
|
41
|
+
def initialize(socket, callback)
|
42
|
+
super(socket)
|
43
|
+
@callback = callback
|
44
|
+
@finished = false
|
45
|
+
end
|
46
|
+
|
47
|
+
def finished?
|
48
|
+
@finished
|
49
|
+
end
|
50
|
+
|
51
|
+
def on_body_data(data)
|
52
|
+
@callback.call(data)
|
53
|
+
end
|
54
|
+
|
55
|
+
def on_close
|
56
|
+
super
|
57
|
+
@finished = true
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def initialize(host, port, options)
|
62
|
+
@host = host
|
63
|
+
@port = port
|
64
|
+
@options = options
|
65
|
+
@loop = @options[:loop] || ::Coolio::Loop.default
|
66
|
+
end
|
67
|
+
|
68
|
+
def send(command, &block)
|
69
|
+
client = GroongaHTTPClient.connect(@host, @port, block)
|
70
|
+
client.attach(@loop)
|
71
|
+
client.request("GET", command.to_uri_format)
|
72
|
+
Request.new(client, @loop)
|
73
|
+
end
|
74
|
+
|
75
|
+
def connected?
|
76
|
+
false
|
77
|
+
end
|
78
|
+
|
79
|
+
def close(&block)
|
80
|
+
sync = !block_given?
|
81
|
+
if sync
|
82
|
+
false
|
83
|
+
else
|
84
|
+
yield
|
85
|
+
EmptyRequest.new
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
2
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
3
|
+
#
|
4
|
+
# This library is free software; you can redistribute it and/or
|
5
|
+
# modify it under the terms of the GNU Lesser General Public
|
6
|
+
# License as published by the Free Software Foundation; either
|
7
|
+
# version 2.1 of the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This library is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
12
|
+
# Lesser General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
15
|
+
# License along with this library; if not, write to the Free Software
|
16
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
17
|
+
|
18
|
+
require "open-uri"
|
19
|
+
|
20
|
+
require "groonga/client/empty-request"
|
21
|
+
require "groonga/client/protocol/error"
|
22
|
+
|
23
|
+
module Groonga
|
24
|
+
class Client
|
25
|
+
module Protocol
|
26
|
+
class HTTP
|
27
|
+
class Thread
|
28
|
+
class Request
|
29
|
+
def initialize(thread)
|
30
|
+
@thread = thread
|
31
|
+
end
|
32
|
+
|
33
|
+
def wait
|
34
|
+
@thread.join
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize(host, port, options)
|
39
|
+
@host = host
|
40
|
+
@port = port
|
41
|
+
@options = options
|
42
|
+
end
|
43
|
+
|
44
|
+
def send(command)
|
45
|
+
url = "http://#{@host}:#{@port}#{command.to_uri_format}"
|
46
|
+
thread = ::Thread.new do
|
47
|
+
begin
|
48
|
+
open(url) do |response|
|
49
|
+
body = response.read
|
50
|
+
yield(body)
|
51
|
+
end
|
52
|
+
rescue OpenURI::HTTPError, Timeout::Error
|
53
|
+
raise WrappedError.new($!)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
Request.new(thread)
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [false] Always returns false because the current
|
60
|
+
# implementation doesn't support keep-alive.
|
61
|
+
def connected?
|
62
|
+
false
|
63
|
+
end
|
64
|
+
|
65
|
+
# Does nothing because the current implementation doesn't
|
66
|
+
# support keep-alive. If the implementation supports
|
67
|
+
# keep-alive, it close the opend connection.
|
68
|
+
#
|
69
|
+
# @overload close
|
70
|
+
# Closes synchronously.
|
71
|
+
#
|
72
|
+
# @return [false] It always returns false because there is always
|
73
|
+
# no connection.
|
74
|
+
#
|
75
|
+
# @overload close {}
|
76
|
+
# Closes asynchronously.
|
77
|
+
#
|
78
|
+
# @yield [] Calls the block when the opened connection is closed.
|
79
|
+
# @return [#wait] The request object. If you want to wait until
|
80
|
+
# the request is processed. You can send #wait message to the
|
81
|
+
# request.
|
82
|
+
def close(&block)
|
83
|
+
sync = !block_given?
|
84
|
+
if sync
|
85
|
+
false
|
86
|
+
else
|
87
|
+
yield
|
88
|
+
EmptyRequest.new
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
#
|
3
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
3
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
4
4
|
#
|
5
5
|
# This library is free software; you can redistribute it and/or
|
6
6
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -18,16 +18,16 @@
|
|
18
18
|
|
19
19
|
require "socket"
|
20
20
|
|
21
|
-
require "groonga/client/
|
21
|
+
require "groonga/client/protocol/gqtp"
|
22
22
|
|
23
|
-
class
|
23
|
+
class TestProtocolGQTP < Test::Unit::TestCase
|
24
24
|
def setup
|
25
25
|
setup_server
|
26
|
-
|
26
|
+
setup_client
|
27
27
|
end
|
28
28
|
|
29
29
|
def teardown
|
30
|
-
|
30
|
+
teardown_client
|
31
31
|
teardown_server
|
32
32
|
end
|
33
33
|
|
@@ -35,7 +35,6 @@ class TestConnectionGQTP < Test::Unit::TestCase
|
|
35
35
|
@address = "127.0.0.1"
|
36
36
|
@server = TCPServer.new(@address, 0)
|
37
37
|
@port = @server.addr[1]
|
38
|
-
@protocol = :gqtp
|
39
38
|
|
40
39
|
@thread = Thread.new do
|
41
40
|
client = @server.accept
|
@@ -51,12 +50,12 @@ class TestConnectionGQTP < Test::Unit::TestCase
|
|
51
50
|
@thread.kill
|
52
51
|
end
|
53
52
|
|
54
|
-
def
|
55
|
-
@
|
53
|
+
def setup_client
|
54
|
+
@client = nil
|
56
55
|
end
|
57
56
|
|
58
|
-
def
|
59
|
-
@
|
57
|
+
def teardown_client
|
58
|
+
@client.close {} if @client
|
60
59
|
end
|
61
60
|
|
62
61
|
private
|
@@ -65,41 +64,51 @@ class TestConnectionGQTP < Test::Unit::TestCase
|
|
65
64
|
:host => @address,
|
66
65
|
:port => @port,
|
67
66
|
}
|
68
|
-
Groonga::Client::
|
67
|
+
Groonga::Client::Protocol::GQTP.new(default_options.merge(options))
|
69
68
|
end
|
70
69
|
|
71
70
|
def process_client_close(client)
|
72
71
|
response_body = [].to_json
|
73
|
-
|
74
|
-
|
75
|
-
client.read(header.size)
|
72
|
+
header = GQTP::Header.parse(client.read(GQTP::Header.size))
|
73
|
+
client.read(header.size)
|
76
74
|
|
77
|
-
|
78
|
-
|
75
|
+
response_header = GQTP::Header.new
|
76
|
+
response_header.size = response_body.bytesize
|
79
77
|
|
80
|
-
|
81
|
-
|
78
|
+
client.write(response_header.pack)
|
79
|
+
client.write(response_body)
|
80
|
+
end
|
81
|
+
|
82
|
+
class TestConnect < self
|
83
|
+
def test_no_server
|
84
|
+
server = TCPServer.new("127.0.0.1", 0)
|
85
|
+
free_port = server.addr[1]
|
86
|
+
server.close
|
87
|
+
assert_raise(Groonga::Client::Protocol::WrappedError) do
|
88
|
+
Groonga::Client::Protocol::GQTP.new(:host => "127.0.0.1",
|
89
|
+
:port => free_port)
|
90
|
+
end
|
82
91
|
end
|
83
92
|
end
|
84
93
|
|
85
94
|
class TestConnected < self
|
86
95
|
def test_opened
|
87
|
-
@
|
88
|
-
assert_true(@
|
96
|
+
@client = connect
|
97
|
+
assert_true(@client.connected?)
|
89
98
|
end
|
90
99
|
|
91
100
|
def test_closed
|
92
|
-
@
|
93
|
-
@
|
94
|
-
assert_false(@
|
101
|
+
@client = connect
|
102
|
+
@client.close
|
103
|
+
assert_false(@client.connected?)
|
95
104
|
end
|
96
105
|
end
|
97
106
|
|
98
107
|
class TestClose < self
|
99
108
|
def test_twice
|
100
|
-
@
|
101
|
-
@
|
102
|
-
assert_false(@
|
109
|
+
@client = connect
|
110
|
+
@client.close
|
111
|
+
assert_false(@client.close)
|
103
112
|
end
|
104
113
|
end
|
105
114
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
#
|
3
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
3
|
+
# Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
|
4
4
|
#
|
5
5
|
# This library is free software; you can redistribute it and/or
|
6
6
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -18,16 +18,16 @@
|
|
18
18
|
|
19
19
|
require "socket"
|
20
20
|
|
21
|
-
require "groonga/client/
|
21
|
+
require "groonga/client/protocol/http"
|
22
22
|
|
23
|
-
class
|
23
|
+
class TestProtocolHTTP < Test::Unit::TestCase
|
24
24
|
def setup
|
25
25
|
setup_server
|
26
|
-
|
26
|
+
setup_client
|
27
27
|
end
|
28
28
|
|
29
29
|
def teardown
|
30
|
-
|
30
|
+
teardown_client
|
31
31
|
teardown_server
|
32
32
|
end
|
33
33
|
|
@@ -35,7 +35,6 @@ class TestConnectionHTTP < Test::Unit::TestCase
|
|
35
35
|
@address = "127.0.0.1"
|
36
36
|
@server = TCPServer.new(@address, 0)
|
37
37
|
@port = @server.addr[1]
|
38
|
-
@protocol = :http
|
39
38
|
|
40
39
|
@response_body = nil
|
41
40
|
@thread = Thread.new do
|
@@ -66,12 +65,12 @@ EOH
|
|
66
65
|
@thread.kill
|
67
66
|
end
|
68
67
|
|
69
|
-
def
|
70
|
-
@
|
68
|
+
def setup_client
|
69
|
+
@client = nil
|
71
70
|
end
|
72
71
|
|
73
|
-
def
|
74
|
-
@
|
72
|
+
def teardown_client
|
73
|
+
@client.close if @client
|
75
74
|
end
|
76
75
|
|
77
76
|
def connect(options={})
|
@@ -79,19 +78,19 @@ EOH
|
|
79
78
|
:host => @address,
|
80
79
|
:port => @port,
|
81
80
|
}
|
82
|
-
Groonga::Client::
|
81
|
+
Groonga::Client::Protocol::HTTP.new(default_options.merge(options))
|
83
82
|
end
|
84
83
|
|
85
84
|
def test_connected?
|
86
|
-
@
|
87
|
-
assert_false(@
|
85
|
+
@client = connect
|
86
|
+
assert_false(@client.connected?)
|
88
87
|
end
|
89
88
|
|
90
89
|
class TestClose < self
|
91
90
|
def test_twice
|
92
|
-
@
|
93
|
-
assert_false(@
|
94
|
-
assert_false(@
|
91
|
+
@client = connect
|
92
|
+
assert_false(@client.close)
|
93
|
+
assert_false(@client.close)
|
95
94
|
end
|
96
95
|
end
|
97
96
|
end
|
data/test/test-client.rb
CHANGED
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: groonga-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.5
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Haruka Yoshihara
|
@@ -11,161 +10,139 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date:
|
13
|
+
date: 2014-03-25 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: gqtp
|
18
17
|
requirement: !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
18
|
requirements:
|
21
|
-
- -
|
19
|
+
- - '>='
|
22
20
|
- !ruby/object:Gem::Version
|
23
21
|
version: 1.0.4
|
24
22
|
type: :runtime
|
25
23
|
prerelease: false
|
26
24
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
none: false
|
28
25
|
requirements:
|
29
|
-
- -
|
26
|
+
- - '>='
|
30
27
|
- !ruby/object:Gem::Version
|
31
28
|
version: 1.0.4
|
32
29
|
- !ruby/object:Gem::Dependency
|
33
30
|
name: groonga-command
|
34
31
|
requirement: !ruby/object:Gem::Requirement
|
35
|
-
none: false
|
36
32
|
requirements:
|
37
|
-
- -
|
33
|
+
- - '>='
|
38
34
|
- !ruby/object:Gem::Version
|
39
35
|
version: 1.0.4
|
40
36
|
type: :runtime
|
41
37
|
prerelease: false
|
42
38
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
39
|
requirements:
|
45
|
-
- -
|
40
|
+
- - '>='
|
46
41
|
- !ruby/object:Gem::Version
|
47
42
|
version: 1.0.4
|
48
43
|
- !ruby/object:Gem::Dependency
|
49
44
|
name: bundler
|
50
45
|
requirement: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
46
|
requirements:
|
53
|
-
- -
|
47
|
+
- - '>='
|
54
48
|
- !ruby/object:Gem::Version
|
55
49
|
version: '0'
|
56
50
|
type: :development
|
57
51
|
prerelease: false
|
58
52
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
53
|
requirements:
|
61
|
-
- -
|
54
|
+
- - '>='
|
62
55
|
- !ruby/object:Gem::Version
|
63
56
|
version: '0'
|
64
57
|
- !ruby/object:Gem::Dependency
|
65
58
|
name: rake
|
66
59
|
requirement: !ruby/object:Gem::Requirement
|
67
|
-
none: false
|
68
60
|
requirements:
|
69
|
-
- -
|
61
|
+
- - '>='
|
70
62
|
- !ruby/object:Gem::Version
|
71
63
|
version: '0'
|
72
64
|
type: :development
|
73
65
|
prerelease: false
|
74
66
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
67
|
requirements:
|
77
|
-
- -
|
68
|
+
- - '>='
|
78
69
|
- !ruby/object:Gem::Version
|
79
70
|
version: '0'
|
80
71
|
- !ruby/object:Gem::Dependency
|
81
72
|
name: test-unit
|
82
73
|
requirement: !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
74
|
requirements:
|
85
|
-
- -
|
75
|
+
- - '>='
|
86
76
|
- !ruby/object:Gem::Version
|
87
77
|
version: '0'
|
88
78
|
type: :development
|
89
79
|
prerelease: false
|
90
80
|
version_requirements: !ruby/object:Gem::Requirement
|
91
|
-
none: false
|
92
81
|
requirements:
|
93
|
-
- -
|
82
|
+
- - '>='
|
94
83
|
- !ruby/object:Gem::Version
|
95
84
|
version: '0'
|
96
85
|
- !ruby/object:Gem::Dependency
|
97
86
|
name: test-unit-notify
|
98
87
|
requirement: !ruby/object:Gem::Requirement
|
99
|
-
none: false
|
100
88
|
requirements:
|
101
|
-
- -
|
89
|
+
- - '>='
|
102
90
|
- !ruby/object:Gem::Version
|
103
91
|
version: '0'
|
104
92
|
type: :development
|
105
93
|
prerelease: false
|
106
94
|
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
none: false
|
108
95
|
requirements:
|
109
|
-
- -
|
96
|
+
- - '>='
|
110
97
|
- !ruby/object:Gem::Version
|
111
98
|
version: '0'
|
112
99
|
- !ruby/object:Gem::Dependency
|
113
100
|
name: test-unit-rr
|
114
101
|
requirement: !ruby/object:Gem::Requirement
|
115
|
-
none: false
|
116
102
|
requirements:
|
117
|
-
- -
|
103
|
+
- - '>='
|
118
104
|
- !ruby/object:Gem::Version
|
119
105
|
version: '0'
|
120
106
|
type: :development
|
121
107
|
prerelease: false
|
122
108
|
version_requirements: !ruby/object:Gem::Requirement
|
123
|
-
none: false
|
124
109
|
requirements:
|
125
|
-
- -
|
110
|
+
- - '>='
|
126
111
|
- !ruby/object:Gem::Version
|
127
112
|
version: '0'
|
128
113
|
- !ruby/object:Gem::Dependency
|
129
114
|
name: packnga
|
130
115
|
requirement: !ruby/object:Gem::Requirement
|
131
|
-
none: false
|
132
116
|
requirements:
|
133
|
-
- -
|
117
|
+
- - '>='
|
134
118
|
- !ruby/object:Gem::Version
|
135
119
|
version: '0'
|
136
120
|
type: :development
|
137
121
|
prerelease: false
|
138
122
|
version_requirements: !ruby/object:Gem::Requirement
|
139
|
-
none: false
|
140
123
|
requirements:
|
141
|
-
- -
|
124
|
+
- - '>='
|
142
125
|
- !ruby/object:Gem::Version
|
143
126
|
version: '0'
|
144
127
|
- !ruby/object:Gem::Dependency
|
145
128
|
name: redcarpet
|
146
129
|
requirement: !ruby/object:Gem::Requirement
|
147
|
-
none: false
|
148
130
|
requirements:
|
149
|
-
- -
|
131
|
+
- - '>='
|
150
132
|
- !ruby/object:Gem::Version
|
151
133
|
version: '0'
|
152
134
|
type: :development
|
153
135
|
prerelease: false
|
154
136
|
version_requirements: !ruby/object:Gem::Requirement
|
155
|
-
none: false
|
156
137
|
requirements:
|
157
|
-
- -
|
138
|
+
- - '>='
|
158
139
|
- !ruby/object:Gem::Version
|
159
140
|
version: '0'
|
160
|
-
description:
|
161
|
-
|
141
|
+
description: |
|
142
|
+
Groonga-client gem supports HTTP or
|
162
143
|
[GQTP (Groonga Query Transfer Protocol)](http://groonga.org/docs/spec/gqtp.html)
|
163
|
-
|
164
144
|
as the protocol using a client. You can use it without groonga
|
165
|
-
|
166
145
|
package.
|
167
|
-
|
168
|
-
'
|
169
146
|
email:
|
170
147
|
- yshr04hrk@gmail.com
|
171
148
|
- kou@clear-code.com
|
@@ -180,6 +157,7 @@ files:
|
|
180
157
|
- groonga-client.gemspec
|
181
158
|
- .yardopts
|
182
159
|
- lib/groonga/client/response.rb
|
160
|
+
- lib/groonga/client/error.rb
|
183
161
|
- lib/groonga/client/response/clearlock.rb
|
184
162
|
- lib/groonga/client/response/column_remove.rb
|
185
163
|
- lib/groonga/client/response/quit.rb
|
@@ -203,10 +181,12 @@ files:
|
|
203
181
|
- lib/groonga/client/response/column_list.rb
|
204
182
|
- lib/groonga/client/version.rb
|
205
183
|
- lib/groonga/client/command.rb
|
206
|
-
- lib/groonga/client/
|
207
|
-
- lib/groonga/client/
|
208
|
-
- lib/groonga/client/
|
209
|
-
- lib/groonga/client/
|
184
|
+
- lib/groonga/client/protocol/error.rb
|
185
|
+
- lib/groonga/client/protocol/http/coolio.rb
|
186
|
+
- lib/groonga/client/protocol/http/thread.rb
|
187
|
+
- lib/groonga/client/protocol/gqtp.rb
|
188
|
+
- lib/groonga/client/protocol/http.rb
|
189
|
+
- lib/groonga/client/empty-request.rb
|
210
190
|
- lib/groonga/client.rb
|
211
191
|
- doc/text/news.md
|
212
192
|
- test/run-test.rb
|
@@ -219,32 +199,31 @@ files:
|
|
219
199
|
- test/test-command.rb
|
220
200
|
- test/results/test-table-list.rb
|
221
201
|
- test/results/test-column-list.rb
|
222
|
-
- test/
|
223
|
-
- test/
|
202
|
+
- test/protocol/test-gqtp.rb
|
203
|
+
- test/protocol/test-http.rb
|
224
204
|
homepage: https://github.com/ranguba/groonga-client
|
225
205
|
licenses:
|
226
206
|
- LGPLv2.1 or later
|
207
|
+
metadata: {}
|
227
208
|
post_install_message:
|
228
209
|
rdoc_options: []
|
229
210
|
require_paths:
|
230
211
|
- lib
|
231
212
|
required_ruby_version: !ruby/object:Gem::Requirement
|
232
|
-
none: false
|
233
213
|
requirements:
|
234
|
-
- -
|
214
|
+
- - '>='
|
235
215
|
- !ruby/object:Gem::Version
|
236
216
|
version: '0'
|
237
217
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
238
|
-
none: false
|
239
218
|
requirements:
|
240
|
-
- -
|
219
|
+
- - '>='
|
241
220
|
- !ruby/object:Gem::Version
|
242
221
|
version: '0'
|
243
222
|
requirements: []
|
244
223
|
rubyforge_project:
|
245
|
-
rubygems_version:
|
224
|
+
rubygems_version: 2.0.14
|
246
225
|
signing_key:
|
247
|
-
specification_version:
|
226
|
+
specification_version: 4
|
248
227
|
summary: Groonga-client is a client for groonga (http://groonga.org/) implemented
|
249
228
|
with pure ruby.
|
250
229
|
test_files:
|
@@ -258,6 +237,6 @@ test_files:
|
|
258
237
|
- test/test-command.rb
|
259
238
|
- test/results/test-table-list.rb
|
260
239
|
- test/results/test-column-list.rb
|
261
|
-
- test/
|
262
|
-
- test/
|
240
|
+
- test/protocol/test-gqtp.rb
|
241
|
+
- test/protocol/test-http.rb
|
263
242
|
has_rdoc:
|
@@ -1,83 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
#
|
3
|
-
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
-
# Copyright (C) 2013 Kouhei Sutou <kou@clear-code.com>
|
5
|
-
#
|
6
|
-
# This library is free software; you can redistribute it and/or
|
7
|
-
# modify it under the terms of the GNU Lesser General Public
|
8
|
-
# License as published by the Free Software Foundation; either
|
9
|
-
# version 2.1 of the License, or (at your option) any later version.
|
10
|
-
#
|
11
|
-
# This library is distributed in the hope that it will be useful,
|
12
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
-
# Lesser General Public License for more details.
|
15
|
-
#
|
16
|
-
# You should have received a copy of the GNU Lesser General Public
|
17
|
-
# License along with this library; if not, write to the Free Software
|
18
|
-
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
19
|
-
|
20
|
-
require "open-uri"
|
21
|
-
|
22
|
-
require "groonga/client/connection/request"
|
23
|
-
require "groonga/client/connection/error"
|
24
|
-
|
25
|
-
module Groonga
|
26
|
-
class Client
|
27
|
-
module Connection
|
28
|
-
class HTTP
|
29
|
-
def initialize(options)
|
30
|
-
@host = options[:host] || "127.0.0.1"
|
31
|
-
@port = options[:port] || 10041
|
32
|
-
end
|
33
|
-
|
34
|
-
def send(command)
|
35
|
-
url = "http://#{@host}:#{@port}#{command.to_uri_format}"
|
36
|
-
thread = Thread.new do
|
37
|
-
begin
|
38
|
-
open(url) do |response|
|
39
|
-
body = response.read
|
40
|
-
yield(body)
|
41
|
-
end
|
42
|
-
rescue OpenURI::HTTPError, Timeout::Error
|
43
|
-
raise Error.new($!)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
ThreadRequest.new(thread)
|
47
|
-
end
|
48
|
-
|
49
|
-
# @return [false] Always returns false because the current
|
50
|
-
# implementation doesn't support keep-alive.
|
51
|
-
def connected?
|
52
|
-
false
|
53
|
-
end
|
54
|
-
|
55
|
-
# Does nothing because the current implementation doesn't
|
56
|
-
# support keep-alive. If the implementation supports
|
57
|
-
# keep-alive, it close the opend connection.
|
58
|
-
#
|
59
|
-
# @overload close
|
60
|
-
# Closes synchronously.
|
61
|
-
#
|
62
|
-
# @return [false] It always returns false because there is always
|
63
|
-
# no connectin.
|
64
|
-
#
|
65
|
-
# @overload close {}
|
66
|
-
# Closes asynchronously.
|
67
|
-
#
|
68
|
-
# @yield [] Calls the block when the opened connection is closed.
|
69
|
-
# @return [#wait] The request object. If you want to wait until
|
70
|
-
# the request is processed. You can send #wait message to the
|
71
|
-
# request.
|
72
|
-
def close(&block)
|
73
|
-
sync = !block_given?
|
74
|
-
if sync
|
75
|
-
false
|
76
|
-
else
|
77
|
-
EmptyRequest.new
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|