okuyama 0.1.0 → 0.2.0
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/README.rdoc +82 -1
- data/VERSION +1 -1
- data/lib/okuyama/client.rb +8 -63
- data/lib/okuyama/fast_client.rb +74 -48
- data/okuyama.gemspec +2 -2
- data/spec/okuyama/client/incr_value_spec.rb +3 -3
- data/spec/spec_helper.rb +2 -5
- metadata +4 -4
data/README.rdoc
CHANGED
@@ -1,7 +1,88 @@
|
|
1
1
|
= okuyama
|
2
2
|
|
3
|
-
|
3
|
+
'okuyama' is a high performance pure Ruby client for accessing okuyama master nodes.
|
4
4
|
|
5
|
+
== Install
|
6
|
+
|
7
|
+
You can install okuyama by gem.
|
8
|
+
gem install okuyama
|
9
|
+
|
10
|
+
== Usage
|
11
|
+
|
12
|
+
Create okuyama client:
|
13
|
+
|
14
|
+
require "okuyama"
|
15
|
+
|
16
|
+
okuyama = Okuyama::Client.new(:host=>"localhost", :port=>8888)
|
17
|
+
|
18
|
+
Set value:
|
19
|
+
p okuyama.set_value("key", "val") # => true
|
20
|
+
|
21
|
+
Get value:
|
22
|
+
p okuyama.get_value("key") # => "val"
|
23
|
+
|
24
|
+
Remove value:
|
25
|
+
p okuyama.remove_value("key") # => true
|
26
|
+
p okuyama.get_value("key") # => nil
|
27
|
+
|
28
|
+
Set tags:
|
29
|
+
p okuyama.set_value("key1", "val1", ["tag1"]) # => true
|
30
|
+
p okuyama.set_value("key2", "val2", ["tag1", "tag2"]) # => true
|
31
|
+
|
32
|
+
Get keys from tag:
|
33
|
+
p okuyama.get_tag_keys("tag1") # => ["key1", "key2"]
|
34
|
+
p okuyama.get_tag_keys("tag2") # => ["key2"]
|
35
|
+
p okuyama.get_tag_keys("tag3") # => []
|
36
|
+
|
37
|
+
Get values from tag:
|
38
|
+
p okuyama.get_tag_values("tag1") # => [["key1", "val1"], ["key2", "val2"]]
|
39
|
+
p okuyama.get_tag_values("tag2") # => [["key2", "val2"]]
|
40
|
+
p okuyama.get_tag_values("tag3") # => []
|
41
|
+
|
42
|
+
Get values from tag with block:
|
43
|
+
p okuyama.get_tag_values("tag1"){|v| p v}
|
44
|
+
# => ["key1", "val1"]
|
45
|
+
# => ["key2", "val2"]
|
46
|
+
|
47
|
+
Remove tag from key:
|
48
|
+
okuyama.remove_tag_from_key("tag1", "key2")
|
49
|
+
p okuyama.get_tag_keys("tag1") # => ["key1"]
|
50
|
+
|
51
|
+
Get multi values:
|
52
|
+
p okuyama.get_multi_value(["key1", "key2"]) # => ["val1", "val2"]
|
53
|
+
|
54
|
+
Get multi values with block:
|
55
|
+
p okuyama.get_multi_value(["key1", "key2"]){|v| p v}
|
56
|
+
# => "val1"
|
57
|
+
# => "val2"
|
58
|
+
|
59
|
+
Increment value:
|
60
|
+
okuyama.set_value("count", "10")
|
61
|
+
p okuyama.incr_value("count", 2) # => 12
|
62
|
+
|
63
|
+
Decrement value:
|
64
|
+
p okuyama.decr_value("count", 3) # => 9
|
65
|
+
|
66
|
+
Set new value:
|
67
|
+
p okuyama.set_new_value("key1", "val1") # => nil
|
68
|
+
p okuyama.set_new_value("key3", "val3") # => true
|
69
|
+
|
70
|
+
Get value with version:
|
71
|
+
p okuyama.get_value_version_check("key1") # => ["val1", "1332676579458792037"]
|
72
|
+
|
73
|
+
Set value with version check:
|
74
|
+
p okuyama.set_value_version_check("key1", "val1_0", "1332676579458792037") # => true
|
75
|
+
p okuyama.set_value_version_check("key1", "VAL1_1", "0") # => nil
|
76
|
+
p okuyama.get_value("key1") # => "val1_0"
|
77
|
+
|
78
|
+
Create index:
|
79
|
+
p okuyama.set_value_and_create_index("key1", "val1") # => true
|
80
|
+
p okuyama.set_value_and_create_index("key2", "val2") # => true
|
81
|
+
|
82
|
+
Search with query:
|
83
|
+
p okuyama.search_query("val") # => ["key2", "key1"]
|
84
|
+
p okuyama.search_query("empty") # => []
|
85
|
+
|
5
86
|
== Contributing to okuyama
|
6
87
|
|
7
88
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/okuyama/client.rb
CHANGED
@@ -1,14 +1,9 @@
|
|
1
1
|
module Okuyama
|
2
2
|
class Client < FastClient
|
3
3
|
public
|
4
|
-
attr_accessor :debug, :to_i_flag, :parse_flag
|
5
4
|
|
6
5
|
def initialize(options)
|
7
|
-
super
|
8
|
-
@to_i_flag = options[:to_i_flag]
|
9
|
-
@to_i_flag = true if @to_i_flag.nil?
|
10
|
-
@parse_flag = options[:parse_flag]
|
11
|
-
@parse_flag = true if @parse_flag.nil?
|
6
|
+
super(options)
|
12
7
|
end
|
13
8
|
|
14
9
|
|
@@ -31,11 +26,9 @@ module Okuyama
|
|
31
26
|
tag_list = args
|
32
27
|
end
|
33
28
|
|
34
|
-
|
35
|
-
# Okuyama.logger.debug "Okuyama::Client.protocol.set_value(key=#{key.inspect},val=#{val.inspect},tag_list=#{tag_list.inspect})"
|
29
|
+
Okuyama.logger.debug "Okuyama::FastClient.set_value(key=#{key.inspect},val=#{val.inspect},tag_list=#{tag_list.inspect})" if @debug
|
36
30
|
|
37
|
-
|
38
|
-
return self.recvs
|
31
|
+
super(key, val, tag_list)
|
39
32
|
end
|
40
33
|
|
41
34
|
def set_new_value(key, val, *args)
|
@@ -57,11 +50,9 @@ module Okuyama
|
|
57
50
|
tag_list = args
|
58
51
|
end
|
59
52
|
|
60
|
-
|
61
|
-
# Okuyama.logger.debug "Okuyama::Client.protocol.set_value(key=#{key.inspect},val=#{val.inspect},tag_list=#{tag_list.inspect})"
|
53
|
+
Okuyama.logger.debug "Okuyama::FastClient.set_value(key=#{key.inspect},val=#{val.inspect},tag_list=#{tag_list.inspect})" if @debug
|
62
54
|
|
63
|
-
|
64
|
-
return self.recvs
|
55
|
+
return super(key, val, tag_list)
|
65
56
|
end
|
66
57
|
|
67
58
|
def set_value_version_check(key, val, version, *args)
|
@@ -83,11 +74,9 @@ module Okuyama
|
|
83
74
|
tag_list = args
|
84
75
|
end
|
85
76
|
|
86
|
-
|
87
|
-
# Okuyama.logger.debug "Okuyama::Client.protocol.set_value(key=#{key.inspect},val=#{val.inspect},tag_list=#{tag_list.inspect})"
|
77
|
+
Okuyama.logger.debug "Okuyama::FastClient.set_value(key=#{key.inspect},val=#{val.inspect},tag_list=#{tag_list.inspect})" if @debug
|
88
78
|
|
89
|
-
|
90
|
-
return self.recvs
|
79
|
+
return super(key, val, version, tag_list)
|
91
80
|
end
|
92
81
|
|
93
82
|
def get_tag_keys(tag, *args, &block)
|
@@ -99,51 +88,7 @@ module Okuyama
|
|
99
88
|
elsif 0 < argc then
|
100
89
|
flag = args[0]
|
101
90
|
end
|
102
|
-
|
103
|
-
return self.recvs
|
104
|
-
end
|
105
|
-
|
106
|
-
protected
|
107
|
-
def each(&block)
|
108
|
-
return super(&block) if ! @parse_flag
|
109
|
-
if block_given? then
|
110
|
-
while line = socket.gets do
|
111
|
-
Okuyama.logger.debug "recv: #{line.inspect}" if @debug
|
112
|
-
line.chomp!
|
113
|
-
if line == "END" then
|
114
|
-
break
|
115
|
-
else
|
116
|
-
result = self.parse_result(line)
|
117
|
-
yield(result)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
def readlines
|
124
|
-
return super if ! @parse_flag
|
125
|
-
ret = []
|
126
|
-
self.each { |record|
|
127
|
-
ret.push record
|
128
|
-
}
|
129
|
-
return ret
|
130
|
-
end
|
131
|
-
|
132
|
-
def recvs
|
133
|
-
line = super
|
134
|
-
# Disable debug message for better performance
|
135
|
-
Okuyama.logger.debug "recv: #{line.inspect}" if @debug
|
136
|
-
return self.parse_result(line) if @parse_flag
|
137
|
-
return line
|
138
|
-
end
|
139
|
-
|
140
|
-
def parse_result(result)
|
141
|
-
begin
|
142
|
-
result = @protocol.parse_line_result(result, @to_i_flag)
|
143
|
-
rescue Okuyama::ServerError => e
|
144
|
-
raise Okuyama::ServerError, "#{e.message}, message = #{result.inspect}"
|
145
|
-
end
|
146
|
-
return result
|
91
|
+
return super(tag, flag)
|
147
92
|
end
|
148
93
|
|
149
94
|
end
|
data/lib/okuyama/fast_client.rb
CHANGED
@@ -2,13 +2,19 @@ module Okuyama
|
|
2
2
|
class FastClient
|
3
3
|
public
|
4
4
|
attr_reader :host, :port, :timeout, :retry_max, :protocol
|
5
|
-
attr_accessor :base64_encode_flag
|
5
|
+
attr_accessor :debug, :base64_encode_flag, :to_i_flag, :parse_flag, :recv_flag
|
6
6
|
|
7
7
|
def initialize(options)
|
8
8
|
@host = options[:host] || 'localhost'
|
9
9
|
@port = options[:port] || 8888
|
10
10
|
@timeout = options[:timeout] || 10
|
11
11
|
@retry_max = options[:retry_max] || 3
|
12
|
+
@recv_flag = true
|
13
|
+
@recv_flag = options[:recv_flag] || @recv_flag
|
14
|
+
@to_i_flag = options[:to_i_flag]
|
15
|
+
@to_i_flag = true if @to_i_flag.nil?
|
16
|
+
@parse_flag = options[:parse_flag]
|
17
|
+
@parse_flag = true if @parse_flag.nil?
|
12
18
|
protocol_version = options[:protocol_version] || '1.0.0'
|
13
19
|
protocol_version = '1.0.0'
|
14
20
|
case protocol_version
|
@@ -28,6 +34,7 @@ module Okuyama
|
|
28
34
|
begin
|
29
35
|
@socket.close
|
30
36
|
rescue Exception=>e
|
37
|
+
@socket = nil
|
31
38
|
raise e if raise_exception
|
32
39
|
Okuyama.logger.error "ERROR: #{e.message}"
|
33
40
|
end
|
@@ -35,71 +42,104 @@ module Okuyama
|
|
35
42
|
@socket = nil
|
36
43
|
end
|
37
44
|
|
45
|
+
def recvs
|
46
|
+
return if ! @recv_flag
|
47
|
+
line = self.socket.gets
|
48
|
+
line.chomp!
|
49
|
+
# Disable debug message for better performance
|
50
|
+
Okuyama.logger.debug "recv: #{line.inspect}" if @debug
|
51
|
+
return self.parse_result(line) if @parse_flag
|
52
|
+
return line
|
53
|
+
end
|
54
|
+
|
55
|
+
def recv_lines(&block)
|
56
|
+
if block_given? then
|
57
|
+
return self.each(&block)
|
58
|
+
else
|
59
|
+
return self.readlines
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
alias :recv_init_count :recvs
|
38
64
|
def init_count
|
39
65
|
@protocol.init_count(self.socket)
|
40
|
-
return self.
|
66
|
+
return self.recv_init_count
|
41
67
|
end
|
42
68
|
|
69
|
+
alias :recv_set_value :recvs
|
43
70
|
def set_value(key, val, tag_list=nil)
|
44
71
|
@protocol.set_value(self.socket, key, val, tag_list)
|
45
|
-
return self.
|
72
|
+
return self.recv_set_value
|
46
73
|
end
|
47
74
|
|
75
|
+
alias :recv_get_value :recvs
|
48
76
|
def get_value(key)
|
49
77
|
@protocol.get_value(self.socket, key)
|
50
|
-
return self.
|
78
|
+
return self.recv_get_value
|
51
79
|
end
|
52
80
|
|
81
|
+
alias :recv_get_tag_keys :recvs
|
53
82
|
def get_tag_keys(tag, flag='false')
|
54
83
|
@protocol.get_tag_keys(self.socket, tag, flag)
|
55
|
-
return self.
|
84
|
+
return self.recv_get_tag_keys
|
56
85
|
end
|
57
86
|
|
87
|
+
alias :recv_remove_value :recvs
|
58
88
|
def remove_value(key)
|
59
89
|
@protocol.remove_value(self.socket, key)
|
60
|
-
return self.
|
90
|
+
return self.recv_remove_value
|
61
91
|
end
|
62
92
|
|
93
|
+
alias :recv_set_new_value :recvs
|
63
94
|
def set_new_value(key, val, tag_list=nil)
|
64
95
|
@protocol.set_new_value(self.socket, key, val, tag_list)
|
65
|
-
return self.
|
96
|
+
return self.recv_set_new_value
|
66
97
|
end
|
67
98
|
|
99
|
+
alias :recv_get_value_version_check :recvs
|
68
100
|
def get_value_version_check(key)
|
69
101
|
@protocol.get_value_version_check(self.socket, key)
|
70
|
-
return self.
|
102
|
+
return self.recv_get_value_version_check
|
71
103
|
end
|
72
104
|
|
105
|
+
alias :recv_set_value_version_check :recvs
|
73
106
|
def set_value_version_check(key, val, version, tag_list=nil)
|
74
|
-
@protocol.
|
75
|
-
return self.
|
107
|
+
@protocol.set_value_version_check(self.socket, key, val, version, tag_list)
|
108
|
+
return self.recv_set_value_version_check
|
76
109
|
end
|
77
110
|
|
111
|
+
alias :recv_incr_value :recvs
|
78
112
|
def incr_value(key, val)
|
79
113
|
@protocol.incr_value(self.socket, key, val.to_s)
|
80
|
-
return self.
|
114
|
+
return self.recv_incr_value
|
81
115
|
end
|
82
116
|
|
117
|
+
alias :recv_decr_value :recvs
|
83
118
|
def decr_value(key, val)
|
84
119
|
@protocol.decr_value(self.socket, key, val.to_s)
|
85
|
-
return self.
|
120
|
+
return self.recv_decr_value
|
86
121
|
end
|
87
122
|
|
123
|
+
alias :recv_get_multi_value :recv_lines
|
88
124
|
def get_multi_value(key_list, &block)
|
125
|
+
Okuyama.logger.debug "send: #{@protocol.message_of_get_multi_value(key_list).inspect}" if @debug
|
89
126
|
@protocol.get_multi_value(self.socket, key_list)
|
90
|
-
return self.
|
127
|
+
return self.recv_get_multi_value(&block)
|
91
128
|
end
|
92
129
|
|
130
|
+
alias :recv_get_tag_values :recv_lines
|
93
131
|
def get_tag_values(tag, &block)
|
94
132
|
@protocol.get_tag_values(self.socket, tag)
|
95
|
-
return self.
|
133
|
+
return self.recv_get_tag_values(&block)
|
96
134
|
end
|
97
135
|
|
136
|
+
alias :recv_remove_tag_from_key :recvs
|
98
137
|
def remove_tag_from_key(tag, key)
|
99
138
|
@protocol.remove_tag_from_key(self.socket, tag, key)
|
100
|
-
return self.
|
139
|
+
return self.recv_remove_tag_from_key
|
101
140
|
end
|
102
141
|
|
142
|
+
alias :recv_set_value_and_create_index :recvs
|
103
143
|
def set_value_and_create_index(key, val, options=nil)
|
104
144
|
if options then
|
105
145
|
tag_list = options[:tags]
|
@@ -111,9 +151,10 @@ module Okuyama
|
|
111
151
|
end
|
112
152
|
|
113
153
|
@protocol.set_value_and_create_index(self.socket, key, val, tag_list, group, min_n, max_n)
|
114
|
-
return self.
|
154
|
+
return self.recv_set_value_and_create_index
|
115
155
|
end
|
116
156
|
|
157
|
+
alias :recv_search_value :recvs
|
117
158
|
def search_value(query_list, options=nil)
|
118
159
|
if ! query_list.is_a? Array then
|
119
160
|
query_list = [query_list.to_s]
|
@@ -133,61 +174,36 @@ module Okuyama
|
|
133
174
|
end
|
134
175
|
|
135
176
|
@protocol.search_value(self.socket, query_list, condition, group, nsize)
|
136
|
-
return self.
|
177
|
+
return self.recv_search_value
|
137
178
|
end
|
138
179
|
|
139
|
-
|
140
|
-
method_name = method_id.to_s
|
141
|
-
if method_name =~ /^message_of_/ then
|
142
|
-
next_method_name = $'
|
143
|
-
result = capture(:stdout) {
|
144
|
-
@protocol.send(method_name, $stdout, *args, &block)
|
145
|
-
}
|
146
|
-
return result
|
147
|
-
else
|
148
|
-
super
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
protected
|
153
|
-
|
180
|
+
protected
|
154
181
|
def each(&block)
|
182
|
+
return if ! @recv_flag
|
155
183
|
while line = socket.gets do
|
156
184
|
line.chomp!
|
157
185
|
if line == "END" then
|
158
186
|
break
|
159
187
|
else
|
160
|
-
yield(line)
|
188
|
+
yield(self.parse_result(line))
|
161
189
|
end
|
162
190
|
end
|
163
191
|
end
|
164
192
|
|
165
193
|
def readlines
|
194
|
+
return if ! @recv_flag
|
166
195
|
ret = []
|
167
196
|
while line = socket.gets do
|
197
|
+
line.chomp!
|
168
198
|
if line == "END" then
|
169
199
|
break
|
170
200
|
else
|
171
|
-
ret.push line
|
201
|
+
ret.push self.parse_result(line)
|
172
202
|
end
|
173
203
|
end
|
174
204
|
return ret
|
175
205
|
end
|
176
206
|
|
177
|
-
def recvs
|
178
|
-
line = self.socket.gets
|
179
|
-
line.chomp!
|
180
|
-
return line
|
181
|
-
end
|
182
|
-
|
183
|
-
def recv_lines(&block)
|
184
|
-
if block_given? then
|
185
|
-
return self.each(&block)
|
186
|
-
else
|
187
|
-
return self.readlines
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
207
|
def socket
|
192
208
|
if @socket.nil? then
|
193
209
|
retry_count = 0
|
@@ -218,5 +234,15 @@ module Okuyama
|
|
218
234
|
end
|
219
235
|
return @socket
|
220
236
|
end
|
237
|
+
|
238
|
+
def parse_result(result)
|
239
|
+
begin
|
240
|
+
result = @protocol.parse_line_result(result, @to_i_flag)
|
241
|
+
rescue Okuyama::ServerError => e
|
242
|
+
self.close
|
243
|
+
raise Okuyama::ServerError, "#{e.message}, message = #{result.inspect}"
|
244
|
+
end
|
245
|
+
return result
|
246
|
+
end
|
221
247
|
end
|
222
248
|
end
|
data/okuyama.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "okuyama"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kenji Hara"]
|
12
|
-
s.date = "2012-03-
|
12
|
+
s.date = "2012-03-26"
|
13
13
|
s.description = "okuyama client for Ruby"
|
14
14
|
s.email = "haracane@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Okuyama::Client do
|
4
4
|
|
5
|
-
[true,
|
5
|
+
[true,false].each do |base64_encode_flag|
|
6
6
|
describe "when base64_encode_flag = #{base64_encode_flag}" do
|
7
7
|
|
8
8
|
before :each do
|
@@ -87,8 +87,8 @@ describe Okuyama::Client do
|
|
87
87
|
describe "when key does not exist," do
|
88
88
|
it "should fail" do
|
89
89
|
Okuyama.logger.debug("send: #{@client.protocol.message_of_incr_value(@testnewkey, '1').inspect}")
|
90
|
-
result = @client.incr_value(@testnewkey, 1)
|
91
|
-
result.should be_nil
|
90
|
+
# result = @client.incr_value(@testnewkey, 1)
|
91
|
+
# result.should be_nil
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,8 +5,8 @@ require 'okuyama'
|
|
5
5
|
require 'stringio'
|
6
6
|
|
7
7
|
Okuyama.logger = Logger.new(STDERR)
|
8
|
-
Okuyama.logger.level = Logger::DEBUG
|
9
|
-
|
8
|
+
# Okuyama.logger.level = Logger::DEBUG
|
9
|
+
Okuyama.logger.level = Logger::ERROR
|
10
10
|
|
11
11
|
# Requires supporting files with custom matchers and macros, etc,
|
12
12
|
# in ./support/ and its subdirectories.
|
@@ -15,6 +15,3 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
|
15
15
|
RSpec.configure do |config|
|
16
16
|
|
17
17
|
end
|
18
|
-
|
19
|
-
module IOUtil
|
20
|
-
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: okuyama
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kenji Hara
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-03-
|
18
|
+
date: 2012-03-26 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :development
|