groonga-client 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.yardopts +4 -0
- data/Gemfile +21 -0
- data/README.md +66 -0
- data/Rakefile +44 -0
- data/doc/text/news.md +5 -0
- data/groonga-client.gemspec +58 -0
- data/lib/groonga/client.rb +165 -0
- data/lib/groonga/client/command.rb +49 -0
- data/lib/groonga/client/protocol/gqtp.rb +93 -0
- data/lib/groonga/client/protocol/http.rb +54 -0
- data/lib/groonga/client/response.rb +36 -0
- data/lib/groonga/client/response/base.rb +114 -0
- data/lib/groonga/client/response/cache_limit.rb +30 -0
- data/lib/groonga/client/response/check.rb +29 -0
- data/lib/groonga/client/response/clearlock.rb +30 -0
- data/lib/groonga/client/response/column_create.rb +30 -0
- data/lib/groonga/client/response/column_list.rb +56 -0
- data/lib/groonga/client/response/column_remove.rb +30 -0
- data/lib/groonga/client/response/column_rename.rb +30 -0
- data/lib/groonga/client/response/defrag.rb +30 -0
- data/lib/groonga/client/response/delete.rb +30 -0
- data/lib/groonga/client/response/dump.rb +30 -0
- data/lib/groonga/client/response/load.rb +30 -0
- data/lib/groonga/client/response/log_level.rb +30 -0
- data/lib/groonga/client/response/log_put.rb +30 -0
- data/lib/groonga/client/response/log_reopen.rb +30 -0
- data/lib/groonga/client/response/quit.rb +30 -0
- data/lib/groonga/client/response/register.rb +30 -0
- data/lib/groonga/client/response/status.rb +29 -0
- data/lib/groonga/client/response/table_list.rb +57 -0
- data/lib/groonga/client/version.rb +5 -0
- data/test/run-test.rb +44 -0
- data/test/test-client.rb +300 -0
- metadata +201 -0
@@ -0,0 +1,54 @@
|
|
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
|
+
module Groonga
|
23
|
+
class Client
|
24
|
+
module Protocol
|
25
|
+
class Request
|
26
|
+
def initialize(thread)
|
27
|
+
@thread = thread
|
28
|
+
end
|
29
|
+
|
30
|
+
def wait
|
31
|
+
@thread.join
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class HTTP
|
36
|
+
def initialize(options)
|
37
|
+
@host = options[:host] || "127.0.0.1"
|
38
|
+
@port = options[:port] || 10041
|
39
|
+
end
|
40
|
+
|
41
|
+
def send(command)
|
42
|
+
url = "http://#{@host}:#{@port}#{command.to_uri_format}"
|
43
|
+
thread = Thread.new do
|
44
|
+
open(url) do |response|
|
45
|
+
body = response.read
|
46
|
+
yield(body)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
Request.new(thread)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
require "groonga/client/response/cache_limit"
|
20
|
+
require "groonga/client/response/check"
|
21
|
+
require "groonga/client/response/clearlock"
|
22
|
+
require "groonga/client/response/column_create"
|
23
|
+
require "groonga/client/response/column_list"
|
24
|
+
require "groonga/client/response/column_remove"
|
25
|
+
require "groonga/client/response/column_rename"
|
26
|
+
require "groonga/client/response/defrag"
|
27
|
+
require "groonga/client/response/delete"
|
28
|
+
require "groonga/client/response/dump"
|
29
|
+
require "groonga/client/response/load"
|
30
|
+
require "groonga/client/response/log_level"
|
31
|
+
require "groonga/client/response/log_put"
|
32
|
+
require "groonga/client/response/log_reopen"
|
33
|
+
require "groonga/client/response/quit"
|
34
|
+
require "groonga/client/response/register"
|
35
|
+
require "groonga/client/response/status"
|
36
|
+
require "groonga/client/response/table_list"
|
@@ -0,0 +1,114 @@
|
|
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 "rexml/document"
|
21
|
+
|
22
|
+
require "json"
|
23
|
+
|
24
|
+
module Groonga
|
25
|
+
class Client
|
26
|
+
module Response
|
27
|
+
class << self
|
28
|
+
@@registered_commands = {}
|
29
|
+
def register(name, klass)
|
30
|
+
@@registered_commands[name] = klass
|
31
|
+
end
|
32
|
+
|
33
|
+
def find(name)
|
34
|
+
@@registered_commands[name] || Base
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Base
|
39
|
+
class << self
|
40
|
+
def parse(raw_response, type)
|
41
|
+
case type
|
42
|
+
when :json
|
43
|
+
header, body = JSON.parse(raw_response)
|
44
|
+
when :xml
|
45
|
+
header, body = parse_xml(raw_response)
|
46
|
+
else
|
47
|
+
header = nil
|
48
|
+
body = raw_response
|
49
|
+
end
|
50
|
+
response = new(header, body)
|
51
|
+
response.raw = raw_response
|
52
|
+
response
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def parse_xml(response)
|
57
|
+
# FIXME: Use more fast XML parser
|
58
|
+
# Extract as a class
|
59
|
+
document = REXML::Document.new(response)
|
60
|
+
root_element = document.root
|
61
|
+
if root_element.name == "RESULT"
|
62
|
+
result_element = root_element
|
63
|
+
header = parse_xml_header(result_element)
|
64
|
+
body = parse_xml_body(result_element.elements[1])
|
65
|
+
else
|
66
|
+
header = nil
|
67
|
+
body = parse_xml_body(root_element)
|
68
|
+
end
|
69
|
+
[header, body]
|
70
|
+
end
|
71
|
+
|
72
|
+
def parse_xml_header(result_element)
|
73
|
+
attributes = result_element.attributes
|
74
|
+
code = Integer(attributes["CODE"])
|
75
|
+
up = Float(attributes["UP"])
|
76
|
+
elapsed = Float(attributes["ELAPSED"])
|
77
|
+
[code, up, elapsed]
|
78
|
+
end
|
79
|
+
|
80
|
+
def parse_xml_body(body_element)
|
81
|
+
xml_to_ruby(body_element)
|
82
|
+
end
|
83
|
+
|
84
|
+
def xml_to_ruby(element)
|
85
|
+
elements = element.elements
|
86
|
+
if elements.empty?
|
87
|
+
case element.name
|
88
|
+
when "NULL"
|
89
|
+
nil
|
90
|
+
when "INT"
|
91
|
+
Integer(element.text)
|
92
|
+
else
|
93
|
+
element.text
|
94
|
+
end
|
95
|
+
else
|
96
|
+
elements.collect do |child|
|
97
|
+
xml_to_ruby(child)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
attr_accessor :header, :body
|
104
|
+
attr_accessor :raw
|
105
|
+
|
106
|
+
def initialize(header, body)
|
107
|
+
@header = header
|
108
|
+
@body = body
|
109
|
+
@raw = nil
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
require "groonga/client/response/base"
|
20
|
+
|
21
|
+
module Groonga
|
22
|
+
class Client
|
23
|
+
module Response
|
24
|
+
class CacheLimit < Base
|
25
|
+
Response.register("cache_limit", self)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
require "groonga/client/response/base"
|
20
|
+
|
21
|
+
module Groonga
|
22
|
+
class Client
|
23
|
+
module Response
|
24
|
+
class Check < Base
|
25
|
+
Response.register("check", self)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
require "groonga/client/response/base"
|
20
|
+
|
21
|
+
module Groonga
|
22
|
+
class Client
|
23
|
+
module Response
|
24
|
+
class ClearLock < Base
|
25
|
+
Response.register("clearlock", self)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
require "groonga/client/response/base"
|
20
|
+
|
21
|
+
module Groonga
|
22
|
+
class Client
|
23
|
+
module Response
|
24
|
+
class ColumnCreate < Base
|
25
|
+
Response.register("column_create", self)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,56 @@
|
|
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/response/base"
|
21
|
+
|
22
|
+
module Groonga
|
23
|
+
class Client
|
24
|
+
module Response
|
25
|
+
class ColumnList < Base
|
26
|
+
Response.register("column_list", self)
|
27
|
+
|
28
|
+
def initialize(header, body)
|
29
|
+
super(header, parse_body(body))
|
30
|
+
end
|
31
|
+
|
32
|
+
def parse_body(body)
|
33
|
+
properties = body.first
|
34
|
+
infos = body[1..-1]
|
35
|
+
infos.collect do |info|
|
36
|
+
column = Column.new
|
37
|
+
properties.each_with_index do |(name, _), i|
|
38
|
+
column.send("#{name}=", info[i])
|
39
|
+
end
|
40
|
+
column
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Column < Struct.new(:id,
|
45
|
+
:name,
|
46
|
+
:path,
|
47
|
+
:type,
|
48
|
+
:flags,
|
49
|
+
:domain,
|
50
|
+
:range,
|
51
|
+
:source)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
require "groonga/client/response/base"
|
20
|
+
|
21
|
+
module Groonga
|
22
|
+
class Client
|
23
|
+
module Response
|
24
|
+
class ColumnRemove < Base
|
25
|
+
Response.register("column_remove", self)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
|
4
|
+
#
|
5
|
+
# This library is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
7
|
+
# License as published by the Free Software Foundation; either
|
8
|
+
# version 2.1 of the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
|
+
|
19
|
+
require "groonga/client/response/base"
|
20
|
+
|
21
|
+
module Groonga
|
22
|
+
class Client
|
23
|
+
module Response
|
24
|
+
class ColumnRename < Base
|
25
|
+
Response.register("column_rename", self)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|