riakpb 0.1.6 → 0.2.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/README.rdoc +23 -23
- data/Rakefile +3 -3
- data/lib/riak/bucket.rb +23 -23
- data/lib/riak/client/rpc.rb +14 -12
- data/lib/riak/client.rb +59 -73
- data/lib/riak/client_pb.rb +1 -1
- data/lib/riak/{riak_content.rb → content.rb} +125 -70
- data/lib/riak/failed_exchange.rb +2 -2
- data/lib/riak/failed_request.rb +3 -3
- data/lib/riak/key.rb +38 -38
- data/lib/riak/locale/en.yml +3 -3
- data/lib/riak/map_reduce.rb +6 -6
- data/lib/riak/sibling_error.rb +3 -3
- data/lib/riak/util/decode.rb +1 -1
- data/lib/riak/util/encode.rb +2 -2
- data/lib/riak/util/message_code.rb +9 -9
- data/lib/riak/util/translation.rb +1 -1
- data/lib/riak.rb +3 -3
- data/load_stocks.rb +1 -1
- data/spec/riak/bucket_spec.rb +22 -22
- data/spec/riak/client_spec.rb +31 -31
- data/spec/riak/{riak_content_spec.rb → content_spec.rb} +17 -18
- data/spec/riak/key_spec.rb +16 -16
- data/spec/riak/map_reduce_spec.rb +30 -30
- data/spec/riak/rpc_spec.rb +2 -2
- metadata +9 -10
- data/riakpb.gemspec +0 -37
data/README.rdoc
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
7
|
-
This is a Ruby client for
|
7
|
+
This is a Ruby client for Riakpb, using protocol buffers instead of REST. It offers some benefit in terms of speed and it abstracts Buckets/Keys differently than does the REST client. Different != Better.
|
8
8
|
|
9
9
|
== FEATURES/PROBLEMS:
|
10
10
|
|
@@ -19,23 +19,23 @@ This is a work in progress and I am current improving the rspec and the document
|
|
19
19
|
|
20
20
|
=== Connect to riak and ping it:
|
21
21
|
|
22
|
-
>> client =
|
23
|
-
=> #<
|
22
|
+
>> client = Riakpb::Client.new # Riakpb::Client.new({:host => "ubuntu01", :port => 1234})
|
23
|
+
=> #<Riakpb::Client:0x0000010328a040 @host="127.0.0.1", @port=8087, @w=nil, @dw=nil, @buckets=[], @bucket_cache={}>
|
24
24
|
>> client.ping?
|
25
25
|
=> true
|
26
26
|
|
27
27
|
=== List Buckets within riak:
|
28
28
|
<i>Not suggested for use in production</i>
|
29
29
|
|
30
|
-
>> client =
|
31
|
-
=> #<
|
30
|
+
>> client = Riakpb::Client.new
|
31
|
+
=> #<Riakpb::Client:0x00000101439a78 @host="127.0.0.1", @port=8087, @w=nil, @dw=nil, @buckets=[], @bucket_cache={}>
|
32
32
|
>> client.buckets
|
33
33
|
=> ["hb", "goog"]
|
34
34
|
|
35
35
|
=== Fetch a Bucket:
|
36
36
|
|
37
37
|
>> bucket = client["goog"]
|
38
|
-
=> #<
|
38
|
+
=> #<Riakpb::Bucket name=goog, props={n_val=>3, allow_mult=false}>
|
39
39
|
|
40
40
|
=== Destroy a Bucket:
|
41
41
|
|
@@ -45,22 +45,22 @@ This is a work in progress and I am current improving the rspec and the document
|
|
45
45
|
=== List Keys within the Bucket:
|
46
46
|
|
47
47
|
>> bucket = client["goog"]
|
48
|
-
=> #<
|
48
|
+
=> #<Riakpb::Bucket name=goog, props={n_val=>3, allow_mult=false}>
|
49
49
|
>> bucket.keys
|
50
50
|
=> ["2010-05-03", "2010-03-24", "2010-03-05", "2010-02-25", <<SNIP>>, "2005-02-10", "2005-01-04"]
|
51
51
|
|
52
52
|
=== Fetch a Key:
|
53
53
|
|
54
54
|
>> key = bucket["2010-04-12"]
|
55
|
-
=> #<
|
55
|
+
=> #<Riakpb::Key name="2010-04-12", vclock="k\xCEa```\xCC`\xCA\x05R,\xCC\xF3{*2\x98\x12\x19\xF3X\x19N\xCF\xEB8\xCA\x97\x05\x00", contents=[#<#Riakpb::Content 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="3pbhcnmUtPZvXBSCmo5ESs", links=[], last_mod=1276388043, last_mod_usecs=65345, usermeta={}>]>
|
56
56
|
|
57
57
|
=== Fetch a Key's Content:
|
58
|
-
<i>Differs from the REST client. Key+
|
58
|
+
<i>Differs from the REST client. Key+Content = ROjbect</i>
|
59
59
|
|
60
60
|
>> rcon = key.content
|
61
|
-
=> #<#
|
61
|
+
=> #<#Riakpb::Content 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="3pbhcnmUtPZvXBSCmo5ESs", links=[], last_mod=1276388043, last_mod_usecs=65345, usermeta={}>
|
62
62
|
|
63
|
-
=== Play with the
|
63
|
+
=== Play with the Content's data and save it:
|
64
64
|
|
65
65
|
>> rcon.value
|
66
66
|
=> {"Date"=>Mon, 12 Apr 2010, "Open"=>"567.35", "High"=>"574.00", "Low"=>"566.22", "Close"=>"572.73", "Volume"=>"2352400", "Adj Close"=>"572.73"}
|
@@ -71,29 +71,29 @@ This is a work in progress and I am current improving the rspec and the document
|
|
71
71
|
>> rcon.value["Date"] += 1.day
|
72
72
|
=> Tue, 13 Apr 2010
|
73
73
|
>> rcon
|
74
|
-
=> #<#
|
74
|
+
=> #<#Riakpb::Content value={"Date"=>Tue, 13 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="3pbhcnmUtPZvXBSCmo5ESs", links=[], last_mod=1276388043, last_mod_usecs=65345, usermeta={}>
|
75
75
|
>> rcon.save
|
76
76
|
=> true
|
77
77
|
>> key = bucket["2010-04-12"]
|
78
|
-
=> #<
|
78
|
+
=> #<Riakpb::Key name="2010-04-12", vclock="k\xCEa```\xCA`\xCA\x05R,\xCC\xF3{*2\x98\x12\x19\xF3X\x19N\xCF\xEB8\xCA\a\x13\xFE\x9A\xF3\x05*|x)P8\v\x00", contents=[#<#Riakpb::Content value={"Date"=>Tue, 13 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="2wCEI09OVZEUcHozcm9XCX", links=[], last_mod=1276389827, last_mod_usecs=762316, usermeta={}>]>
|
79
79
|
>> rcon = key.content
|
80
|
-
=> #<#
|
80
|
+
=> #<#Riakpb::Content value={"Date"=>Tue, 13 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="2wCEI09OVZEUcHozcm9XCX", links=[], last_mod=1276389827, last_mod_usecs=762316, usermeta={}>
|
81
81
|
>> rcon.value["Date"] -= 1.day
|
82
82
|
=> Mon, 12 Apr 2010
|
83
83
|
>> rcon.save
|
84
84
|
=> true
|
85
85
|
>> key = bucket["2010-04-12"]
|
86
|
-
=> #<
|
86
|
+
=> #<Riakpb::Key name="2010-04-12", vclock="k\xCEa```\xCA`\xCA\x05R,\xCC\xF3{*2\x98\x12\x19\xF3X\x19N\xCF\xEB8\xCA\a\x13\xFE\x9A\xF3\x05(\xCC\x04\x14~\xBC\x14(\x9C\x05\x00", contents=[#<#Riakpb::Content 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={}>]>
|
87
87
|
>> rcon = key.content
|
88
|
-
=> #<#
|
88
|
+
=> #<#Riakpb::Content 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
91
|
=== Junkshot: (Siblings)
|
92
92
|
|
93
|
-
>> client =
|
94
|
-
=> #<
|
93
|
+
>> client = Riakpb::Client.new
|
94
|
+
=> #<Riakpb::Client:0x00000100d2b998 @host="127.0.0.1", @port=8087, @w=nil, @dw=nil, @buckets=[], @bucket_cache={}>
|
95
95
|
>> bucket = client["goog2"]
|
96
|
-
=> #<
|
96
|
+
=> #<Riakpb::Bucket name=goog2, props={n_val=>3, allow_mult=false}>
|
97
97
|
>> bucket.allow_mult = true
|
98
98
|
=> true
|
99
99
|
>> client.junkshot "goog2", "2010-04-12", {:links => {"tomorrow" => ["goog2", "2010-04-13"]}}
|
@@ -129,7 +129,7 @@ I'm working on ways to simplify M/R requests. It works the same as in ripple.
|
|
129
129
|
require 'riak'
|
130
130
|
require 'csv'
|
131
131
|
|
132
|
-
client =
|
132
|
+
client = Riakpb::Client.new
|
133
133
|
bucket = client["goog"]
|
134
134
|
|
135
135
|
CSV.foreach('goog.csv', :headers => true) do |row|
|
@@ -158,9 +158,9 @@ From Github:
|
|
158
158
|
|
159
159
|
== LINKS:
|
160
160
|
|
161
|
-
*
|
162
|
-
*
|
163
|
-
* Ruby Client for
|
161
|
+
* Riakpb Fast Track: https://wiki.basho.com/display/RIAK/The+Riakpb+Fast+Track
|
162
|
+
* Riakpb Fast Track GOOG data: https://wiki.basho.com/display/RIAK/Loading+Data+and+Running+MapReduce+Queries
|
163
|
+
* Ruby Client for Riakpb's REST Interface: http://github.com/seancribbs/ripple
|
164
164
|
|
165
165
|
== THANKS:
|
166
166
|
|
data/Rakefile
CHANGED
@@ -5,9 +5,9 @@ require './lib/riak'
|
|
5
5
|
|
6
6
|
gemspec = Gem::Specification.new do |gem|
|
7
7
|
gem.name = "riakpb"
|
8
|
-
gem.summary = %Q{riakpb is a protocol buffer client for
|
9
|
-
gem.description = %Q{riakpb is a protocol buffer client for
|
10
|
-
gem.version =
|
8
|
+
gem.summary = %Q{riakpb is a protocol buffer client for Riakpb--the distributed database by Basho.}
|
9
|
+
gem.description = %Q{riakpb is a protocol buffer client for Riakpb--the distributed database by Basho.}
|
10
|
+
gem.version = Riakpb::VERSION
|
11
11
|
gem.email = "me@inherentlylame.com"
|
12
12
|
gem.homepage = "http://github.com/aitrus/riak-pbclient"
|
13
13
|
gem.authors = ["Scott Gonyea"]
|
data/lib/riak/bucket.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'riak'
|
2
2
|
|
3
|
-
module
|
4
|
-
# Represents and encapsulates operations on a
|
3
|
+
module Riakpb
|
4
|
+
# Represents and encapsulates operations on a Riakpb bucket. You may retrieve a bucket
|
5
5
|
# using {Client#bucket}, or create it manually and retrieve its meta-information later.
|
6
6
|
class Bucket
|
7
7
|
include Util::Translation
|
8
8
|
include Util::MessageCode
|
9
9
|
|
10
|
-
# @return [
|
10
|
+
# @return [Riakpb::Client] the associated client
|
11
11
|
attr_reader :client
|
12
12
|
|
13
13
|
# @return [String] the bucket name
|
@@ -21,11 +21,11 @@ module Riak
|
|
21
21
|
|
22
22
|
attr_reader :key_cache
|
23
23
|
|
24
|
-
# Create a
|
25
|
-
# @param [Client] client the {
|
24
|
+
# Create a Riakpb bucket manually.
|
25
|
+
# @param [Client] client the {Riakpb::Client} for this bucket
|
26
26
|
# @param [String] name the name of the bucket
|
27
27
|
def initialize(client, name, options={})
|
28
|
-
options.assert_valid_keys(:n_val, :allow_mult)
|
28
|
+
options.assert_valid_keys(:n_val, :allow_mult, :return_body)
|
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
|
|
@@ -33,16 +33,16 @@ module Riak
|
|
33
33
|
@name = name
|
34
34
|
self.n_val ||= options[:n_val]
|
35
35
|
self.allow_mult ||= options[:allow_mult]
|
36
|
-
@key_cache = Hash.new{|k,v| k[v] =
|
36
|
+
@key_cache = Hash.new{|k,v| k[v] = Riakpb::Key.new(self, v)}
|
37
37
|
end
|
38
38
|
|
39
|
-
# Load information for the bucket from a response given by the {
|
40
|
-
# Used mostly internally - use {
|
41
|
-
# @param [RpbHash] response a response from {
|
39
|
+
# Load information for the bucket from a response given by the {Riakpb::Client::HTTPBackend}.
|
40
|
+
# Used mostly internally - use {Riakpb::Client#bucket} to get a {Bucket} instance.
|
41
|
+
# @param [RpbHash] response a response from {Riakpb::Client::HTTPBackend}
|
42
42
|
# @return [Bucket] self
|
43
43
|
# @see Client#bucket
|
44
44
|
def load(response)
|
45
|
-
if response.is_a?(
|
45
|
+
if response.is_a?(Riakpb::RpbGetBucketResp)
|
46
46
|
@n_val = response.props.n_val
|
47
47
|
@allow_mult = response.props.allow_mult
|
48
48
|
|
@@ -66,7 +66,7 @@ module Riak
|
|
66
66
|
# Retrieve an object from within the bucket.
|
67
67
|
# @param [String] key the key of the object to retrieve
|
68
68
|
# @param [Fixnum] r - the read quorum for the request - how many nodes should concur on the read
|
69
|
-
# @return [
|
69
|
+
# @return [Riakpb::Key] the object
|
70
70
|
def key(key, options={})
|
71
71
|
raise ArgumentError, t("fixnum_invalid", :num => options[:r]) unless options[:r].is_a?(NilClass) or options[:r].is_a?(Fixnum)
|
72
72
|
raise ArgumentError, t("string_invalid", :string => key) unless key.is_a?(String)
|
@@ -84,21 +84,21 @@ module Riak
|
|
84
84
|
# Retrieve an object from within the bucket. Will raise an error message if key does not exist.
|
85
85
|
# @param [String] key the key of the object to retrieve
|
86
86
|
# @param [Fixnum] quorum - the read quorum for the request - how many nodes should concur on the read
|
87
|
-
# @return [
|
87
|
+
# @return [Riakpb::Key] the object
|
88
88
|
def key!(key, r=nil)
|
89
89
|
raise ArgumentError, t("string_invalid", :string => key) unless key.is_a?(String)
|
90
90
|
raise ArgumentError, t("fixnum_invalid", :num => r) unless r.is_a?(Fixnum) or r.nil?
|
91
91
|
|
92
92
|
response = @client.get_request @name, key, r
|
93
93
|
|
94
|
-
|
94
|
+
Riakpb::Key.new(self, key).load!(response)
|
95
95
|
end
|
96
96
|
|
97
97
|
# Retrieves a Key from the given Bucket. Originally written for link retrieval.
|
98
98
|
# @param [String] bucket the name of the bucket, in which the Key is contained
|
99
99
|
# @param [String] key the name of the key to retrieve
|
100
100
|
# @option options [Fixnum] :quorum read quorum- num of replicas need to agree when retrieving the object
|
101
|
-
# @return [
|
101
|
+
# @return [Riakpb::Key] the object
|
102
102
|
def get_linked(bucket, key, options=nil)
|
103
103
|
@client[bucket].key(key, options)
|
104
104
|
end
|
@@ -123,9 +123,9 @@ module Riak
|
|
123
123
|
options = params.slice :return_body, :w, :dw
|
124
124
|
content = params.slice :value, :content_type, :charset, :content_encoding, :links, :usermeta
|
125
125
|
|
126
|
-
key = key.name if key.is_a?(
|
126
|
+
key = key.name if key.is_a?(Riakpb::Key)
|
127
127
|
options[:key] = key
|
128
|
-
options[:content] =
|
128
|
+
options[:content] = Riakpb::RpbContent.new(content)
|
129
129
|
|
130
130
|
self.store(options)
|
131
131
|
end
|
@@ -135,7 +135,7 @@ module Riak
|
|
135
135
|
# @param [Hash] options quorum options
|
136
136
|
# @option options [Fixnum] :rw - the read/write quorum for the delete
|
137
137
|
def delete(key, rw=nil)
|
138
|
-
key = key.name if key.is_a?(
|
138
|
+
key = key.name if key.is_a?(Riakpb::Key)
|
139
139
|
|
140
140
|
@client.del_request(@name, key, rw)
|
141
141
|
end
|
@@ -158,7 +158,7 @@ module Riak
|
|
158
158
|
@allow_mult
|
159
159
|
end
|
160
160
|
|
161
|
-
# Set the allow_mult property. *NOTE* This will result in a PUT request to
|
161
|
+
# Set the allow_mult property. *NOTE* This will result in a PUT request to Riakpb.
|
162
162
|
# @param [true, false] value whether the bucket should allow siblings
|
163
163
|
def allow_mult=(value)
|
164
164
|
case value
|
@@ -194,12 +194,12 @@ module Riak
|
|
194
194
|
|
195
195
|
# @return [String] a representation suitable for IRB and debugging output
|
196
196
|
def inspect
|
197
|
-
"#<
|
197
|
+
"#<Riakpb::Bucket name=#{@name}, props={n_val=>#{@n_val}, allow_mult=#{@allow_mult}}>"
|
198
198
|
end
|
199
199
|
|
200
200
|
# @return [String] a representation suitable for IRB and debugging output, including keys within this bucket
|
201
201
|
def inspect!
|
202
|
-
"#<
|
202
|
+
"#<Riakpb::Bucket name=#{@name}, props={n_val=>#{@n_val}, allow_mult=#{@allow_mult}}, keys=#{keys.inspect}>"
|
203
203
|
end
|
204
204
|
|
205
205
|
private
|
@@ -207,7 +207,7 @@ module Riak
|
|
207
207
|
rpb_links = []
|
208
208
|
|
209
209
|
link_params.each do |tag, links|
|
210
|
-
pb_link =
|
210
|
+
pb_link = Riakpb::RpbLink.new
|
211
211
|
pb_link.tag = tag
|
212
212
|
pb_link.bucket = links[0]
|
213
213
|
pb_link.key = links[1]
|
@@ -220,7 +220,7 @@ module Riak
|
|
220
220
|
rpb_meta = []
|
221
221
|
|
222
222
|
meta_params.each do |k,v|
|
223
|
-
pb_meta =
|
223
|
+
pb_meta = Riakpb::RpbPair.new
|
224
224
|
pb_meta.key = k
|
225
225
|
pb_meta.value = v
|
226
226
|
rpb_meta << pb_meta
|
data/lib/riak/client/rpc.rb
CHANGED
@@ -6,27 +6,27 @@
|
|
6
6
|
#
|
7
7
|
require 'socket'
|
8
8
|
|
9
|
-
module
|
9
|
+
module Riakpb
|
10
10
|
class Client
|
11
11
|
class Rpc
|
12
|
-
include
|
13
|
-
include
|
14
|
-
include
|
15
|
-
include
|
12
|
+
include Riakpb::Util::MessageCode
|
13
|
+
include Riakpb::Util::Translation
|
14
|
+
include Riakpb::Util::Encode
|
15
|
+
include Riakpb::Util::Decode
|
16
16
|
|
17
17
|
RECV_LIMIT=1073741824
|
18
18
|
|
19
19
|
attr_reader :req_message, :response, :resp_message_codes, :resp_message, :status
|
20
20
|
|
21
|
-
# Establishes a Client ID with the
|
22
|
-
# @param [Client] client the
|
21
|
+
# Establishes a Client ID with the Riakpb node, for the life of the RPC connection.
|
22
|
+
# @param [Client] client the Riakpb::Client object in which this Rpc instance lives
|
23
23
|
# @param [Fixnum] limit the max size of an individual TCPSocket receive call. Need to fix, later.
|
24
24
|
def initialize(client, limit=RECV_LIMIT)
|
25
25
|
@status = false
|
26
26
|
@client = client
|
27
27
|
@limit = limit
|
28
28
|
@client_id = request(Util::MessageCode::GET_CLIENT_ID_REQUEST).client_id
|
29
|
-
@set_client_id =
|
29
|
+
@set_client_id = Riakpb::RpbSetClientIdReq.new(:client_id => @client_id)
|
30
30
|
|
31
31
|
# Request / Response Data
|
32
32
|
@resp_message_codes = -1
|
@@ -97,14 +97,16 @@ module Riak
|
|
97
97
|
self.parse_response socket.recv(@limit)
|
98
98
|
|
99
99
|
end while(false == (@response[:done] rescue true))
|
100
|
+
|
101
|
+
socket.flush
|
100
102
|
end # with_socket
|
101
103
|
|
102
104
|
return(@response)
|
103
105
|
end # stream_request
|
104
106
|
|
105
|
-
# Handles the response from the
|
106
|
-
# @param [String] value The message returned from the
|
107
|
-
# @return [Protobuf::Message] @response the processed response (if any) from the
|
107
|
+
# Handles the response from the Riakpb node
|
108
|
+
# @param [String] value The message returned from the Riakpb node over the TCP Socket
|
109
|
+
# @return [Protobuf::Message] @response the processed response (if any) from the Riakpb node
|
108
110
|
def parse_response(value)
|
109
111
|
@resp_message << value
|
110
112
|
|
@@ -135,4 +137,4 @@ module Riak
|
|
135
137
|
|
136
138
|
end # class Client
|
137
139
|
end # module Rpc
|
138
|
-
end # module
|
140
|
+
end # module RiakpbPbclient
|
data/lib/riak/client.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'riak'
|
2
2
|
|
3
|
-
module
|
4
|
-
# A client connection to
|
3
|
+
module Riakpb
|
4
|
+
# A client connection to Riakpb.
|
5
5
|
class Client
|
6
6
|
include Util::Translation
|
7
7
|
include Util::MessageCode
|
@@ -22,23 +22,31 @@ module Riak
|
|
22
22
|
attr_reader :node
|
23
23
|
attr_reader :server_version
|
24
24
|
attr_reader :client_id
|
25
|
-
|
26
|
-
|
27
|
-
#
|
28
|
-
# @
|
29
|
-
# @param [Fixnum] port (8087) The port of the Riak protobuf listener endpoint
|
25
|
+
attr_reader :options
|
26
|
+
|
27
|
+
# Creates a client connection to Riakpb's Protobuf Listener
|
28
|
+
# @options [Hash] options configuration options for the client
|
30
29
|
def initialize(options={})
|
31
30
|
self.host = options[:host] || "127.0.0.1"
|
32
31
|
self.port = options[:port] || 8087
|
33
|
-
self.client_id = options[:client_id] unless options[:client_id].
|
34
|
-
|
35
|
-
|
32
|
+
self.client_id = options[:client_id] unless options[:client_id].blank?
|
33
|
+
|
34
|
+
read_quorum = options[:r] || options[:read_quorum]
|
35
|
+
write_quorum = options[:w] || options[:write_quorum]
|
36
|
+
replica_commit = options[:dw] || options[:replica_commit]
|
37
|
+
return_body = options[:rb] || options[:return_body] || true
|
38
|
+
|
39
|
+
@options = options.slice!(:host, :port, :client_id, :r, :read_quorum, :w, :write_quorum, :dw, :replica_commit, :rb, :return_body)
|
40
|
+
@options[:r] = read_quorum unless read_quorum.blank?
|
41
|
+
@options[:w] = write_quorum unless write_quorum.blank?
|
42
|
+
@options[:dw] = replica_commit unless replica_commit.blank?
|
43
|
+
@options[:return_body] = return_body unless return_body.blank?
|
44
|
+
|
36
45
|
@buckets = []
|
37
|
-
@bucket_cache = Hash.new{|k,v| k[v] =
|
46
|
+
@bucket_cache = Hash.new{|k,v| k[v] = Riakpb::Bucket.new(self, v, @options)}
|
38
47
|
end
|
39
|
-
|
40
|
-
#
|
41
|
-
# @param [String] value The host or IP address for the Riak endpoint
|
48
|
+
# Set the hostname of the Riakpb endpoint. Must be an IPv4, IPv6, or valid hostname
|
49
|
+
# @param [String] value The host or IP address for the Riakpb endpoint
|
42
50
|
# @raise [ArgumentError] if an invalid hostname is given
|
43
51
|
# @return [String] the assigned hostname
|
44
52
|
def host=(value)
|
@@ -46,8 +54,8 @@ module Riak
|
|
46
54
|
@host = value
|
47
55
|
end
|
48
56
|
|
49
|
-
# Set the port number of the
|
50
|
-
# @param [Fixnum] value The port number of the
|
57
|
+
# Set the port number of the Riakpb endpoint. This must be an integer between 0 and 65535.
|
58
|
+
# @param [Fixnum] value The port number of the Riakpb endpoint
|
51
59
|
# @raise [ArgumentError] if an invalid port number is given
|
52
60
|
# @return [Fixnum] the assigned port number
|
53
61
|
def port=(value)
|
@@ -56,7 +64,7 @@ module Riak
|
|
56
64
|
end
|
57
65
|
|
58
66
|
# 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
|
67
|
+
# @param [String, Fixnum] value The internal client ID used by Riakpb to route responses
|
60
68
|
# @raise [ArgumentError] when an invalid client ID is given
|
61
69
|
# @return [String] the assigned client ID
|
62
70
|
def client_id=(value)
|
@@ -71,13 +79,13 @@ module Riak
|
|
71
79
|
end
|
72
80
|
|
73
81
|
# Establish a connection to the riak node, and store the Rpc instance
|
74
|
-
# @return [
|
82
|
+
# @return [Riakpb::Client::Rpc] the Rpc instance that handles connections to the riak node
|
75
83
|
def rpc(options={})
|
76
84
|
options[:client_id] ||= @client_id if @client_id
|
77
85
|
@rpc ||= Rpc.new(self)
|
78
86
|
end
|
79
87
|
|
80
|
-
# Tests connectivity with the
|
88
|
+
# Tests connectivity with the Riakpb host.
|
81
89
|
# @return [Boolean] Successful returned as 'true', failed connection returned as 'false'
|
82
90
|
def ping?
|
83
91
|
rpc.request Util::MessageCode::PING_REQUEST
|
@@ -88,7 +96,7 @@ module Riak
|
|
88
96
|
# Retrieves basic information from the riak node.
|
89
97
|
# @return [Hash] Returns the name of the node and its software release number
|
90
98
|
def info
|
91
|
-
response = rpc.request
|
99
|
+
response = rpc.request Riakpb::Util::MessageCode::GET_SERVER_INFO_REQUEST
|
92
100
|
|
93
101
|
@node = response.node
|
94
102
|
@server_version = response.server_version
|
@@ -96,21 +104,21 @@ module Riak
|
|
96
104
|
{:node => @node, :server_version => @server_version}
|
97
105
|
end
|
98
106
|
|
99
|
-
# I need bucket! Bring me bucket! (Retrieves a bucket from
|
107
|
+
# I need bucket! Bring me bucket! (Retrieves a bucket from Riakpb. Eating disorder not included.)
|
100
108
|
# @param [String] bucket the bucket to retrieve
|
101
109
|
# @return [Bucket] the requested bucket
|
102
110
|
def bucket(bucket)
|
103
111
|
return(@bucket_cache[bucket]) if @bucket_cache.has_key?(bucket)
|
104
|
-
|
112
|
+
self.bucket!(bucket)
|
105
113
|
end
|
106
114
|
alias :[] :bucket
|
107
115
|
alias :bring_me_bucket :bucket
|
108
116
|
|
109
|
-
# I need bucket! Bring me bucket! (Retrieves a bucket from
|
117
|
+
# I need bucket! Bring me bucket! (Retrieves a bucket from Riakpb, even if it's already been retrieved.)
|
110
118
|
# @param [String] bucket the bucket to retrieve
|
111
119
|
# @return [Bucket] the requested bucket
|
112
120
|
def bucket!(bucket)
|
113
|
-
request =
|
121
|
+
request = Riakpb::RpbGetBucketReq.new(:bucket => bucket)
|
114
122
|
response = rpc.request(
|
115
123
|
Util::MessageCode::GET_BUCKET_REQUEST,
|
116
124
|
request
|
@@ -124,12 +132,12 @@ module Riak
|
|
124
132
|
# @param [RpbBucketProps, Hash] props the properties to be set within the given bucket
|
125
133
|
# @return [TrueClass, FalseClass] whether or not the operation was successful
|
126
134
|
def set_bucket(bucket, props)
|
127
|
-
props =
|
135
|
+
props = Riakpb::RpbBucketProps.new(props) if props.is_a?(Hash)
|
128
136
|
|
129
|
-
raise TypeError.new t('invalid_props') unless props.is_a?(
|
137
|
+
raise TypeError.new t('invalid_props') unless props.is_a?(Riakpb::RpbBucketProps)
|
130
138
|
|
131
139
|
begin
|
132
|
-
request =
|
140
|
+
request = Riakpb::RpbSetBucketReq.new(:bucket => bucket, :props => props)
|
133
141
|
response = rpc.request(
|
134
142
|
Util::MessageCode::SET_BUCKET_REQUEST,
|
135
143
|
request
|
@@ -142,14 +150,20 @@ module Riak
|
|
142
150
|
end
|
143
151
|
end
|
144
152
|
|
145
|
-
# Retrieves a key, using RpbGetReq, from within a given bucket, from
|
153
|
+
# Retrieves a key, using RpbGetReq, from within a given bucket, from Riakpb.
|
146
154
|
# @param [String] bucket the bucket from which to retrieve the key
|
147
155
|
# @param [String] key the name of the key to be received
|
148
156
|
# @param [Fixnum] quorum read quorum- num of replicas need to agree when retrieving the object
|
149
157
|
# @return [RpbGetResp] the response in which the given Key is stored
|
150
158
|
def get_request(bucket, key, quorum=nil)
|
151
|
-
request =
|
152
|
-
|
159
|
+
request = Riakpb::RpbGetReq.new({:bucket => bucket, :key => key})
|
160
|
+
|
161
|
+
quorum ||= @read_quorum
|
162
|
+
unless quorum.blank?
|
163
|
+
quorum = quorum.to_i
|
164
|
+
request.r = quorum
|
165
|
+
end
|
166
|
+
|
153
167
|
|
154
168
|
response = rpc.request(
|
155
169
|
Util::MessageCode::GET_REQUEST,
|
@@ -169,27 +183,27 @@ module Riak
|
|
169
183
|
def put_request(options)
|
170
184
|
raise ArgumentError, t('invalid_bucket') if options[:bucket].empty?
|
171
185
|
raise ArgumentError, t('empty_content') if options[:content].nil?
|
186
|
+
options[:w] ||= @write_quorum unless @write_quorum.nil?
|
187
|
+
options[:dw] ||= @replica_commit unless @replica_commit.nil?
|
188
|
+
options[:return_body] = @return_body unless options.has_key?(:return_body)
|
172
189
|
|
173
|
-
options
|
174
|
-
options[:dw] ||= @dw unless @dw.nil?
|
175
|
-
options[:return_body] ||= true
|
176
|
-
|
177
|
-
request = Riak::RpbPutReq.new(options)
|
190
|
+
request = Riakpb::RpbPutReq.new(options.slice :bucket, :key, :vclock, :content, :w, :dw, :return_body)
|
178
191
|
response = rpc.request(
|
179
192
|
Util::MessageCode::PUT_REQUEST,
|
180
193
|
request
|
181
194
|
)
|
182
195
|
|
196
|
+
return(true) if response == ""
|
183
197
|
return(response)
|
184
198
|
end
|
185
199
|
|
186
|
-
# Deletes a key, using RpbDelReq, from within a given bucket, from
|
200
|
+
# Deletes a key, using RpbDelReq, from within a given bucket, from Riakpb.
|
187
201
|
# @param [String] bucket the bucket from which to delete the key
|
188
202
|
# @param [String] key the name of the key to be deleted
|
189
203
|
# @param [Fixnum] rw how many replicas to delete before returning a successful response
|
190
204
|
# @return [RpbGetResp] the response confirming deletion
|
191
205
|
def del_request(bucket, key, rw=nil)
|
192
|
-
request =
|
206
|
+
request = Riakpb::RpbDelReq.new
|
193
207
|
request.bucket = bucket
|
194
208
|
request.key = key
|
195
209
|
request.rw ||= rw
|
@@ -198,6 +212,9 @@ module Riak
|
|
198
212
|
Util::MessageCode::DEL_REQUEST,
|
199
213
|
request
|
200
214
|
)
|
215
|
+
|
216
|
+
return(true) if response == ""
|
217
|
+
return(response)
|
201
218
|
end
|
202
219
|
|
203
220
|
# Sends a MapReduce operation to riak, using RpbMapRedReq, and returns the Response/phases.
|
@@ -205,7 +222,7 @@ module Riak
|
|
205
222
|
# @param [String] content_type encoding for map/reduce job
|
206
223
|
# @return [RpbMapRedResp] the response, encoded in the same format that was sent
|
207
224
|
def map_reduce_request(mr_request, content_type)
|
208
|
-
request =
|
225
|
+
request = Riakpb::RpbMapRedReq.new
|
209
226
|
request.request = mr_request
|
210
227
|
request.content_type = content_type
|
211
228
|
|
@@ -214,12 +231,12 @@ module Riak
|
|
214
231
|
request
|
215
232
|
)
|
216
233
|
|
217
|
-
|
234
|
+
return(response)
|
218
235
|
end
|
219
236
|
alias :mapred :map_reduce_request
|
220
237
|
alias :mr :map_reduce_request
|
221
238
|
|
222
|
-
# Lists the buckets found in the
|
239
|
+
# Lists the buckets found in the Riakpb database
|
223
240
|
# @raise [ReturnRespError] if the message response does not correlate with the message requested
|
224
241
|
# @return [Array] list of buckets (String)
|
225
242
|
def buckets
|
@@ -229,7 +246,7 @@ module Riak
|
|
229
246
|
@buckets = response.buckets.each{|b| b}
|
230
247
|
end
|
231
248
|
|
232
|
-
# Lists the keys within their respective buckets, that are found in the
|
249
|
+
# Lists the keys within their respective buckets, that are found in the Riakpb database
|
233
250
|
# @param [String] bucket the bucket from which to retrieve the list of keys
|
234
251
|
# @raise [ReturnRespError] if the message response does not correlate with the message requested
|
235
252
|
# @return [Hash] Mapping of the buckets (String) to their keys (Array of Strings)
|
@@ -246,42 +263,11 @@ module Riak
|
|
246
263
|
# "#<Client >"
|
247
264
|
# end
|
248
265
|
|
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
|
-
|
280
266
|
private
|
281
267
|
def b64encode(n)
|
282
268
|
Base64.encode64([n].pack("N")).chomp
|
283
269
|
end
|
284
270
|
|
285
271
|
end # class Client
|
286
|
-
end # module
|
272
|
+
end # module Riakpb
|
287
273
|
|
data/lib/riak/client_pb.rb
CHANGED