riakpb 0.1.3 → 0.1.4
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 +32 -0
- data/lib/riak/bucket.rb +71 -17
- data/lib/riak/client/rpc.rb +11 -5
- data/lib/riak/client.rb +66 -6
- data/lib/riak/client_pb.rb +1 -1
- data/lib/riak/key.rb +2 -2
- data/lib/riak/locale/en.yml +2 -1
- data/lib/riak/riak_content.rb +3 -2
- data/lib/riak.rb +1 -1
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -88,6 +88,38 @@ This is a work in progress and I am current improving the rspec and the document
|
|
88
88
|
=> #<#Riak::RiakContent value={"Date"=>Mon, 12 Apr 2010, "Open"=>"567.35", "High"=>"574.00", "Low"=>"566.22", "Close"=>"572.73", "Volume"=>"2352400", "Adj Close"=>"572.73"}, content_type="application/json", vtag="264RmLHrCK89zvhtq4n6Fj", links=[], last_mod=1276389859, last_mod_usecs=810556, usermeta={}>
|
89
89
|
>>
|
90
90
|
|
91
|
+
=== Junkshot: (Siblings)
|
92
|
+
|
93
|
+
>> client = Riak::Client.new
|
94
|
+
=> #<Riak::Client:0x00000100d2b998 @host="127.0.0.1", @port=8087, @w=nil, @dw=nil, @buckets=[], @bucket_cache={}>
|
95
|
+
>> bucket = client["goog2"]
|
96
|
+
=> #<Riak::Bucket name=goog2, props={n_val=>3, allow_mult=false}>
|
97
|
+
>> bucket.allow_mult = true
|
98
|
+
=> true
|
99
|
+
>> client.junkshot "goog2", "2010-04-12", {:links => {"tomorrow" => ["goog2", "2010-04-13"]}}
|
100
|
+
=> content {
|
101
|
+
value: ""
|
102
|
+
vtag: "3jfZii80dgtSPYbZ6CL1PU"
|
103
|
+
links {
|
104
|
+
bucket: "goog2"
|
105
|
+
key: "2010-04-13"
|
106
|
+
tag: "tomorrow"
|
107
|
+
}
|
108
|
+
last_mod: 1276715503
|
109
|
+
last_mod_usecs: 980712
|
110
|
+
}
|
111
|
+
content {
|
112
|
+
value: "{\"Date\":\"2010-04-12\",\"Open\":\"567.35\",\"High\":\"574.00\",\"Low\":\"566.22\",\"Close\":\"572.73\",\"Volume\":\"2352400\",\"Adj Close\":\"572.73\"}"
|
113
|
+
content_type: "application/json"
|
114
|
+
vtag: "2UplDRmlJaxS1rhn0GNgqN"
|
115
|
+
last_mod: 1276651742
|
116
|
+
last_mod_usecs: 417836
|
117
|
+
}
|
118
|
+
vclock: "k\xCEa``\xE0\xCA`\xCA\x05R,\xCC_s\xBEd0%2\xE5\xB12<^\xDAq\x94\x0F&|`\xF6n\xA00#P\xF8\xDE\x92\x1E\x980[s\x12S\x1F\xCBU\xA8\xC4\xA4\xC9\xBDp\xF5\xEC<\x8B\x0F`\n\x03\xD5\xB3\xE9x\x9C\x85Jh\xCE@\xA8g\xCE\xB00\xC3\x14\x06\xAAg\xBF\xB9\xE5\x14TBq\x0EB=\xD3u\xE7r,\xC2\x8C\xAB\xDC\xEFA\x85\xDF\xCFE6\x865.'\bY\"\v\x00"
|
119
|
+
|
120
|
+
>>
|
121
|
+
|
122
|
+
|
91
123
|
=== MapReduce:
|
92
124
|
|
93
125
|
I'm working on ways to simplify M/R requests. It works the same as in ripple. Largely because it's ripped off from it, with very few changes (so far).
|
data/lib/riak/bucket.rb
CHANGED
@@ -29,11 +29,11 @@ module Riak
|
|
29
29
|
raise ArgumentError, t("client_type", :client => client.inspect) unless client.is_a?(Client)
|
30
30
|
raise ArgumentError, t("string_type", :string => name.inspect) unless name.is_a?(String)
|
31
31
|
|
32
|
-
@client
|
33
|
-
@name
|
34
|
-
|
35
|
-
|
36
|
-
@key_cache
|
32
|
+
@client = client
|
33
|
+
@name = name
|
34
|
+
self.n_val ||= options[:n_val]
|
35
|
+
self.allow_mult ||= options[:allow_mult]
|
36
|
+
@key_cache = Hash.new{|k,v| k[v] = Riak::Key.new(self, v)}
|
37
37
|
end
|
38
38
|
|
39
39
|
# Load information for the bucket from a response given by the {Riak::Client::HTTPBackend}.
|
@@ -42,12 +42,13 @@ module Riak
|
|
42
42
|
# @return [Bucket] self
|
43
43
|
# @see Client#bucket
|
44
44
|
def load(response)
|
45
|
-
|
45
|
+
if response.is_a?(Riak::RpbGetBucketResp)
|
46
|
+
@n_val = response.props.n_val
|
47
|
+
@allow_mult = response.props.allow_mult
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
return(self)
|
49
|
+
return(self)
|
50
|
+
end
|
51
|
+
raise ArgumentError, t("response_type")
|
51
52
|
end
|
52
53
|
|
53
54
|
# Accesses or retrieves a list of keys in this bucket. Needs to have expiration / cacheing, though not now.
|
@@ -86,7 +87,7 @@ module Riak
|
|
86
87
|
# @return [Riak::Key] the object
|
87
88
|
def key!(key, r=nil)
|
88
89
|
raise ArgumentError, t("string_invalid", :string => key) unless key.is_a?(String)
|
89
|
-
raise ArgumentError, t("fixnum_invalid", :num => r) unless r.is_a?(Fixnum)
|
90
|
+
raise ArgumentError, t("fixnum_invalid", :num => r) unless r.is_a?(Fixnum) or r.nil?
|
90
91
|
|
91
92
|
response = @client.get_request @name, key, r
|
92
93
|
|
@@ -113,6 +114,22 @@ module Riak
|
|
113
114
|
@client.put_request(options)
|
114
115
|
end
|
115
116
|
|
117
|
+
def junkshot(key, params)
|
118
|
+
raise RuntimeError.new t('siblings_disallowed') unless @allow_mult == true
|
119
|
+
|
120
|
+
params[:links] = parse_links(params[:links]) if params.has_key?(:links)
|
121
|
+
params[:usermeta] = parse_links(params[:usermeta]) if params.has_key?(:usermeta)
|
122
|
+
|
123
|
+
options = params.slice :return_body, :w, :dw
|
124
|
+
content = params.slice :value, :content_type, :charset, :content_encoding, :links, :usermeta
|
125
|
+
|
126
|
+
key = key.name if key.is_a?(Riak::Key)
|
127
|
+
options[:key] = key
|
128
|
+
options[:content] = Riak::RpbContent.new(content)
|
129
|
+
|
130
|
+
self.store(options)
|
131
|
+
end
|
132
|
+
|
116
133
|
# Deletes a key from the bucket
|
117
134
|
# @param [String] key the key to delete
|
118
135
|
# @param [Hash] options quorum options
|
@@ -144,9 +161,15 @@ module Riak
|
|
144
161
|
# Set the allow_mult property. *NOTE* This will result in a PUT request to Riak.
|
145
162
|
# @param [true, false] value whether the bucket should allow siblings
|
146
163
|
def allow_mult=(value)
|
147
|
-
|
148
|
-
|
149
|
-
|
164
|
+
case value
|
165
|
+
when true, false
|
166
|
+
@client.set_bucket(self.name, {:n_val => @n_val, :allow_mult => value})
|
167
|
+
return(@allow_mult = value)
|
168
|
+
when nil, ''
|
169
|
+
return(@allow_mult = nil)
|
170
|
+
else
|
171
|
+
raise ArgumentError, t("boolean_type")
|
172
|
+
end
|
150
173
|
end
|
151
174
|
|
152
175
|
# @return [Fixnum] the N value, or number of replicas for this bucket
|
@@ -158,9 +181,15 @@ module Riak
|
|
158
181
|
# Saving this value after the bucket has objects stored in it may have unpredictable results.
|
159
182
|
# @param [Fixnum] value the number of replicas the bucket should keep of each object
|
160
183
|
def n_val=(value)
|
161
|
-
|
162
|
-
|
163
|
-
|
184
|
+
case value
|
185
|
+
when Fixnum
|
186
|
+
@client.set_bucket(self.name, {:n_val => value, :allow_mult => @allow_mult})
|
187
|
+
return(@n_val = value)
|
188
|
+
when nil, ''
|
189
|
+
return(@n_val = nil)
|
190
|
+
else
|
191
|
+
raise ArgumentError, t("fixnum_type", :value => value)
|
192
|
+
end
|
164
193
|
end
|
165
194
|
|
166
195
|
# @return [String] a representation suitable for IRB and debugging output
|
@@ -173,5 +202,30 @@ module Riak
|
|
173
202
|
"#<Riak::Bucket name=#{@name}, props={n_val=>#{@n_val}, allow_mult=#{@allow_mult}}, keys=#{keys.inspect}>"
|
174
203
|
end
|
175
204
|
|
205
|
+
private
|
206
|
+
def parse_links(link_params)
|
207
|
+
rpb_links = []
|
208
|
+
|
209
|
+
link_params.each do |tag, links|
|
210
|
+
pb_link = Riak::RpbLink.new
|
211
|
+
pb_link.tag = tag
|
212
|
+
pb_link.bucket = links[0]
|
213
|
+
pb_link.key = links[1]
|
214
|
+
rpb_links << pb_link
|
215
|
+
end
|
216
|
+
return(rpb_links)
|
217
|
+
end # parse_links
|
218
|
+
|
219
|
+
def parse_meta(meta_params)
|
220
|
+
rpb_meta = []
|
221
|
+
|
222
|
+
meta_params.each do |k,v|
|
223
|
+
pb_meta = Riak::RpbPair.new
|
224
|
+
pb_meta.key = k
|
225
|
+
pb_meta.value = v
|
226
|
+
rpb_meta << pb_meta
|
227
|
+
end
|
228
|
+
return(rpb_meta)
|
229
|
+
end
|
176
230
|
end
|
177
231
|
end
|
data/lib/riak/client/rpc.rb
CHANGED
@@ -19,10 +19,12 @@ module Riak
|
|
19
19
|
attr_reader :req_message, :response, :resp_message_codes, :resp_message, :status
|
20
20
|
|
21
21
|
# Establishes a Client ID with the Riak node, for the life of the RPC connection.
|
22
|
-
# @param [Client] the Riak::Client object in which this Rpc instance lives
|
23
|
-
|
22
|
+
# @param [Client] client the Riak::Client object in which this Rpc instance lives
|
23
|
+
# @param [Fixnum] limit the max size of an individual TCPSocket receive call. Need to fix, later.
|
24
|
+
def initialize(client, limit=RECV_LIMIT)
|
24
25
|
@status = false
|
25
26
|
@client = client
|
27
|
+
@limit = limit
|
26
28
|
@client_id = request(Util::MessageCode::GET_CLIENT_ID_REQUEST).client_id
|
27
29
|
@set_client_id = Riak::RpbSetClientIdReq.new(:client_id => @client_id)
|
28
30
|
|
@@ -65,7 +67,7 @@ module Riak
|
|
65
67
|
@set_client_id.serialize_to_string)
|
66
68
|
|
67
69
|
socket.send(@set_c_id_req, 0)
|
68
|
-
set_c_id_resp = socket.recv(
|
70
|
+
set_c_id_resp = socket.recv(@limit)
|
69
71
|
|
70
72
|
resp_code, resp_msg = decode_message(set_c_id_resp)
|
71
73
|
|
@@ -84,10 +86,14 @@ module Riak
|
|
84
86
|
|
85
87
|
with_socket do |socket|
|
86
88
|
begin
|
87
|
-
|
89
|
+
begin
|
90
|
+
@req_message = assemble_request mc, pb_msg.serialize_to_string
|
91
|
+
rescue NoMethodError
|
92
|
+
@req_message = assemble_request mc
|
93
|
+
end
|
88
94
|
|
89
95
|
socket.send(@req_message, 0)
|
90
|
-
self.response = socket.recv(
|
96
|
+
self.response = socket.recv(@limit)
|
91
97
|
|
92
98
|
end while(false == (@response.done rescue true))
|
93
99
|
end # with_socket
|
data/lib/riak/client.rb
CHANGED
@@ -99,17 +99,48 @@ module Riak
|
|
99
99
|
# I need bucket! Bring me bucket! (Retrieves a bucket from Riak. Eating disorder not included.)
|
100
100
|
# @param [String] bucket the bucket to retrieve
|
101
101
|
# @return [Bucket] the requested bucket
|
102
|
-
def
|
102
|
+
def bucket(bucket)
|
103
|
+
return(@bucket_cache[bucket]) if @bucket_cache.has_key?(bucket)
|
104
|
+
bring_me_bucket!(bucket)
|
105
|
+
end
|
106
|
+
alias :[] :bucket
|
107
|
+
alias :bring_me_bucket :bucket
|
108
|
+
|
109
|
+
# I need bucket! Bring me bucket! (Retrieves a bucket from Riak, even if it's already been retrieved.)
|
110
|
+
# @param [String] bucket the bucket to retrieve
|
111
|
+
# @return [Bucket] the requested bucket
|
112
|
+
def bucket!(bucket)
|
103
113
|
request = Riak::RpbGetBucketReq.new(:bucket => bucket)
|
104
114
|
response = rpc.request(
|
105
115
|
Util::MessageCode::GET_BUCKET_REQUEST,
|
106
116
|
request
|
107
117
|
)
|
108
|
-
|
109
118
|
@bucket_cache[bucket].load(response)
|
110
119
|
end
|
111
|
-
alias :
|
112
|
-
|
120
|
+
alias :bring_me_bucket! :bucket!
|
121
|
+
|
122
|
+
# Set the properties for a given bucket, and then reload it.
|
123
|
+
# @param [String] bucket the bucket name in which props will be set
|
124
|
+
# @param [RpbBucketProps, Hash] props the properties to be set within the given bucket
|
125
|
+
# @return [TrueClass, FalseClass] whether or not the operation was successful
|
126
|
+
def set_bucket(bucket, props)
|
127
|
+
props = Riak::RpbBucketProps.new(props) if props.is_a?(Hash)
|
128
|
+
|
129
|
+
raise TypeError.new t('invalid_props') unless props.is_a?(Riak::RpbBucketProps)
|
130
|
+
|
131
|
+
begin
|
132
|
+
request = Riak::RpbSetBucketReq.new(:bucket => bucket, :props => props)
|
133
|
+
response = rpc.request(
|
134
|
+
Util::MessageCode::SET_BUCKET_REQUEST,
|
135
|
+
request
|
136
|
+
)
|
137
|
+
self.bucket!(bucket)
|
138
|
+
|
139
|
+
return(true)
|
140
|
+
rescue FailedRequest
|
141
|
+
return(false)
|
142
|
+
end
|
143
|
+
end
|
113
144
|
|
114
145
|
# Retrieves a key, using RpbGetReq, from within a given bucket, from Riak.
|
115
146
|
# @param [String] bucket the bucket from which to retrieve the key
|
@@ -144,7 +175,6 @@ module Riak
|
|
144
175
|
options[:return_body] ||= true
|
145
176
|
|
146
177
|
request = Riak::RpbPutReq.new(options)
|
147
|
-
|
148
178
|
response = rpc.request(
|
149
179
|
Util::MessageCode::PUT_REQUEST,
|
150
180
|
request
|
@@ -204,7 +234,6 @@ module Riak
|
|
204
234
|
# @raise [ReturnRespError] if the message response does not correlate with the message requested
|
205
235
|
# @return [Hash] Mapping of the buckets (String) to their keys (Array of Strings)
|
206
236
|
def keys_in(bucket)
|
207
|
-
|
208
237
|
list_keys_request = RpbListKeysReq.new(:bucket => bucket)
|
209
238
|
|
210
239
|
response = rpc.request Util::MessageCode::LIST_KEYS_REQUEST, list_keys_request
|
@@ -217,6 +246,37 @@ module Riak
|
|
217
246
|
# "#<Client >"
|
218
247
|
# end
|
219
248
|
|
249
|
+
# Junkshot lets you throw a lot of data at riak, which will then need to be reconciled later
|
250
|
+
# @overload junkshot(bucket, key, params)
|
251
|
+
# @param [String] bucket the name of the bucket
|
252
|
+
# @param [String] key the name of the key
|
253
|
+
# @param [Hash] params the parameters that are to be updated (Needs fixin')
|
254
|
+
# @overload junkshot(key, params)
|
255
|
+
# @param [Key] key the Key instance to be junkshotted
|
256
|
+
# @param [Hash] params the parameters that are to be updated (Needs fixin')
|
257
|
+
# @return [String, Key] dependent upon whether :return_body is set to true or false
|
258
|
+
def junkshot(*params)
|
259
|
+
params = params.dup.flatten
|
260
|
+
case params.size
|
261
|
+
when 3
|
262
|
+
bucket = params[0]
|
263
|
+
key = params[1]
|
264
|
+
params = params[2]
|
265
|
+
when 2
|
266
|
+
begin
|
267
|
+
key = params[0]
|
268
|
+
bucket = key.bucket
|
269
|
+
key = key.name
|
270
|
+
rescue NoMethodError
|
271
|
+
raise TypeError.new t('invalid_key')
|
272
|
+
end
|
273
|
+
params = params[1]
|
274
|
+
end
|
275
|
+
self.bucket!(bucket).junkshot(key, params)
|
276
|
+
end
|
277
|
+
alias :stuff :junkshot
|
278
|
+
alias :jk :junkshot
|
279
|
+
|
220
280
|
private
|
221
281
|
def b64encode(n)
|
222
282
|
Base64.encode64([n].pack("N")).chomp
|
data/lib/riak/client_pb.rb
CHANGED
@@ -343,7 +343,7 @@ module Riak
|
|
343
343
|
end
|
344
344
|
class RpbContent < ::Protobuf::Message
|
345
345
|
defined_in __FILE__
|
346
|
-
|
346
|
+
optional :bytes, :value, 1
|
347
347
|
optional :bytes, :content_type, 2
|
348
348
|
optional :bytes, :charset, 3
|
349
349
|
optional :bytes, :content_encoding, 4
|
data/lib/riak/key.rb
CHANGED
@@ -46,7 +46,7 @@ module Riak
|
|
46
46
|
|
47
47
|
if response.has_field?(:content)
|
48
48
|
self.content = response.content
|
49
|
-
elsif @contents.
|
49
|
+
elsif @contents.blank?
|
50
50
|
@contents[:new]
|
51
51
|
end
|
52
52
|
|
@@ -79,7 +79,7 @@ module Riak
|
|
79
79
|
# Indicates whether or not the Key is empty
|
80
80
|
# @return [Boolean] true or false, whether or not the vclock/content is empty
|
81
81
|
def empty?
|
82
|
-
return(true) if @vclock.
|
82
|
+
return(true) if @vclock.blank? && @contents.nil?
|
83
83
|
return(false)
|
84
84
|
end
|
85
85
|
|
data/lib/riak/locale/en.yml
CHANGED
@@ -4,7 +4,8 @@ en:
|
|
4
4
|
string_type: "invalid_argument {{string}} is not a String"
|
5
5
|
loading_bucket: "while loading bucket '{{name}}'"
|
6
6
|
invalid_bucket: "the specified bucket is invalid"
|
7
|
-
invalid_key: "the specified key does not exist"
|
7
|
+
invalid_key: "the specified key is invalid or does not exist"
|
8
|
+
siblings_disallowed: "the specified bucket does not allow siblings. Set allow_mult in props to do this."
|
8
9
|
value_empty: "a value must be set in order to serialize into a protocol buffer"
|
9
10
|
failed_request: "Expected message code {{expected}} from Riak but received {{actual}}. {{output}}"
|
10
11
|
decode_error: "Riak reported a message length of {{expected}} but length was {{actual}}. {{output}}"
|
data/lib/riak/riak_content.rb
CHANGED
@@ -138,6 +138,7 @@ module Riak
|
|
138
138
|
end
|
139
139
|
end # tags.each do |tag, link|
|
140
140
|
end
|
141
|
+
alias :link :link_key
|
141
142
|
|
142
143
|
# Set the links to other Key in riak.
|
143
144
|
# @param [RpbGetResp, RpbPutResp] contains the tag/bucket/key of a given link
|
@@ -193,8 +194,8 @@ module Riak
|
|
193
194
|
rpb_content.charset = @charset unless @charset.nil? # || @charset.empty?
|
194
195
|
rpb_content.content_encoding = @content_encoding unless @content_encoding.nil? # || @content_encoding.empty?
|
195
196
|
rpb_content.vtag = @vtag unless @vtag.nil?
|
196
|
-
rpb_content.links = rpb_links unless rpb_links.
|
197
|
-
rpb_content.usermeta = usermeta unless usermeta.
|
197
|
+
rpb_content.links = rpb_links unless rpb_links.nil?
|
198
|
+
rpb_content.usermeta = usermeta unless usermeta.nil?
|
198
199
|
|
199
200
|
return(rpb_content)
|
200
201
|
end
|
data/lib/riak.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 4
|
9
|
+
version: 0.1.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Scott Gonyea
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-06-
|
17
|
+
date: 2010-06-16 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|