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 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