riakpb 0.1.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/History.txt +4 -0
- data/Manifest.txt +30 -0
- data/README.rdoc +156 -0
- data/Rakefile +43 -0
- data/lib/riak/bucket.rb +177 -0
- data/lib/riak/client/rpc.rb +127 -0
- data/lib/riak/client.rb +227 -0
- data/lib/riak/client_pb.rb +372 -0
- data/lib/riak/failed_exchange.rb +21 -0
- data/lib/riak/failed_request.rb +22 -0
- data/lib/riak/i18n.rb +7 -0
- data/lib/riak/key.rb +284 -0
- data/lib/riak/locale/en.yml +37 -0
- data/lib/riak/riak_content.rb +219 -0
- data/lib/riak/sibling_error.rb +16 -0
- data/lib/riak/util/decode.rb +37 -0
- data/lib/riak/util/encode.rb +31 -0
- data/lib/riak/util/message_code.rb +73 -0
- data/lib/riak/util/translation.rb +16 -0
- data/lib/riak.rb +34 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/spec/riak/bucket_spec.rb +118 -0
- data/spec/riak/client_spec.rb +212 -0
- data/spec/riak/key_spec.rb +54 -0
- data/spec/riak/map_reduce_spec.rb +4 -0
- data/spec/riak/riak_content_spec.rb +88 -0
- data/spec/riak/rpc_spec.rb +17 -0
- data/spec/spec_helper.rb +25 -0
- metadata +121 -0
data/lib/riak/client.rb
ADDED
@@ -0,0 +1,227 @@
|
|
1
|
+
require 'riak'
|
2
|
+
|
3
|
+
module Riak
|
4
|
+
# A client connection to Riak.
|
5
|
+
class Client
|
6
|
+
include Util::Translation
|
7
|
+
include Util::MessageCode
|
8
|
+
|
9
|
+
autoload :Rpc, 'riak/client/rpc'
|
10
|
+
|
11
|
+
# When using integer client IDs, the exclusive upper-bound of valid values.
|
12
|
+
MAX_CLIENT_ID = 4294967296
|
13
|
+
|
14
|
+
# Regexp for validating hostnames
|
15
|
+
# http://rubular.com/r/N2HOgxFkN3
|
16
|
+
HOST_REGEX = /^([[:alnum:]]+(-*[[:alnum:]]+)*(\.{0,1}(([[:alnum:]]-*)*[[:alnum:]]+)+)*)+$/
|
17
|
+
|
18
|
+
attr_reader :host
|
19
|
+
attr_reader :port
|
20
|
+
attr_reader :buckets
|
21
|
+
attr_reader :bucket_cache
|
22
|
+
attr_reader :node
|
23
|
+
attr_reader :server_version
|
24
|
+
attr_reader :client_id
|
25
|
+
|
26
|
+
# Creates a client connection to Riak's Protobuf Listener
|
27
|
+
# @param [String] options configuration options for the client
|
28
|
+
# @param [String] host ('127.0.0.1') The host or IP address for the Riak endpoint
|
29
|
+
# @param [Fixnum] port (8087) The port of the Riak protobuf listener endpoint
|
30
|
+
def initialize(options={})
|
31
|
+
self.host = options[:host] || "127.0.0.1"
|
32
|
+
self.port = options[:port] || 8087
|
33
|
+
self.client_id = options[:client_id] unless options[:client_id].nil?
|
34
|
+
@w = options[:w]
|
35
|
+
@dw = options[:dw]
|
36
|
+
@buckets = []
|
37
|
+
@bucket_cache = Hash.new{|k,v| k[v] = Riak::Bucket.new(self, v)}
|
38
|
+
end
|
39
|
+
|
40
|
+
# Set the hostname of the Riak endpoint. Must be an IPv4, IPv6, or valid hostname
|
41
|
+
# @param [String] value The host or IP address for the Riak endpoint
|
42
|
+
# @raise [ArgumentError] if an invalid hostname is given
|
43
|
+
# @return [String] the assigned hostname
|
44
|
+
def host=(value)
|
45
|
+
raise ArgumentError, t("hostname_invalid") unless value.is_a?(String) && value =~ HOST_REGEX
|
46
|
+
@host = value
|
47
|
+
end
|
48
|
+
|
49
|
+
# Set the port number of the Riak endpoint. This must be an integer between 0 and 65535.
|
50
|
+
# @param [Fixnum] value The port number of the Riak endpoint
|
51
|
+
# @raise [ArgumentError] if an invalid port number is given
|
52
|
+
# @return [Fixnum] the assigned port number
|
53
|
+
def port=(value)
|
54
|
+
raise ArgumentError, t("port_invalid") unless (0..65535).include?(value)
|
55
|
+
@port = value
|
56
|
+
end
|
57
|
+
|
58
|
+
# Set the client ID for this client. Must be a string or Fixnum value 0 =< value < MAX_CLIENT_ID.
|
59
|
+
# @param [String, Fixnum] value The internal client ID used by Riak to route responses
|
60
|
+
# @raise [ArgumentError] when an invalid client ID is given
|
61
|
+
# @return [String] the assigned client ID
|
62
|
+
def client_id=(value)
|
63
|
+
@client_id = case value
|
64
|
+
when 0...MAX_CLIENT_ID
|
65
|
+
b64encode(value)
|
66
|
+
when String
|
67
|
+
value
|
68
|
+
else
|
69
|
+
raise ArgumentError, t("invalid_client_id", :max_id => MAX_CLIENT_ID)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Establish a connection to the riak node, and store the Rpc instance
|
74
|
+
# @return [Riak::Client::Rpc] the Rpc instance that handles connections to the riak node
|
75
|
+
def rpc(options={})
|
76
|
+
options[:client_id] ||= @client_id if @client_id
|
77
|
+
@rpc ||= Rpc.new(self)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Tests connectivity with the Riak host.
|
81
|
+
# @return [Boolean] Successful returned as 'true', failed connection returned as 'false'
|
82
|
+
def ping?
|
83
|
+
rpc.request Util::MessageCode::PING_REQUEST
|
84
|
+
|
85
|
+
return rpc.status
|
86
|
+
end
|
87
|
+
|
88
|
+
# Retrieves basic information from the riak node.
|
89
|
+
# @return [Hash] Returns the name of the node and its software release number
|
90
|
+
def info
|
91
|
+
response = rpc.request Riak::Util::MessageCode::GET_SERVER_INFO_REQUEST
|
92
|
+
|
93
|
+
@node = response.node
|
94
|
+
@server_version = response.server_version
|
95
|
+
|
96
|
+
{:node => @node, :server_version => @server_version}
|
97
|
+
end
|
98
|
+
|
99
|
+
# I need bucket! Bring me bucket! (Retrieves a bucket from Riak. Eating disorder not included.)
|
100
|
+
# @param [String] bucket the bucket to retrieve
|
101
|
+
# @return [Bucket] the requested bucket
|
102
|
+
def bring_me_bucket(bucket)
|
103
|
+
request = Riak::RpbGetBucketReq.new(:bucket => bucket)
|
104
|
+
response = rpc.request(
|
105
|
+
Util::MessageCode::GET_BUCKET_REQUEST,
|
106
|
+
request
|
107
|
+
)
|
108
|
+
|
109
|
+
@bucket_cache[bucket].load(response)
|
110
|
+
end
|
111
|
+
alias :[] :bring_me_bucket
|
112
|
+
alias :bucket :bring_me_bucket
|
113
|
+
|
114
|
+
# Retrieves a key, using RpbGetReq, from within a given bucket, from Riak.
|
115
|
+
# @param [String] bucket the bucket from which to retrieve the key
|
116
|
+
# @param [String] key the name of the key to be received
|
117
|
+
# @param [Fixnum] quorum read quorum- num of replicas need to agree when retrieving the object
|
118
|
+
# @return [RpbGetResp] the response in which the given Key is stored
|
119
|
+
def get_request(bucket, key, quorum=nil)
|
120
|
+
request = Riak::RpbGetReq.new({:bucket => bucket, :key => key})
|
121
|
+
request.r = quorum if quorum.is_a?(Fixnum)
|
122
|
+
|
123
|
+
response = rpc.request(
|
124
|
+
Util::MessageCode::GET_REQUEST,
|
125
|
+
request
|
126
|
+
)
|
127
|
+
|
128
|
+
return(response)
|
129
|
+
end
|
130
|
+
alias :req :get_request
|
131
|
+
alias :get :get_request
|
132
|
+
|
133
|
+
# Inserts a key into riak, using RpbPutReq.
|
134
|
+
# @option options [Fixnum] :w (write quorum) how many replicas to write to before returning a successful response.
|
135
|
+
# @option options [Fixnum :dw how many replicas to commit to durable storage before returning a successful response.
|
136
|
+
# @option options [Boolean] :return_body whether to return the contents of the stored object.
|
137
|
+
# @return [RpbPutResp] the response confirming Key storage and (optionally) the Key's updated/new data.
|
138
|
+
def put_request(options)
|
139
|
+
raise ArgumentError, t('invalid_bucket') if options[:bucket].empty?
|
140
|
+
raise ArgumentError, t('empty_content') if options[:content].nil?
|
141
|
+
|
142
|
+
options[:w] ||= @w unless @w.nil?
|
143
|
+
options[:dw] ||= @dw unless @dw.nil?
|
144
|
+
options[:return_body] ||= true
|
145
|
+
|
146
|
+
request = Riak::RpbPutReq.new(options)
|
147
|
+
|
148
|
+
response = rpc.request(
|
149
|
+
Util::MessageCode::PUT_REQUEST,
|
150
|
+
request
|
151
|
+
)
|
152
|
+
|
153
|
+
return(response)
|
154
|
+
end
|
155
|
+
|
156
|
+
# Deletes a key, using RpbDelReq, from within a given bucket, from Riak.
|
157
|
+
# @param [String] bucket the bucket from which to delete the key
|
158
|
+
# @param [String] key the name of the key to be deleted
|
159
|
+
# @param [Fixnum] rw how many replicas to delete before returning a successful response
|
160
|
+
# @return [RpbGetResp] the response confirming deletion
|
161
|
+
def del_request(bucket, key, rw=nil)
|
162
|
+
request = Riak::RpbDelReq.new
|
163
|
+
request.bucket = bucket
|
164
|
+
request.key = key
|
165
|
+
request.rw ||= rw
|
166
|
+
|
167
|
+
response = rpc.request(
|
168
|
+
Util::MessageCode::DEL_REQUEST,
|
169
|
+
request
|
170
|
+
)
|
171
|
+
end
|
172
|
+
|
173
|
+
# Sends a MapReduce operation to riak, using RpbMapRedReq, and returns the Response/phases.
|
174
|
+
# @param [String] mr_request map/reduce job, encoded/stringified
|
175
|
+
# @param [String] content_type encoding for map/reduce job
|
176
|
+
# @return [RpbMapRedResp] the response, encoded in the same format that was sent
|
177
|
+
def map_reduce_request(mr_request, content_type)
|
178
|
+
request = Riak::RpbMapRedReq.new
|
179
|
+
request.request = mr_request
|
180
|
+
request.content_type = content_type
|
181
|
+
|
182
|
+
response = rpc.request(
|
183
|
+
Util::MessageCode::MAP_REDUCE_REQUEST,
|
184
|
+
request
|
185
|
+
)
|
186
|
+
|
187
|
+
return(response)
|
188
|
+
end
|
189
|
+
alias :mapred :map_reduce_request
|
190
|
+
alias :mr :map_reduce_request
|
191
|
+
|
192
|
+
# Lists the buckets found in the Riak database
|
193
|
+
# @raise [ReturnRespError] if the message response does not correlate with the message requested
|
194
|
+
# @return [Array] list of buckets (String)
|
195
|
+
def buckets
|
196
|
+
response = rpc.request Util::MessageCode::LIST_BUCKETS_REQUEST
|
197
|
+
|
198
|
+
# iterate through each of the Strings in the Bucket list, returning an array of String(s)
|
199
|
+
@buckets = response.buckets.each{|b| b}
|
200
|
+
end
|
201
|
+
|
202
|
+
# Lists the keys within their respective buckets, that are found in the Riak database
|
203
|
+
# @param [String] bucket the bucket from which to retrieve the list of keys
|
204
|
+
# @raise [ReturnRespError] if the message response does not correlate with the message requested
|
205
|
+
# @return [Hash] Mapping of the buckets (String) to their keys (Array of Strings)
|
206
|
+
def keys_in(bucket)
|
207
|
+
|
208
|
+
list_keys_request = RpbListKeysReq.new(:bucket => bucket)
|
209
|
+
|
210
|
+
response = rpc.request Util::MessageCode::LIST_KEYS_REQUEST, list_keys_request
|
211
|
+
|
212
|
+
return(response.keys.each{|k| k})
|
213
|
+
end
|
214
|
+
|
215
|
+
# @return [String] A representation suitable for IRB and debugging output.
|
216
|
+
# def inspect
|
217
|
+
# "#<Client >"
|
218
|
+
# end
|
219
|
+
|
220
|
+
private
|
221
|
+
def b64encode(n)
|
222
|
+
Base64.encode64([n].pack("N")).chomp
|
223
|
+
end
|
224
|
+
|
225
|
+
end # class Client
|
226
|
+
end # module Riak
|
227
|
+
|
@@ -0,0 +1,372 @@
|
|
1
|
+
### Generated by rprotoc. DO NOT EDIT!
|
2
|
+
### <proto file: riakclient.proto>
|
3
|
+
# /* -------------------------------------------------------------------
|
4
|
+
# **
|
5
|
+
# ** riakclient.proto: Protocol buffers for riak
|
6
|
+
# **
|
7
|
+
# ** Copyright (c) 2007-2010 Basho Technologies, Inc. All Rights Reserved.
|
8
|
+
# **
|
9
|
+
# ** This file is provided to you under the Apache License,
|
10
|
+
# ** Version 2.0 (the "License"); you may not use this file
|
11
|
+
# ** except in compliance with the License. You may obtain
|
12
|
+
# ** a copy of the License at
|
13
|
+
# **
|
14
|
+
# ** http://www.apache.org/licenses/LICENSE-2.0
|
15
|
+
# **
|
16
|
+
# ** Unless required by applicable law or agreed to in writing,
|
17
|
+
# ** software distributed under the License is distributed on an
|
18
|
+
# ** "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
19
|
+
# ** KIND, either express or implied. See the License for the
|
20
|
+
# ** specific language governing permissions and limitations
|
21
|
+
# ** under the License.
|
22
|
+
# **
|
23
|
+
# ** -------------------------------------------------------------------
|
24
|
+
# */
|
25
|
+
# /*
|
26
|
+
# ** Revision: 1.1
|
27
|
+
# **
|
28
|
+
# ** Lowest Common Denominator Protocol Buffers Client
|
29
|
+
# ** - no ENUM (protobuffs_erlang does not support)
|
30
|
+
# **
|
31
|
+
# ** Protocol
|
32
|
+
# **
|
33
|
+
# ** The protocol encodes requests and responses as protocol buffer messages.
|
34
|
+
# ** Each request message results in one or more response messages.
|
35
|
+
# ** As message type and length are not encoded by PB they are sent
|
36
|
+
# ** on the wire as
|
37
|
+
# **
|
38
|
+
# ** <length:32> <msg_code:8> <pbmsg>
|
39
|
+
# **
|
40
|
+
# ** length is the length of msg_code (1 byte) plus the message length
|
41
|
+
# ** in bytes encoded in network order (big endian)
|
42
|
+
# **
|
43
|
+
# ** msg_code indicates what is encoded as pbmsg
|
44
|
+
# **
|
45
|
+
# ** pbmsg is the encoded protocol buffer message
|
46
|
+
# **
|
47
|
+
# ** On connect, the client sends RpbHello with protocol/node information.
|
48
|
+
# ** After that client can make requests and will receive responses.
|
49
|
+
# ** For each request message there is a correspondign response message,
|
50
|
+
# ** or the server will respond with an error message if something has
|
51
|
+
# ** gone wrong.
|
52
|
+
# **
|
53
|
+
# ** The client should be prepared to handle messages without any pbmsg
|
54
|
+
# ** (i.e. length==1) for requests like ping or a put without return_body set.
|
55
|
+
# **
|
56
|
+
# ** RpbGetClientIdReq -> RpbGetClientIdResp
|
57
|
+
# ** RpbSetClientIdReq -> RpbSetClientIdResp
|
58
|
+
# ** RpbGetServerInfoReq -> RpbGetServerInfoResp
|
59
|
+
# ** RpbPingReq -> RpbPingResp
|
60
|
+
# ** RpbGetReq -> RpbErrorResp | RbpGetResp
|
61
|
+
# ** RpbPutReq -> RpbErrorResp | RpbPutResp
|
62
|
+
# ** RpbDelReq -> RpbErrorResp | RpbDelResp
|
63
|
+
# ** RpbListBucketsReq -> RpbErrorResp | RpbListBucketsResp
|
64
|
+
# ** RpbListKeysReq -> RpbErrorResp | RpbListKeysResp{1,}
|
65
|
+
# ** RpbGetBucketReq -> RpbErrorResp | RpbGetBucketResp
|
66
|
+
# **
|
67
|
+
# **
|
68
|
+
# ** Message Codes
|
69
|
+
# ** 0 - RpbErrorResp
|
70
|
+
# ** 1 - RpbPingReq - 0 length
|
71
|
+
# ** 2 - RpbPingResp (pong) - 0 length
|
72
|
+
# ** 3 - RpbGetClientIdReq
|
73
|
+
# ** 4 - RpbGetClientIdResp
|
74
|
+
# ** 5 - RpbSetClientIdReq
|
75
|
+
# ** 6 - RpbSetClientIdResp
|
76
|
+
# ** 7 - RpbGetServerInfoReq
|
77
|
+
# ** 8 - RpbGetServerInfoResp
|
78
|
+
# ** 9 - RpbGetReq
|
79
|
+
# ** 10 - RpbGetResp
|
80
|
+
# ** 11 - RpbPutReq
|
81
|
+
# ** 12 - RpbPutResp - 0 length
|
82
|
+
# ** 13 - RpbDelReq
|
83
|
+
# ** 14 - RpbDelResp
|
84
|
+
# ** 15 - RpbListBucketsReq
|
85
|
+
# ** 16 - RpbListBucketsResp{1,}
|
86
|
+
# ** 17 - RpbListKeysReq
|
87
|
+
# ** 18 - RpbListKeysResp{1,}
|
88
|
+
# ** 19 - RpbGetBucketReq
|
89
|
+
# ** 20 - RpbGetBucketResp
|
90
|
+
# ** 21 - RpbSetBucketReq
|
91
|
+
# ** 22 - RpbSetBucketResp
|
92
|
+
# ** 23 - RpbMapRedReq
|
93
|
+
# ** 24 - RpbMapRedResp
|
94
|
+
# **
|
95
|
+
# */
|
96
|
+
#
|
97
|
+
# // Error response - may be generated for any Req
|
98
|
+
# message RpbErrorResp {
|
99
|
+
# required bytes errmsg = 1;
|
100
|
+
# required uint32 errcode = 2;
|
101
|
+
# }
|
102
|
+
#
|
103
|
+
# // Get ClientId Request - no message defined, just send RpbGetClientIdReq message code
|
104
|
+
# message RpbGetClientIdResp {
|
105
|
+
# required bytes client_id = 1; // Client id in use for this connection
|
106
|
+
# }
|
107
|
+
#
|
108
|
+
# message RpbSetClientIdReq {
|
109
|
+
# required bytes client_id = 1; // Client id to use for this connection
|
110
|
+
# }
|
111
|
+
# // Set ClientId Request - no message defined, just send RpbSetClientIdReq message code
|
112
|
+
#
|
113
|
+
# // Get server info request - no message defined, just send RpbGetServerInfoReq message code
|
114
|
+
#
|
115
|
+
# message RpbGetServerInfoResp {
|
116
|
+
# optional bytes node = 1;
|
117
|
+
# optional bytes server_version = 2;
|
118
|
+
# }
|
119
|
+
#
|
120
|
+
#
|
121
|
+
# // Get Request - retrieve bucket/key
|
122
|
+
# message RpbGetReq {
|
123
|
+
# required bytes bucket = 1;
|
124
|
+
# required bytes key = 2;
|
125
|
+
# optional uint32 r = 3;
|
126
|
+
# }
|
127
|
+
#
|
128
|
+
# // Get Response - if the record was not found there will be no content/vclock
|
129
|
+
# message RpbGetResp {
|
130
|
+
# repeated RpbContent content = 1;
|
131
|
+
# optional bytes vclock = 2; // the opaque vector clock for the object
|
132
|
+
# }
|
133
|
+
#
|
134
|
+
#
|
135
|
+
# // Put request - if options.return_body is set then the updated metadata/data for
|
136
|
+
# // the key will be returned.
|
137
|
+
# message RpbPutReq {
|
138
|
+
# required bytes bucket = 1;
|
139
|
+
# required bytes key = 2;
|
140
|
+
# optional bytes vclock = 3;
|
141
|
+
# required RpbContent content = 4;
|
142
|
+
# optional uint32 w = 5;
|
143
|
+
# optional uint32 dw = 6;
|
144
|
+
# optional bool return_body = 7;
|
145
|
+
# }
|
146
|
+
#
|
147
|
+
# // Put response - same as get response
|
148
|
+
# message RpbPutResp {
|
149
|
+
# repeated RpbContent contents = 1;
|
150
|
+
# optional bytes vclock = 2; // the opaque vector clock for the object
|
151
|
+
# }
|
152
|
+
#
|
153
|
+
#
|
154
|
+
# // Delete request
|
155
|
+
# message RpbDelReq {
|
156
|
+
# required bytes bucket = 1;
|
157
|
+
# required bytes key = 2;
|
158
|
+
# optional uint32 rw = 3;
|
159
|
+
# }
|
160
|
+
#
|
161
|
+
# // Delete response - not defined, will return a RpbDelResp on success or RpbErrorResp on failure
|
162
|
+
#
|
163
|
+
# // List buckets request - no message defined, just send RpbListBucketsReq
|
164
|
+
#
|
165
|
+
# // List buckets response
|
166
|
+
# message RpbListBucketsResp {
|
167
|
+
# repeated bytes buckets = 1;
|
168
|
+
# }
|
169
|
+
#
|
170
|
+
#
|
171
|
+
# // List keys in bucket request
|
172
|
+
# message RpbListKeysReq {
|
173
|
+
# required bytes bucket = 1;
|
174
|
+
# }
|
175
|
+
#
|
176
|
+
# // List keys in bucket response - one or more of these packets will be sent
|
177
|
+
# // the last one will have done set true (and may not have any keys in it)
|
178
|
+
# message RpbListKeysResp {
|
179
|
+
# repeated bytes keys = 1;
|
180
|
+
# optional bool done = 2;
|
181
|
+
# }
|
182
|
+
#
|
183
|
+
# // Get bucket properties request
|
184
|
+
# message RpbGetBucketReq {
|
185
|
+
# required bytes bucket = 1;
|
186
|
+
# }
|
187
|
+
#
|
188
|
+
# // Get bucket properties response
|
189
|
+
# message RpbGetBucketResp {
|
190
|
+
# required RpbBucketProps props = 1;
|
191
|
+
# }
|
192
|
+
#
|
193
|
+
# // Set bucket properties request
|
194
|
+
# message RpbSetBucketReq {
|
195
|
+
# required bytes bucket = 1;
|
196
|
+
# required RpbBucketProps props = 2;
|
197
|
+
# }
|
198
|
+
#
|
199
|
+
#
|
200
|
+
# // Set bucket properties response - no message defined, just send RpbSetBucketResp
|
201
|
+
#
|
202
|
+
#
|
203
|
+
# // Map/Reduce request
|
204
|
+
# message RpbMapRedReq {
|
205
|
+
# required bytes request = 1;
|
206
|
+
# required bytes content_type = 2;
|
207
|
+
# }
|
208
|
+
#
|
209
|
+
# // Map/Reduce response
|
210
|
+
# // one or more of these packets will be sent the last one will have done set
|
211
|
+
# // true (and may not have phase/data in it)
|
212
|
+
# message RpbMapRedResp {
|
213
|
+
# optional uint32 phase = 1;
|
214
|
+
# optional bytes response = 2;
|
215
|
+
# optional bool done = 3;
|
216
|
+
# }
|
217
|
+
#
|
218
|
+
# // Content message included in get/put responses
|
219
|
+
# // Holds the value and associated metadata
|
220
|
+
# message RpbContent {
|
221
|
+
# required bytes value = 1;
|
222
|
+
# optional bytes content_type = 2; // the media type/format
|
223
|
+
# optional bytes charset = 3;
|
224
|
+
# optional bytes content_encoding = 4;
|
225
|
+
# optional bytes vtag = 5;
|
226
|
+
# repeated RpbLink links = 6; // links to other resources
|
227
|
+
# optional uint32 last_mod = 7;
|
228
|
+
# optional uint32 last_mod_usecs = 8;
|
229
|
+
# repeated RpbPair usermeta = 9; // user metadata stored with the object
|
230
|
+
# }
|
231
|
+
#
|
232
|
+
# // Key/value pair - used for user metadata
|
233
|
+
# message RpbPair {
|
234
|
+
# required bytes key = 1;
|
235
|
+
# optional bytes value = 2;
|
236
|
+
# }
|
237
|
+
#
|
238
|
+
# // Link metadata
|
239
|
+
# message RpbLink {
|
240
|
+
# optional bytes bucket = 1;
|
241
|
+
# optional bytes key = 2;
|
242
|
+
# optional bytes tag = 3;
|
243
|
+
# }
|
244
|
+
#
|
245
|
+
# // Bucket properties
|
246
|
+
# message RpbBucketProps {
|
247
|
+
# optional uint32 n_val = 1;
|
248
|
+
# optional bool allow_mult = 2;
|
249
|
+
# }
|
250
|
+
|
251
|
+
require 'protobuf/message/message'
|
252
|
+
require 'protobuf/message/enum'
|
253
|
+
require 'protobuf/message/service'
|
254
|
+
require 'protobuf/message/extend'
|
255
|
+
|
256
|
+
module Riak
|
257
|
+
class RpbErrorResp < ::Protobuf::Message
|
258
|
+
defined_in __FILE__
|
259
|
+
required :bytes, :errmsg, 1
|
260
|
+
required :uint32, :errcode, 2
|
261
|
+
end
|
262
|
+
class RpbGetClientIdResp < ::Protobuf::Message
|
263
|
+
defined_in __FILE__
|
264
|
+
required :bytes, :client_id, 1
|
265
|
+
end
|
266
|
+
class RpbSetClientIdReq < ::Protobuf::Message
|
267
|
+
defined_in __FILE__
|
268
|
+
required :bytes, :client_id, 1
|
269
|
+
end
|
270
|
+
class RpbGetServerInfoResp < ::Protobuf::Message
|
271
|
+
defined_in __FILE__
|
272
|
+
optional :bytes, :node, 1
|
273
|
+
optional :bytes, :server_version, 2
|
274
|
+
end
|
275
|
+
class RpbGetReq < ::Protobuf::Message
|
276
|
+
defined_in __FILE__
|
277
|
+
required :bytes, :bucket, 1
|
278
|
+
required :bytes, :key, 2
|
279
|
+
optional :uint32, :r, 3
|
280
|
+
end
|
281
|
+
class RpbGetResp < ::Protobuf::Message
|
282
|
+
defined_in __FILE__
|
283
|
+
repeated :RpbContent, :content, 1
|
284
|
+
optional :bytes, :vclock, 2
|
285
|
+
end
|
286
|
+
class RpbPutReq < ::Protobuf::Message
|
287
|
+
defined_in __FILE__
|
288
|
+
required :bytes, :bucket, 1
|
289
|
+
required :bytes, :key, 2
|
290
|
+
optional :bytes, :vclock, 3
|
291
|
+
required :RpbContent, :content, 4
|
292
|
+
optional :uint32, :w, 5
|
293
|
+
optional :uint32, :dw, 6
|
294
|
+
optional :bool, :return_body, 7
|
295
|
+
end
|
296
|
+
class RpbPutResp < ::Protobuf::Message
|
297
|
+
defined_in __FILE__
|
298
|
+
repeated :RpbContent, :content, 1
|
299
|
+
optional :bytes, :vclock, 2
|
300
|
+
end
|
301
|
+
class RpbDelReq < ::Protobuf::Message
|
302
|
+
defined_in __FILE__
|
303
|
+
required :bytes, :bucket, 1
|
304
|
+
required :bytes, :key, 2
|
305
|
+
optional :uint32, :rw, 3
|
306
|
+
end
|
307
|
+
class RpbListBucketsResp < ::Protobuf::Message
|
308
|
+
defined_in __FILE__
|
309
|
+
repeated :bytes, :buckets, 1
|
310
|
+
end
|
311
|
+
class RpbListKeysReq < ::Protobuf::Message
|
312
|
+
defined_in __FILE__
|
313
|
+
required :bytes, :bucket, 1
|
314
|
+
end
|
315
|
+
class RpbListKeysResp < ::Protobuf::Message
|
316
|
+
defined_in __FILE__
|
317
|
+
repeated :bytes, :keys, 1
|
318
|
+
optional :bool, :done, 2
|
319
|
+
end
|
320
|
+
class RpbGetBucketReq < ::Protobuf::Message
|
321
|
+
defined_in __FILE__
|
322
|
+
required :bytes, :bucket, 1
|
323
|
+
end
|
324
|
+
class RpbGetBucketResp < ::Protobuf::Message
|
325
|
+
defined_in __FILE__
|
326
|
+
required :RpbBucketProps, :props, 1
|
327
|
+
end
|
328
|
+
class RpbSetBucketReq < ::Protobuf::Message
|
329
|
+
defined_in __FILE__
|
330
|
+
required :bytes, :bucket, 1
|
331
|
+
required :RpbBucketProps, :props, 2
|
332
|
+
end
|
333
|
+
class RpbMapRedReq < ::Protobuf::Message
|
334
|
+
defined_in __FILE__
|
335
|
+
required :bytes, :request, 1
|
336
|
+
required :bytes, :content_type, 2
|
337
|
+
end
|
338
|
+
class RpbMapRedResp < ::Protobuf::Message
|
339
|
+
defined_in __FILE__
|
340
|
+
repeated :uint32, :phase, 1
|
341
|
+
repeated :bytes, :response, 2
|
342
|
+
optional :bool, :done, 3
|
343
|
+
end
|
344
|
+
class RpbContent < ::Protobuf::Message
|
345
|
+
defined_in __FILE__
|
346
|
+
required :bytes, :value, 1
|
347
|
+
optional :bytes, :content_type, 2
|
348
|
+
optional :bytes, :charset, 3
|
349
|
+
optional :bytes, :content_encoding, 4
|
350
|
+
optional :bytes, :vtag, 5
|
351
|
+
repeated :RpbLink, :links, 6
|
352
|
+
optional :uint32, :last_mod, 7
|
353
|
+
optional :uint32, :last_mod_usecs, 8
|
354
|
+
repeated :RpbPair, :usermeta, 9
|
355
|
+
end
|
356
|
+
class RpbPair < ::Protobuf::Message
|
357
|
+
defined_in __FILE__
|
358
|
+
required :bytes, :key, 1
|
359
|
+
optional :bytes, :value, 2
|
360
|
+
end
|
361
|
+
class RpbLink < ::Protobuf::Message
|
362
|
+
defined_in __FILE__
|
363
|
+
optional :bytes, :bucket, 1
|
364
|
+
optional :bytes, :key, 2
|
365
|
+
optional :bytes, :tag, 3
|
366
|
+
end
|
367
|
+
class RpbBucketProps < ::Protobuf::Message
|
368
|
+
defined_in __FILE__
|
369
|
+
optional :uint32, :n_val, 1
|
370
|
+
optional :bool, :allow_mult, 2
|
371
|
+
end
|
372
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'riak'
|
2
|
+
|
3
|
+
module Riak
|
4
|
+
# Exception raised when the expected response code from Riak
|
5
|
+
# fails to match the actual response code.
|
6
|
+
class FailedExchange < StandardError
|
7
|
+
include Util::Translation
|
8
|
+
|
9
|
+
attr_reader :expected
|
10
|
+
attr_reader :actual
|
11
|
+
attr_reader :output
|
12
|
+
attr_reader :stub
|
13
|
+
|
14
|
+
def initialize(expected, actual, output, stub)
|
15
|
+
@expected, @actual, @output, @stub = expected, actual, output, stub
|
16
|
+
super t("failed_rx", :failure =>
|
17
|
+
t(@stub, :expected => @expected, :actual => @actual, :output => @output.inspect)
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'riak'
|
2
|
+
|
3
|
+
module Riak
|
4
|
+
# Exception raised when the expected response code from Riak
|
5
|
+
# fails to match the actual response code.
|
6
|
+
class FailedRequest < StandardError
|
7
|
+
include Riak::Util::Translation
|
8
|
+
|
9
|
+
attr_reader :expected
|
10
|
+
attr_reader :actual
|
11
|
+
attr_reader :output
|
12
|
+
attr_reader :message
|
13
|
+
|
14
|
+
def initialize(expected=nil, actual=nil, output=nil, message=nil)
|
15
|
+
@expected = expected
|
16
|
+
@actual = actual
|
17
|
+
@output = output
|
18
|
+
@message = message || "failed_request"
|
19
|
+
super t(@message, :expected => @expected, :actual => @actual, :output => @output.inspect)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|