kyototycoon 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Changes.md +5 -0
- data/kyototycoon.gemspec +2 -2
- data/lib/kyototycoon/tsvrpc/skinny.rb +2 -1
- data/lib/kyototycoon/tsvrpc.rb +21 -34
- data/lib/kyototycoon.rb +17 -17
- data/spec/helper.rb +4 -0
- metadata +3 -3
data/Changes.md
CHANGED
data/kyototycoon.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{kyototycoon}
|
8
|
-
s.version = "0.5.
|
8
|
+
s.version = "0.5.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["uu59"]
|
12
|
-
s.date = %q{2011-01-
|
12
|
+
s.date = %q{2011-01-05}
|
13
13
|
s.description = %q{KyotoTycoon client for Ruby}
|
14
14
|
s.email = %q{a@tt25.org}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -40,10 +40,11 @@ class KyotoTycoon
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
body = @sock.read(bodylen)
|
43
|
-
[status.to_i,
|
43
|
+
[status.to_i, body, colenc]
|
44
44
|
end
|
45
45
|
|
46
46
|
def start
|
47
|
+
@sock = nil if @sock && @sock.closed?
|
47
48
|
@sock ||= ::TCPSocket.new(@host, @port)
|
48
49
|
end
|
49
50
|
|
data/lib/kyototycoon/tsvrpc.rb
CHANGED
@@ -3,9 +3,19 @@
|
|
3
3
|
|
4
4
|
class KyotoTycoon
|
5
5
|
module Tsvrpc
|
6
|
-
def self.parse(body)
|
6
|
+
def self.parse(body, colenc)
|
7
|
+
decoder = case colenc
|
8
|
+
when "U"
|
9
|
+
lambda{|body| CGI.unescape(body)}
|
10
|
+
when "B"
|
11
|
+
lambda{|body| Base64.decode64(body)}
|
12
|
+
when nil
|
13
|
+
lambda{|body| body}
|
14
|
+
else
|
15
|
+
raise "Unknown colenc(response) '#{colenc}'"
|
16
|
+
end
|
7
17
|
body.split("\n").inject({}){|r, line|
|
8
|
-
k,v = *line.split("\t", 2).map{|v|
|
18
|
+
k,v = *line.split("\t", 2).map{|v| decoder.call(v)}
|
9
19
|
r[k] = v
|
10
20
|
r
|
11
21
|
}
|
@@ -14,45 +24,22 @@ class KyotoTycoon
|
|
14
24
|
def self.build_query(params, colenc='U')
|
15
25
|
query = ""
|
16
26
|
if params
|
17
|
-
case colenc.to_s.upcase.to_sym
|
27
|
+
encoder = case colenc.to_s.upcase.to_sym
|
18
28
|
when :U
|
19
|
-
|
20
|
-
unless tmp.last.nil?
|
21
|
-
r << tmp.map{|v| CGI.escape(v.to_s)}.join("\t")
|
22
|
-
end
|
23
|
-
r
|
24
|
-
}.join("\r\n")
|
29
|
+
lambda{|body| CGI.escape(body.to_s)}
|
25
30
|
when :B
|
26
|
-
|
27
|
-
unless tmp.last.nil?
|
28
|
-
r << tmp.map{|v| Base64.encode64(v.to_s).rstrip}.join("\t")
|
29
|
-
end
|
30
|
-
r
|
31
|
-
}.join("\r\n")
|
31
|
+
lambda{|body| [body.to_s].pack('m').gsub("\n","")}
|
32
32
|
else
|
33
33
|
raise "Unknown colenc '#{colenc}'"
|
34
34
|
end
|
35
|
+
query = params.inject([]){|r, tmp|
|
36
|
+
unless tmp.last.nil?
|
37
|
+
r << tmp.map{|v| encoder.call(v)}.join("\t")
|
38
|
+
end
|
39
|
+
r
|
40
|
+
}.join("\r\n")
|
35
41
|
end
|
36
42
|
query
|
37
43
|
end
|
38
|
-
|
39
|
-
def self.decode_responce_body(body, colenc)
|
40
|
-
case colenc
|
41
|
-
when "B"
|
42
|
-
body.split("\n").map{|row|
|
43
|
-
row.split("\t").map{|col| Base64.decode64(col)}.join("\t")
|
44
|
-
}.join("\n")
|
45
|
-
when "U"
|
46
|
-
body.split("\n").map{|row|
|
47
|
-
row.split("\t").map{|col|
|
48
|
-
CGI.unescape(col)
|
49
|
-
}.join("\t")
|
50
|
-
}.join("\n")
|
51
|
-
when nil
|
52
|
-
body
|
53
|
-
else
|
54
|
-
raise "Unknown colenc(response) '#{colenc}'"
|
55
|
-
end
|
56
|
-
end
|
57
44
|
end
|
58
45
|
end
|
data/lib/kyototycoon.rb
CHANGED
@@ -13,7 +13,7 @@ require "kyototycoon/tsvrpc/skinny.rb"
|
|
13
13
|
require "kyototycoon/stream.rb"
|
14
14
|
|
15
15
|
class KyotoTycoon
|
16
|
-
VERSION = '0.5.
|
16
|
+
VERSION = '0.5.3'
|
17
17
|
|
18
18
|
attr_accessor :colenc, :connect_timeout, :servers
|
19
19
|
attr_reader :serializer, :logger, :db
|
@@ -67,7 +67,7 @@ class KyotoTycoon
|
|
67
67
|
|
68
68
|
def get(key)
|
69
69
|
res = request('/rpc/get', {:key => key})
|
70
|
-
@serializer.decode(Tsvrpc.parse(res[:body])['value'])
|
70
|
+
@serializer.decode(Tsvrpc.parse(res[:body], res[:colenc])['value'])
|
71
71
|
end
|
72
72
|
alias_method :[], :get
|
73
73
|
|
@@ -78,18 +78,18 @@ class KyotoTycoon
|
|
78
78
|
|
79
79
|
def set(key, value, xt=nil)
|
80
80
|
res = request('/rpc/set', {:key => key, :value => @serializer.encode(value), :xt => xt})
|
81
|
-
Tsvrpc.parse(res[:body])
|
81
|
+
Tsvrpc.parse(res[:body], res[:colenc])
|
82
82
|
end
|
83
83
|
alias_method :[]=, :set
|
84
84
|
|
85
85
|
def add(key, value, xt=nil)
|
86
86
|
res = request('/rpc/add', {:key => key, :value => @serializer.encode(value), :xt => xt})
|
87
|
-
Tsvrpc.parse(res[:body])
|
87
|
+
Tsvrpc.parse(res[:body], res[:colenc])
|
88
88
|
end
|
89
89
|
|
90
90
|
def replace(key, value, xt=nil)
|
91
91
|
res = request('/rpc/replace', {:key => key, :value => @serializer.encode(value), :xt => xt})
|
92
|
-
Tsvrpc.parse(res[:body])
|
92
|
+
Tsvrpc.parse(res[:body], res[:colenc])
|
93
93
|
end
|
94
94
|
|
95
95
|
def append(key, value, xt=nil)
|
@@ -108,7 +108,7 @@ class KyotoTycoon
|
|
108
108
|
|
109
109
|
def increment(key, num=1, xt=nil)
|
110
110
|
res = request('/rpc/increment', {:key => key, :num => num, :xt => xt})
|
111
|
-
Tsvrpc.parse(res[:body])['num'].to_i
|
111
|
+
Tsvrpc.parse(res[:body], res[:colenc])['num'].to_i
|
112
112
|
end
|
113
113
|
alias_method :incr, :increment
|
114
114
|
|
@@ -119,7 +119,7 @@ class KyotoTycoon
|
|
119
119
|
|
120
120
|
def increment_double(key, num, xt=nil)
|
121
121
|
res = request('/rpc/increment_double', {:key => key, :num => num, :xt => xt})
|
122
|
-
Tsvrpc.parse(res[:body])['num'].to_f
|
122
|
+
Tsvrpc.parse(res[:body], res[:colenc])['num'].to_f
|
123
123
|
end
|
124
124
|
|
125
125
|
def set_bulk(records)
|
@@ -129,7 +129,7 @@ class KyotoTycoon
|
|
129
129
|
values["_#{k}"] = @serializer.encode(v)
|
130
130
|
}
|
131
131
|
res = request('/rpc/set_bulk', values)
|
132
|
-
Tsvrpc.parse(res[:body])
|
132
|
+
Tsvrpc.parse(res[:body], res[:colenc])
|
133
133
|
end
|
134
134
|
|
135
135
|
def get_bulk(keys)
|
@@ -139,7 +139,7 @@ class KyotoTycoon
|
|
139
139
|
}
|
140
140
|
res = request('/rpc/get_bulk', params)
|
141
141
|
ret = {}
|
142
|
-
Tsvrpc.parse(res[:body]).each{|k,v|
|
142
|
+
Tsvrpc.parse(res[:body], res[:colenc]).each{|k,v|
|
143
143
|
ret[k] = k.match(/^_/) ? @serializer.decode(v) : v
|
144
144
|
}
|
145
145
|
ret
|
@@ -151,7 +151,7 @@ class KyotoTycoon
|
|
151
151
|
params
|
152
152
|
}
|
153
153
|
res = request('/rpc/remove_bulk', params)
|
154
|
-
Tsvrpc.parse(res[:body])
|
154
|
+
Tsvrpc.parse(res[:body], res[:colenc])
|
155
155
|
end
|
156
156
|
|
157
157
|
def clear
|
@@ -169,23 +169,23 @@ class KyotoTycoon
|
|
169
169
|
|
170
170
|
def echo(value)
|
171
171
|
res = request('/rpc/echo', value)
|
172
|
-
Tsvrpc.parse(res[:body])
|
172
|
+
Tsvrpc.parse(res[:body], res[:colenc])
|
173
173
|
end
|
174
174
|
|
175
175
|
def report
|
176
176
|
res = request('/rpc/report')
|
177
|
-
Tsvrpc.parse(res[:body])
|
177
|
+
Tsvrpc.parse(res[:body], res[:colenc])
|
178
178
|
end
|
179
179
|
|
180
180
|
def status
|
181
181
|
res = request('/rpc/status')
|
182
|
-
Tsvrpc.parse(res[:body])
|
182
|
+
Tsvrpc.parse(res[:body], res[:colenc])
|
183
183
|
end
|
184
184
|
|
185
185
|
def match_prefix(prefix)
|
186
186
|
res = request('/rpc/match_prefix', {:prefix => prefix})
|
187
187
|
keys = []
|
188
|
-
Tsvrpc.parse(res[:body]).each{|k,v|
|
188
|
+
Tsvrpc.parse(res[:body], res[:colenc]).each{|k,v|
|
189
189
|
if k != 'num'
|
190
190
|
keys << k[1, k.length]
|
191
191
|
end
|
@@ -199,7 +199,7 @@ class KyotoTycoon
|
|
199
199
|
end
|
200
200
|
res = request('/rpc/match_regex', {:regex => re})
|
201
201
|
keys = []
|
202
|
-
Tsvrpc.parse(res[:body]).each{|k,v|
|
202
|
+
Tsvrpc.parse(res[:body], res[:colenc]).each{|k,v|
|
203
203
|
if k != 'num'
|
204
204
|
keys << k[1, k.length]
|
205
205
|
end
|
@@ -217,11 +217,11 @@ class KyotoTycoon
|
|
217
217
|
params[:DB] = @db
|
218
218
|
end
|
219
219
|
|
220
|
-
status,body = client.request(path, params, @colenc)
|
220
|
+
status,body,colenc = client.request(path, params, @colenc)
|
221
221
|
if ![200, 450].include?(status.to_i)
|
222
222
|
raise body
|
223
223
|
end
|
224
|
-
res = {:status => status, :body => body}
|
224
|
+
res = {:status => status, :body => body, :colenc => colenc}
|
225
225
|
@logger.info("#{path}: #{res[:status]} with query parameters #{params.inspect}")
|
226
226
|
res
|
227
227
|
end
|
data/spec/helper.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 5
|
8
|
-
-
|
9
|
-
version: 0.5.
|
8
|
+
- 3
|
9
|
+
version: 0.5.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- uu59
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-01-
|
17
|
+
date: 2011-01-05 00:00:00 +09:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|