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 CHANGED
@@ -1,7 +1,88 @@
1
1
  = okuyama
2
2
 
3
- Description goes here.
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
1
+ 0.2.0
@@ -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
- # Disable debug message for better performance
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
- @protocol.set_value(self.socket, key, val, tag_list)
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
- # Disable debug message for better performance
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
- @protocol.set_new_value(self.socket, key, val, tag_list)
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
- # Disable debug message for better performance
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
- @protocol.set_value_version_check(self.socket, key, val, version, tag_list)
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
- @protocol.get_tag_keys(self.socket, tag, flag)
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
@@ -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.recvs
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.recvs
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.recvs
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.recvs
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.recvs
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.recvs
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.recvs
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.set_value_versin_check(self.socket, key, val, version, tag_list)
75
- return self.recvs
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.recvs
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.recvs
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.recv_lines(&block)
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.recv_lines(&block)
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.recvs
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.recvs
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.recvs
177
+ return self.recv_search_value
137
178
  end
138
179
 
139
- def method_missiong(method_id, *args, &block)
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.1.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-25"
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,true].each do |base64_encode_flag|
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
- # Okuyama.logger.level = Logger::ERROR
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: 27
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.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-25 00:00:00 Z
18
+ date: 2012-03-26 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  type: :development