okuyama 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|