okuyama 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
@@ -1,55 +1,150 @@
1
1
  module Okuyama
2
- class Client
2
+ class Client < FastClient
3
+ public
4
+ attr_accessor :debug, :to_i_flag, :parse_flag
5
+
3
6
  def initialize(options)
4
- @host = options[:host] || 'localhost'
5
- @port = options[:port] || 8888
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
12
  end
7
13
 
8
- def socket
9
- if @socket.nil? then
10
- @socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
11
- sockaddr = Socket.sockaddr_in(@port, @host)
12
- @socket.connect(sockaddr)
14
+
15
+ def set_value(key, val, *args)
16
+ tag_list = nil
17
+ options = nil
18
+
19
+ argc = args.length
20
+ if argc == 1 then
21
+ arg = args[0]
22
+ if arg.is_a? Array then
23
+ tag_list = arg
24
+ elsif arg.is_a? Hash then
25
+ options = arg
26
+ tag_list = options[:tags]
27
+ else
28
+ tag_list = [arg.to_s]
29
+ end
30
+ elsif 1 < argc then
31
+ tag_list = args
13
32
  end
14
- return @socket
33
+
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})"
36
+
37
+ @protocol.set_value(self.socket, key, val, tag_list)
38
+ return self.recvs
15
39
  end
16
40
 
17
- def close
18
- @socket.close if @socket
19
- @socket = nil
41
+ def set_new_value(key, val, *args)
42
+ tag_list = nil
43
+ options = nil
44
+
45
+ argc = args.length
46
+ if argc == 1 then
47
+ arg = args[0]
48
+ if arg.is_a? Array then
49
+ tag_list = arg
50
+ elsif arg.is_a? Hash then
51
+ options = arg
52
+ tag_list = options[:tags]
53
+ else
54
+ tag_list = [arg.to_s]
55
+ end
56
+ elsif 1 < argc then
57
+ tag_list = args
58
+ end
59
+
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})"
62
+
63
+ @protocol.set_new_value(self.socket, key, val, tag_list)
64
+ return self.recvs
20
65
  end
21
66
 
22
- def get_value(key, options=nil)
23
- message = Okuyama::Protocol.get_value(key,options)
24
- result = self.send_msg(message,options)
25
- return result[1]
67
+ def set_value_version_check(key, val, version, *args)
68
+ tag_list = nil
69
+ options = nil
70
+
71
+ argc = args.length
72
+ if argc == 1 then
73
+ arg = args[0]
74
+ if arg.is_a? Array then
75
+ tag_list = arg
76
+ elsif arg.is_a? Hash then
77
+ options = arg
78
+ tag_list = options[:tags]
79
+ else
80
+ tag_list = [arg.to_s]
81
+ end
82
+ elsif 1 < argc then
83
+ tag_list = args
84
+ end
85
+
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})"
88
+
89
+ @protocol.set_value_version_check(self.socket, key, val, version, tag_list)
90
+ return self.recvs
26
91
  end
27
92
 
28
- def send_msg(msg, options=nil)
29
- client = self.socket
30
- Okuyama.logger.debug "send: #{msg}"
31
- self.socket.puts(msg)
32
- result = socket.gets
33
- result.chomp!
34
- Okuyama.logger.debug "recv: #{result}"
35
- ret = self.parse_result(result,options)
93
+ def get_tag_keys(tag, *args, &block)
94
+ flag = 'false'
95
+ options = nil
96
+ argc = args.length
97
+ if argc == 1 && args[0].is_a?(Hash) then
98
+ flag = options[:flag]
99
+ elsif 0 < argc then
100
+ flag = args[0]
101
+ end
102
+ @protocol.get_tag_keys(self.socket, tag, flag)
103
+ return self.recvs
36
104
  end
37
-
38
- def set_value(key, val, options=nil)
39
- tag_list = options[:tags] if options
40
- message = Okuyama::Protocol.set_value(key, tag_list, val, options)
41
- result = self.send_msg(message)
42
- return result
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
43
130
  end
44
131
 
45
- def parse_result(result,options=nil)
46
- record = result.split(/,/)
47
- code = record.shift
48
- case code
49
- when '2'
50
- record[1] = Base64.decode64(record[1])
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}"
51
145
  end
52
- return record
146
+ return result
53
147
  end
148
+
54
149
  end
55
150
  end
@@ -0,0 +1,222 @@
1
+ module Okuyama
2
+ class FastClient
3
+ public
4
+ attr_reader :host, :port, :timeout, :retry_max, :protocol
5
+ attr_accessor :base64_encode_flag
6
+
7
+ def initialize(options)
8
+ @host = options[:host] || 'localhost'
9
+ @port = options[:port] || 8888
10
+ @timeout = options[:timeout] || 10
11
+ @retry_max = options[:retry_max] || 3
12
+ protocol_version = options[:protocol_version] || '1.0.0'
13
+ protocol_version = '1.0.0'
14
+ case protocol_version
15
+ when '1.0.0'
16
+ @protocol = Okuyama::Protocol::Version1.new(:base64_encode_flag=>options[:base64_encode_flag])
17
+ else
18
+ raise OkuyamaError, "protocol version #{protocol_version.inspect} is invalid"
19
+ end
20
+ end
21
+
22
+ def protocol_version
23
+ @protocol.version
24
+ end
25
+
26
+ def close(raise_exception=nil)
27
+ if @socket then
28
+ begin
29
+ @socket.close
30
+ rescue Exception=>e
31
+ raise e if raise_exception
32
+ Okuyama.logger.error "ERROR: #{e.message}"
33
+ end
34
+ end
35
+ @socket = nil
36
+ end
37
+
38
+ def init_count
39
+ @protocol.init_count(self.socket)
40
+ return self.recvs
41
+ end
42
+
43
+ def set_value(key, val, tag_list=nil)
44
+ @protocol.set_value(self.socket, key, val, tag_list)
45
+ return self.recvs
46
+ end
47
+
48
+ def get_value(key)
49
+ @protocol.get_value(self.socket, key)
50
+ return self.recvs
51
+ end
52
+
53
+ def get_tag_keys(tag, flag='false')
54
+ @protocol.get_tag_keys(self.socket, tag, flag)
55
+ return self.recvs
56
+ end
57
+
58
+ def remove_value(key)
59
+ @protocol.remove_value(self.socket, key)
60
+ return self.recvs
61
+ end
62
+
63
+ def set_new_value(key, val, tag_list=nil)
64
+ @protocol.set_new_value(self.socket, key, val, tag_list)
65
+ return self.recvs
66
+ end
67
+
68
+ def get_value_version_check(key)
69
+ @protocol.get_value_version_check(self.socket, key)
70
+ return self.recvs
71
+ end
72
+
73
+ 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
76
+ end
77
+
78
+ def incr_value(key, val)
79
+ @protocol.incr_value(self.socket, key, val.to_s)
80
+ return self.recvs
81
+ end
82
+
83
+ def decr_value(key, val)
84
+ @protocol.decr_value(self.socket, key, val.to_s)
85
+ return self.recvs
86
+ end
87
+
88
+ def get_multi_value(key_list, &block)
89
+ @protocol.get_multi_value(self.socket, key_list)
90
+ return self.recv_lines(&block)
91
+ end
92
+
93
+ def get_tag_values(tag, &block)
94
+ @protocol.get_tag_values(self.socket, tag)
95
+ return self.recv_lines(&block)
96
+ end
97
+
98
+ def remove_tag_from_key(tag, key)
99
+ @protocol.remove_tag_from_key(self.socket, tag, key)
100
+ return self.recvs
101
+ end
102
+
103
+ def set_value_and_create_index(key, val, options=nil)
104
+ if options then
105
+ tag_list = options[:tags]
106
+ group = options[:group]
107
+ min_n = options[:min_n]
108
+ max_n = options[:max_n]
109
+ min_n = min_n.to_s if min_n
110
+ max_n = max_n.to_s if max_n
111
+ end
112
+
113
+ @protocol.set_value_and_create_index(self.socket, key, val, tag_list, group, min_n, max_n)
114
+ return self.recvs
115
+ end
116
+
117
+ def search_value(query_list, options=nil)
118
+ if ! query_list.is_a? Array then
119
+ query_list = [query_list.to_s]
120
+ end
121
+
122
+ if options then
123
+ condition = options[:condition]
124
+ group = options[:group]
125
+ nsize = options[:nsize]
126
+ nsize = nsize.to_s if nsize
127
+ case condition
128
+ when :and
129
+ condition = '1'
130
+ else :or
131
+ condition = '2'
132
+ end
133
+ end
134
+
135
+ @protocol.search_value(self.socket, query_list, condition, group, nsize)
136
+ return self.recvs
137
+ end
138
+
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
+
154
+ def each(&block)
155
+ while line = socket.gets do
156
+ line.chomp!
157
+ if line == "END" then
158
+ break
159
+ else
160
+ yield(line)
161
+ end
162
+ end
163
+ end
164
+
165
+ def readlines
166
+ ret = []
167
+ while line = socket.gets do
168
+ if line == "END" then
169
+ break
170
+ else
171
+ ret.push line
172
+ end
173
+ end
174
+ return ret
175
+ end
176
+
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
+ def socket
192
+ if @socket.nil? then
193
+ retry_count = 0
194
+ begin
195
+ @socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
196
+ sockaddr = Socket.sockaddr_in(@port, @host)
197
+ if @timeout then
198
+ secs = Integer(@timeout)
199
+ usecs = Integer((@timeout - secs) * 1_000_000)
200
+ optval = [secs, usecs].pack("l_2")
201
+ @socket.setsockopt Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, optval
202
+ @socket.setsockopt Socket::SOL_SOCKET, Socket::SO_SNDTIMEO, optval
203
+ end
204
+ @socket.connect(sockaddr)
205
+ rescue Exception => e
206
+ if retry_count < @retry_max then
207
+ Okuyama.logger.error "ERROR: #{e.message}"
208
+ @socket.close if @socket != nil
209
+ @socket = nil
210
+ retry_count += 1
211
+ retry
212
+ else
213
+ raise e
214
+ end
215
+ @socket = nil
216
+ raise e
217
+ end
218
+ end
219
+ return @socket
220
+ end
221
+ end
222
+ end
@@ -0,0 +1,31 @@
1
+ module Okuyama
2
+ module Protocol
3
+ class AbstractProtocol
4
+ def method_missing(method_id, *args, &block)
5
+ method_name = method_id.to_s
6
+ if method_name =~ /^message_of_/ then
7
+ next_method_name = $'
8
+ result = self.capture(:stdout) {
9
+ self.send(next_method_name, $stdout, *args, &block)
10
+ }
11
+ return result
12
+ else
13
+ super
14
+ end
15
+ end
16
+
17
+ protected
18
+ def capture(*streams)
19
+ streams.map! { |stream| stream.to_s }
20
+ begin
21
+ result = StringIO.new
22
+ streams.each { |stream| eval "$#{stream} = result" }
23
+ yield
24
+ ensure
25
+ streams.each { |stream| eval("$#{stream} = #{stream.upcase}") }
26
+ end
27
+ result.string
28
+ end
29
+ end
30
+ end
31
+ end