riak-client 0.9.0.beta → 0.9.0.beta2
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/Gemfile +10 -7
- data/Rakefile +21 -3
- data/erl_src/riak_kv_test_backend.beam +0 -0
- data/erl_src/riak_kv_test_backend.erl +29 -13
- data/lib/riak/bucket.rb +1 -1
- data/lib/riak/cache_store.rb +1 -1
- data/lib/riak/client.rb +119 -8
- data/lib/riak/client/beefcake/messages.rb +162 -0
- data/lib/riak/client/beefcake/object_methods.rb +92 -0
- data/lib/riak/client/beefcake_protobuffs_backend.rb +186 -0
- data/lib/riak/client/curb_backend.rb +10 -16
- data/lib/riak/client/excon_backend.rb +14 -18
- data/lib/riak/client/http_backend.rb +13 -13
- data/lib/riak/client/http_backend/object_methods.rb +1 -1
- data/lib/riak/client/http_backend/transport_methods.rb +6 -2
- data/lib/riak/client/net_http_backend.rb +33 -20
- data/lib/riak/client/protobuffs_backend.rb +103 -0
- data/lib/riak/client/pump.rb +44 -0
- data/lib/riak/failed_request.rb +58 -3
- data/lib/riak/locale/en.yml +11 -3
- data/lib/riak/map_reduce.rb +15 -6
- data/lib/riak/map_reduce/filter_builder.rb +4 -4
- data/lib/riak/test_server.rb +5 -1
- data/lib/riak/util/multipart.rb +30 -16
- data/lib/riak/util/multipart/stream_parser.rb +74 -0
- data/riak-client.gemspec +14 -12
- data/spec/fixtures/server.cert.crt +15 -0
- data/spec/fixtures/server.cert.key +15 -0
- data/spec/fixtures/test.pem +1 -0
- data/spec/integration/riak/http_backends_spec.rb +45 -0
- data/spec/integration/riak/protobuffs_backends_spec.rb +45 -0
- data/spec/integration/riak/test_server_spec.rb +2 -2
- data/spec/riak/bucket_spec.rb +4 -4
- data/spec/riak/client_spec.rb +209 -3
- data/spec/riak/excon_backend_spec.rb +8 -7
- data/spec/riak/http_backend/configuration_spec.rb +64 -0
- data/spec/riak/http_backend/object_methods_spec.rb +1 -1
- data/spec/riak/http_backend/transport_methods_spec.rb +129 -0
- data/spec/riak/http_backend_spec.rb +13 -1
- data/spec/riak/map_reduce/filter_builder_spec.rb +45 -0
- data/spec/riak/map_reduce/phase_spec.rb +149 -0
- data/spec/riak/map_reduce_spec.rb +5 -5
- data/spec/riak/net_http_backend_spec.rb +1 -0
- data/spec/riak/{object_spec.rb → robject_spec.rb} +1 -1
- data/spec/riak/stream_parser_spec.rb +66 -0
- data/spec/support/drb_mock_server.rb +2 -2
- data/spec/support/http_backend_implementation_examples.rb +27 -0
- data/spec/support/mock_server.rb +22 -1
- data/spec/support/unified_backend_examples.rb +255 -0
- metadata +43 -54
data/Gemfile
CHANGED
@@ -1,22 +1,25 @@
|
|
1
|
-
source :
|
1
|
+
source :rubygems
|
2
2
|
|
3
3
|
gem 'i18n'
|
4
4
|
gem 'builder'
|
5
|
-
gem 'rspec', "~>2.
|
5
|
+
gem 'rspec', "~>2.4.0"
|
6
6
|
gem 'fakeweb', ">=1.2"
|
7
7
|
gem 'rack', '>=1.0'
|
8
8
|
gem 'rake'
|
9
9
|
gem 'bundler'
|
10
|
-
gem 'excon', "~>0.
|
10
|
+
gem 'excon', "~>0.5.7"
|
11
|
+
gem 'beefcake', '~>0.2.0'
|
11
12
|
|
12
|
-
|
13
|
-
gem 'json'
|
14
|
-
gem 'jruby-openssl'
|
15
|
-
else
|
13
|
+
platforms :mri do
|
16
14
|
gem 'curb', '>=0.6'
|
17
15
|
gem 'yajl-ruby'
|
18
16
|
end
|
19
17
|
|
18
|
+
platforms :jruby do
|
19
|
+
gem 'json'
|
20
|
+
gem 'jruby-openssl'
|
21
|
+
end
|
22
|
+
|
20
23
|
group :integration do
|
21
24
|
gem 'activesupport', '~>3.0'
|
22
25
|
end
|
data/Rakefile
CHANGED
@@ -9,13 +9,14 @@ gemspec = Gem::Specification.new do |gem|
|
|
9
9
|
gem.email = "sean@basho.com"
|
10
10
|
gem.homepage = "http://seancribbs.github.com/ripple"
|
11
11
|
gem.authors = ["Sean Cribbs"]
|
12
|
-
gem.add_development_dependency "rspec", "~>2.
|
12
|
+
gem.add_development_dependency "rspec", "~>2.4.0"
|
13
13
|
gem.add_development_dependency "fakeweb", ">=1.2"
|
14
14
|
gem.add_development_dependency "rack", ">=1.0"
|
15
15
|
gem.add_development_dependency "curb", ">=0.6"
|
16
|
-
gem.add_development_dependency "excon", "~>0.
|
16
|
+
gem.add_development_dependency "excon", "~>0.5.7"
|
17
17
|
gem.add_dependency "i18n", ">=0.4.0"
|
18
18
|
gem.add_dependency "builder", "~>2.1.2"
|
19
|
+
gem.add_dependency "beefcake", "~>0.2.0"
|
19
20
|
|
20
21
|
gem.files = %W{
|
21
22
|
erl_src/riak_kv_test_backend.beam
|
@@ -24,6 +25,9 @@ gemspec = Gem::Specification.new do |gem|
|
|
24
25
|
lib/active_support/cache/riak_store.rb
|
25
26
|
lib/riak/bucket.rb
|
26
27
|
lib/riak/cache_store.rb
|
28
|
+
lib/riak/client/beefcake/messages.rb
|
29
|
+
lib/riak/client/beefcake/object_methods.rb
|
30
|
+
lib/riak/client/beefcake_protobuffs_backend.rb
|
27
31
|
lib/riak/client/curb_backend.rb
|
28
32
|
lib/riak/client/excon_backend.rb
|
29
33
|
lib/riak/client/http_backend/configuration.rb
|
@@ -32,6 +36,8 @@ gemspec = Gem::Specification.new do |gem|
|
|
32
36
|
lib/riak/client/http_backend/transport_methods.rb
|
33
37
|
lib/riak/client/http_backend.rb
|
34
38
|
lib/riak/client/net_http_backend.rb
|
39
|
+
lib/riak/client/protobuffs_backend.rb
|
40
|
+
lib/riak/client/pump.rb
|
35
41
|
lib/riak/client.rb
|
36
42
|
lib/riak/core_ext/blank.rb
|
37
43
|
lib/riak/core_ext/extract_options.rb
|
@@ -56,6 +62,7 @@ gemspec = Gem::Specification.new do |gem|
|
|
56
62
|
lib/riak/util/escape.rb
|
57
63
|
lib/riak/util/fiber1.8.rb
|
58
64
|
lib/riak/util/headers.rb
|
65
|
+
lib/riak/util/multipart/stream_parser.rb
|
59
66
|
lib/riak/util/multipart.rb
|
60
67
|
lib/riak/util/tcp_socket_extensions.rb
|
61
68
|
lib/riak/util/translation.rb
|
@@ -66,7 +73,12 @@ gemspec = Gem::Specification.new do |gem|
|
|
66
73
|
spec/fixtures/cat.jpg
|
67
74
|
spec/fixtures/multipart-blank.txt
|
68
75
|
spec/fixtures/multipart-with-body.txt
|
76
|
+
spec/fixtures/server.cert.crt
|
77
|
+
spec/fixtures/server.cert.key
|
78
|
+
spec/fixtures/test.pem
|
69
79
|
spec/integration/riak/cache_store_spec.rb
|
80
|
+
spec/integration/riak/http_backends_spec.rb
|
81
|
+
spec/integration/riak/protobuffs_backends_spec.rb
|
70
82
|
spec/integration/riak/test_server_spec.rb
|
71
83
|
spec/riak/bucket_spec.rb
|
72
84
|
spec/riak/client_spec.rb
|
@@ -74,14 +86,19 @@ gemspec = Gem::Specification.new do |gem|
|
|
74
86
|
spec/riak/escape_spec.rb
|
75
87
|
spec/riak/excon_backend_spec.rb
|
76
88
|
spec/riak/headers_spec.rb
|
89
|
+
spec/riak/http_backend/configuration_spec.rb
|
77
90
|
spec/riak/http_backend/object_methods_spec.rb
|
91
|
+
spec/riak/http_backend/transport_methods_spec.rb
|
78
92
|
spec/riak/http_backend_spec.rb
|
79
93
|
spec/riak/link_spec.rb
|
94
|
+
spec/riak/map_reduce/filter_builder_spec.rb
|
95
|
+
spec/riak/map_reduce/phase_spec.rb
|
80
96
|
spec/riak/map_reduce_spec.rb
|
81
97
|
spec/riak/multipart_spec.rb
|
82
98
|
spec/riak/net_http_backend_spec.rb
|
83
|
-
spec/riak/
|
99
|
+
spec/riak/robject_spec.rb
|
84
100
|
spec/riak/search_spec.rb
|
101
|
+
spec/riak/stream_parser_spec.rb
|
85
102
|
spec/riak/walk_spec_spec.rb
|
86
103
|
spec/spec_helper.rb
|
87
104
|
spec/support/drb_mock_server.rb
|
@@ -89,6 +106,7 @@ gemspec = Gem::Specification.new do |gem|
|
|
89
106
|
spec/support/mock_server.rb
|
90
107
|
spec/support/mocks.rb
|
91
108
|
spec/support/test_server.yml.example
|
109
|
+
spec/support/unified_backend_examples.rb
|
92
110
|
}
|
93
111
|
|
94
112
|
gem.test_files = gem.files.grep(/_spec\.rb$/)
|
Binary file
|
@@ -20,7 +20,8 @@
|
|
20
20
|
%%
|
21
21
|
%% -------------------------------------------------------------------
|
22
22
|
|
23
|
-
% @doc riak_kv_test_backend is a Riak storage backend using ets that
|
23
|
+
% @doc riak_kv_test_backend is a Riak storage backend using ets that
|
24
|
+
% exposes a reset function for efficiently clearing stored data.
|
24
25
|
|
25
26
|
-module(riak_kv_test_backend).
|
26
27
|
-behavior(riak_kv_backend).
|
@@ -34,29 +35,47 @@
|
|
34
35
|
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
35
36
|
terminate/2, code_change/3]).
|
36
37
|
|
38
|
+
|
37
39
|
% @type state() = term().
|
38
|
-
-record(state, {t}).
|
40
|
+
-record(state, {t, p}).
|
39
41
|
|
40
42
|
% @spec start(Partition :: integer(), Config :: proplist()) ->
|
41
43
|
% {ok, state()} | {{error, Reason :: term()}, state()}
|
42
44
|
start(Partition, _Config) ->
|
43
45
|
gen_server:start_link(?MODULE, [Partition], []).
|
44
46
|
|
45
|
-
% @spec reset() -> ok
|
47
|
+
% @spec reset() -> ok | {error, timeout}
|
46
48
|
reset() ->
|
47
|
-
Pids = lists:
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
Pids = lists:foldl(fun(Item, Acc) ->
|
50
|
+
case lists:prefix("test_backend", atom_to_list(Item)) of
|
51
|
+
true -> [whereis(Item)|Acc];
|
52
|
+
_ -> Acc
|
53
|
+
end
|
54
|
+
end, [], registered()),
|
55
|
+
[gen_server:cast(Pid,{reset, self()})|| Pid <- Pids],
|
56
|
+
receive_reset(Pids).
|
57
|
+
|
58
|
+
receive_reset([]) -> ok;
|
59
|
+
receive_reset(Pids) ->
|
60
|
+
receive
|
61
|
+
{reset, Pid} ->
|
62
|
+
receive_reset(lists:delete(Pid, Pids))
|
63
|
+
after 1000 ->
|
64
|
+
{error, timeout}
|
65
|
+
end.
|
52
66
|
|
53
67
|
%% @private
|
54
68
|
init([Partition]) ->
|
55
69
|
PName = list_to_atom("test_backend" ++ integer_to_list(Partition)),
|
70
|
+
P = list_to_atom(integer_to_list(Partition)),
|
56
71
|
register(PName, self()),
|
57
|
-
{ok, #state{t=ets:new(
|
72
|
+
{ok, #state{t=ets:new(P,[]), p=P}}.
|
58
73
|
|
59
74
|
%% @private
|
75
|
+
handle_cast({reset,From}, State) ->
|
76
|
+
ets:delete_all_objects(State#state.t),
|
77
|
+
From ! {reset, self()},
|
78
|
+
{noreply, State};
|
60
79
|
handle_cast(_, State) -> {noreply, State}.
|
61
80
|
|
62
81
|
%% @private
|
@@ -76,10 +95,7 @@ handle_call(drop, _From, State) ->
|
|
76
95
|
handle_call({fold, Fun0, Acc}, _From, State) ->
|
77
96
|
Fun = fun({{B,K}, V}, AccIn) -> Fun0({B,K}, V, AccIn) end,
|
78
97
|
Reply = ets:foldl(Fun, Acc, State#state.t),
|
79
|
-
{reply, Reply, State}
|
80
|
-
handle_call(reset, _From, State) ->
|
81
|
-
ets:delete_all_objects(State#state.t),
|
82
|
-
{reply, ok, State}.
|
98
|
+
{reply, Reply, State}.
|
83
99
|
|
84
100
|
% @spec stop(state()) -> ok | {error, Reason :: term()}
|
85
101
|
stop(SrvRef) -> gen_server:call(SrvRef,stop).
|
data/lib/riak/bucket.rb
CHANGED
data/lib/riak/cache_store.rb
CHANGED
data/lib/riak/client.rb
CHANGED
@@ -14,6 +14,7 @@
|
|
14
14
|
require 'riak'
|
15
15
|
require 'tempfile'
|
16
16
|
require 'delegate'
|
17
|
+
require 'riak/failed_request'
|
17
18
|
|
18
19
|
module Riak
|
19
20
|
# A client connection to Riak.
|
@@ -21,26 +22,45 @@ module Riak
|
|
21
22
|
include Util::Translation
|
22
23
|
include Util::Escape
|
23
24
|
|
25
|
+
autoload :Pump, "riak/client/pump"
|
24
26
|
autoload :HTTPBackend, "riak/client/http_backend"
|
25
27
|
autoload :NetHTTPBackend, "riak/client/net_http_backend"
|
26
28
|
autoload :CurbBackend, "riak/client/curb_backend"
|
27
29
|
autoload :ExconBackend, "riak/client/excon_backend"
|
28
30
|
|
31
|
+
autoload :ProtobuffsBackend, "riak/client/protobuffs_backend"
|
32
|
+
autoload :BeefcakeProtobuffsBackend, "riak/client/beefcake_protobuffs_backend"
|
33
|
+
|
29
34
|
# When using integer client IDs, the exclusive upper-bound of valid values.
|
30
35
|
MAX_CLIENT_ID = 4294967296
|
31
36
|
|
37
|
+
# Array of valid protocols
|
38
|
+
PROTOCOLS = %w[http https pbc]
|
39
|
+
|
32
40
|
# Regexp for validating hostnames, lifted from uri.rb in Ruby 1.8.6
|
33
41
|
HOST_REGEX = /^(?:(?:(?:[a-zA-Z\d](?:[-a-zA-Z\d]*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:[-a-zA-Z\d]*[a-zA-Z\d])?)\.?|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\[(?:(?:[a-fA-F\d]{1,4}:)*(?:[a-fA-F\d]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|(?:(?:[a-fA-F\d]{1,4}:)*[a-fA-F\d]{1,4})?::(?:(?:[a-fA-F\d]{1,4}:)*(?:[a-fA-F\d]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))?)\])$/n
|
34
42
|
|
43
|
+
# @return [String] The protocol to use for the Riak endpoint
|
44
|
+
attr_reader :protocol
|
45
|
+
|
35
46
|
# @return [String] The host or IP address for the Riak endpoint
|
36
47
|
attr_reader :host
|
37
48
|
|
38
49
|
# @return [Fixnum] The port of the Riak HTTP endpoint
|
39
50
|
attr_reader :port
|
40
51
|
|
52
|
+
# @return [String] The user:pass for http basic authentication
|
53
|
+
attr_reader :basic_auth
|
54
|
+
|
41
55
|
# @return [String] The internal client ID used by Riak to route responses
|
42
56
|
attr_reader :client_id
|
43
57
|
|
58
|
+
# @return [Hash|nil] The SSL options that get built when using SSL
|
59
|
+
attr_reader :ssl_options
|
60
|
+
|
61
|
+
# @return [Hash|nil] The writer that will build valid SSL options from the provided config
|
62
|
+
attr_writer :ssl
|
63
|
+
|
44
64
|
# @return [String] The URL path prefix to the "raw" HTTP endpoint
|
45
65
|
attr_accessor :prefix
|
46
66
|
|
@@ -53,6 +73,9 @@ module Riak
|
|
53
73
|
# @return [Symbol] The HTTP backend/client to use
|
54
74
|
attr_accessor :http_backend
|
55
75
|
|
76
|
+
# @return [Symbol] The Protocol Buffers backend/client to use
|
77
|
+
attr_accessor :protobuffs_backend
|
78
|
+
|
56
79
|
# Creates a client connection to Riak
|
57
80
|
# @param [Hash] options configuration options for the client
|
58
81
|
# @option options [String] :host ('127.0.0.1') The host or IP address for the Riak endpoint
|
@@ -61,19 +84,23 @@ module Riak
|
|
61
84
|
# @option options [String] :mapred ('/mapred') The path to the map-reduce HTTP endpoint
|
62
85
|
# @option options [Fixnum, String] :client_id (rand(MAX_CLIENT_ID)) The internal client ID used by Riak to route responses
|
63
86
|
# @option options [String, Symbol] :http_backend (:NetHTTP) which HTTP backend to use
|
64
|
-
# @
|
87
|
+
# @option options [String, Symbol] :protobuffs_backend (:Beefcake) which Protocol Buffers backend to use
|
88
|
+
# @raise [ArgumentError] raised if any invalid options are given
|
65
89
|
def initialize(options={})
|
66
|
-
unless (options.keys - [:host, :port, :prefix, :client_id, :mapred, :luwak, :http_backend]).empty?
|
67
|
-
raise ArgumentError, "invalid options"
|
90
|
+
unless (options.keys - [:protocol, :host, :port, :prefix, :client_id, :mapred, :luwak, :http_backend, :protobuffs_backend, :ssl, :basic_auth]).empty?
|
91
|
+
raise ArgumentError, t("invalid options")
|
68
92
|
end
|
93
|
+
self.ssl = options[:ssl]
|
94
|
+
self.protocol = options[:protocol] || "http"
|
69
95
|
self.host = options[:host] || "127.0.0.1"
|
70
|
-
self.port = options[:port] || 8098
|
96
|
+
self.port = options[:port] || ((protocol == "pbc") ? 8087 : 8098)
|
71
97
|
self.client_id = options[:client_id] || make_client_id
|
72
98
|
self.prefix = options[:prefix] || "/riak/"
|
73
99
|
self.mapred = options[:mapred] || "/mapred"
|
74
100
|
self.luwak = options[:luwak] || "/luwak"
|
75
101
|
self.http_backend = options[:http_backend] || :NetHTTP
|
76
|
-
|
102
|
+
self.protobuffs_backend = options[:protobuffs_backend] || :Beefcake
|
103
|
+
self.basic_auth = options[:basic_auth] if options[:basic_auth]
|
77
104
|
end
|
78
105
|
|
79
106
|
# Set the client ID for this client. Must be a string or Fixnum value 0 =< value < MAX_CLIENT_ID.
|
@@ -91,6 +118,19 @@ module Riak
|
|
91
118
|
end
|
92
119
|
end
|
93
120
|
|
121
|
+
# Set the protocol of the Riak endpoint. Value must be in the
|
122
|
+
# Riak::Client::PROTOCOLS array.
|
123
|
+
# @raise [ArgumentError] if the protocol is not in PROTOCOLS
|
124
|
+
# @return [String] the protocol being assigned
|
125
|
+
def protocol=(value)
|
126
|
+
unless PROTOCOLS.include?(value.to_s)
|
127
|
+
raise ArgumentError, t("protocol_invalid", :invalid => value, :valid => PROTOCOLS.join(', '))
|
128
|
+
end
|
129
|
+
@ssl_options ||= {} if value === 'https'
|
130
|
+
@backend = nil
|
131
|
+
@protocol = value
|
132
|
+
end
|
133
|
+
|
94
134
|
# Set the hostname of the Riak endpoint. Must be an IPv4, IPv6, or valid hostname
|
95
135
|
# @param [String] value The host or IP address for the Riak endpoint
|
96
136
|
# @raise [ArgumentError] if an invalid hostname is given
|
@@ -109,12 +149,34 @@ module Riak
|
|
109
149
|
@port = value
|
110
150
|
end
|
111
151
|
|
152
|
+
def basic_auth=(value)
|
153
|
+
raise ArgumentError, t("invalid_basic_auth") unless value.to_s.split(':').length === 2
|
154
|
+
@basic_auth = value
|
155
|
+
end
|
156
|
+
|
112
157
|
# Sets the desired HTTP backend
|
113
158
|
def http_backend=(value)
|
114
|
-
@http = nil
|
159
|
+
@http, @backend = nil, nil
|
115
160
|
@http_backend = value
|
116
161
|
end
|
117
162
|
|
163
|
+
# Sets the desired Protocol Buffers backend
|
164
|
+
def protobuffs_backend=(value)
|
165
|
+
@protobuffs, @backend = nil, nil
|
166
|
+
@protobuffs_backend = value
|
167
|
+
end
|
168
|
+
|
169
|
+
# Enables or disables SSL on the client to be utilized by the HTTP Backends
|
170
|
+
def ssl=(value)
|
171
|
+
@ssl_options = Hash === value ? value : {}
|
172
|
+
value ? ssl_enable : ssl_disable
|
173
|
+
end
|
174
|
+
|
175
|
+
# Checks if the current protocol is https
|
176
|
+
def ssl_enabled?
|
177
|
+
protocol === 'https'
|
178
|
+
end
|
179
|
+
|
118
180
|
# Automatically detects and returns an appropriate HTTP backend.
|
119
181
|
# The HTTP backend is used internally by the Riak client, but can also
|
120
182
|
# be used to access the server directly.
|
@@ -130,7 +192,41 @@ module Riak
|
|
130
192
|
end
|
131
193
|
end
|
132
194
|
|
133
|
-
|
195
|
+
# Automatically detects and returns an appropriate Protocol
|
196
|
+
# Buffers backend. The Protocol Buffers backend is used
|
197
|
+
# internally by the Riak client but can also be used to access the
|
198
|
+
# server directly.
|
199
|
+
# @return [ProtobuffsBackend] the Protocol Buffers backend for
|
200
|
+
# this client
|
201
|
+
def protobuffs
|
202
|
+
@protobuffs ||= begin
|
203
|
+
klass = self.class.const_get("#{@protobuffs_backend}ProtobuffsBackend")
|
204
|
+
if klass.configured?
|
205
|
+
klass.new(self)
|
206
|
+
else
|
207
|
+
raise t('protobuffs_configuration', :backend => @protobuffs_backend)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# Returns a backend for operations that are protocol-independent.
|
213
|
+
# You can change which type of backend is used by setting the
|
214
|
+
# {#protocol}.
|
215
|
+
# @return [HTTPBackend,ProtobuffsBackend] an appropriate client backend
|
216
|
+
def backend
|
217
|
+
@backend ||= case @protocol.to_s
|
218
|
+
when /https?/i
|
219
|
+
http
|
220
|
+
when /pbc/i
|
221
|
+
protobuffs
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
# Pings the Riak server to check for liveness.
|
226
|
+
# @return [true,false] whether the Riak server is alive and reachable
|
227
|
+
def ping
|
228
|
+
backend.ping
|
229
|
+
end
|
134
230
|
|
135
231
|
# Retrieves a bucket from Riak.
|
136
232
|
# @param [String] bucket the bucket to retrieve
|
@@ -228,7 +324,7 @@ module Riak
|
|
228
324
|
|
229
325
|
# @return [String] A representation suitable for IRB and debugging output.
|
230
326
|
def inspect
|
231
|
-
"#<Riak::Client #{
|
327
|
+
"#<Riak::Client #{protocol}://#{host}:#{port}>"
|
232
328
|
end
|
233
329
|
|
234
330
|
private
|
@@ -240,6 +336,21 @@ module Riak
|
|
240
336
|
Base64.encode64([n].pack("N")).chomp
|
241
337
|
end
|
242
338
|
|
339
|
+
def ssl_enable
|
340
|
+
self.protocol = 'https'
|
341
|
+
@ssl_options[:pem] = File.read(@ssl_options[:pem_file]) if @ssl_options[:pem_file]
|
342
|
+
@ssl_options[:verify_mode] ||= "peer" if @ssl_options.stringify_keys.any? {|k,v| %w[pem ca_file ca_path].include?(k)}
|
343
|
+
@ssl_options[:verify_mode] ||= "none"
|
344
|
+
raise ArgumentError.new unless %w[none peer].include?(@ssl_options[:verify_mode])
|
345
|
+
|
346
|
+
@ssl_options
|
347
|
+
end
|
348
|
+
|
349
|
+
def ssl_disable
|
350
|
+
self.protocol = 'http'
|
351
|
+
@ssl_options = nil
|
352
|
+
end
|
353
|
+
|
243
354
|
# @private
|
244
355
|
class LuwakFile < DelegateClass(Tempfile)
|
245
356
|
attr_accessor :original_filename, :content_type
|
@@ -0,0 +1,162 @@
|
|
1
|
+
# Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
require 'riak'
|
15
|
+
require 'riak/link'
|
16
|
+
require 'beefcake'
|
17
|
+
|
18
|
+
module Riak
|
19
|
+
class Client
|
20
|
+
# @private
|
21
|
+
class BeefcakeProtobuffsBackend
|
22
|
+
# Embedded messages
|
23
|
+
class RpbPair
|
24
|
+
include Beefcake::Message
|
25
|
+
required :key, :bytes, 1
|
26
|
+
optional :value, :bytes, 2
|
27
|
+
end
|
28
|
+
|
29
|
+
class RpbBucketProps
|
30
|
+
include Beefcake::Message
|
31
|
+
optional :n_val, :uint32, 1
|
32
|
+
optional :allow_mult, :bool, 2
|
33
|
+
end
|
34
|
+
|
35
|
+
class RpbLink
|
36
|
+
include Beefcake::Message
|
37
|
+
optional :bucket, :bytes, 1
|
38
|
+
optional :key, :bytes, 2
|
39
|
+
optional :tag, :bytes, 3
|
40
|
+
end
|
41
|
+
|
42
|
+
class RpbContent
|
43
|
+
include Beefcake::Message
|
44
|
+
required :value, :bytes, 1
|
45
|
+
optional :content_type, :bytes, 2
|
46
|
+
optional :charset, :bytes, 3
|
47
|
+
optional :content_encoding, :bytes, 4
|
48
|
+
optional :vtag, :bytes, 5
|
49
|
+
repeated :links, RpbLink, 6
|
50
|
+
optional :last_mod, :uint32, 7
|
51
|
+
optional :last_mod_usecs, :uint32, 8
|
52
|
+
repeated :usermeta, RpbPair, 9
|
53
|
+
end
|
54
|
+
|
55
|
+
# Primary messages
|
56
|
+
class RpbErrorResp
|
57
|
+
include Beefcake::Message
|
58
|
+
required :errmsg, :bytes, 1
|
59
|
+
required :errcode, :uint32, 2
|
60
|
+
end
|
61
|
+
|
62
|
+
class RpbGetClientIdResp
|
63
|
+
include Beefcake::Message
|
64
|
+
required :client_id, :bytes, 1
|
65
|
+
end
|
66
|
+
|
67
|
+
class RpbSetClientIdReq
|
68
|
+
include Beefcake::Message
|
69
|
+
required :client_id, :bytes, 1
|
70
|
+
end
|
71
|
+
|
72
|
+
class RpbGetServerInfoResp
|
73
|
+
include Beefcake::Message
|
74
|
+
optional :node, :bytes, 1
|
75
|
+
optional :server_version, :bytes, 2
|
76
|
+
end
|
77
|
+
|
78
|
+
class RpbGetReq
|
79
|
+
include Beefcake::Message
|
80
|
+
required :bucket, :bytes, 1
|
81
|
+
required :key, :bytes, 2
|
82
|
+
optional :r, :uint32, 3
|
83
|
+
end
|
84
|
+
|
85
|
+
class RpbGetResp
|
86
|
+
include Beefcake::Message
|
87
|
+
repeated :content, RpbContent, 1
|
88
|
+
optional :vclock, :bytes, 2
|
89
|
+
end
|
90
|
+
|
91
|
+
class RpbPutReq
|
92
|
+
include Beefcake::Message
|
93
|
+
required :bucket, :bytes, 1
|
94
|
+
required :key, :bytes, 2
|
95
|
+
optional :vclock, :bytes, 3
|
96
|
+
required :content, RpbContent, 4
|
97
|
+
optional :w, :uint32, 5
|
98
|
+
optional :dw, :uint32, 6
|
99
|
+
optional :return_body, :bool, 7
|
100
|
+
end
|
101
|
+
|
102
|
+
# Optional since it has the same structure as GetResp
|
103
|
+
# class RpbPutResp
|
104
|
+
# include Beefcake::Message
|
105
|
+
# repeated :content, RpbContent, 1
|
106
|
+
# optional :vclock, :bytes, 2
|
107
|
+
# end
|
108
|
+
|
109
|
+
class RpbDelReq
|
110
|
+
include Beefcake::Message
|
111
|
+
required :bucket, :bytes, 1
|
112
|
+
required :key, :bytes, 2
|
113
|
+
optional :rw, :uint32, 3
|
114
|
+
end
|
115
|
+
|
116
|
+
class RpbListBucketsResp
|
117
|
+
include Beefcake::Message
|
118
|
+
repeated :buckets, :bytes, 1
|
119
|
+
end
|
120
|
+
|
121
|
+
class RpbListKeysReq
|
122
|
+
include Beefcake::Message
|
123
|
+
required :bucket, :bytes, 1
|
124
|
+
end
|
125
|
+
|
126
|
+
class RpbListKeysResp
|
127
|
+
include Beefcake::Message
|
128
|
+
repeated :keys, :bytes, 1
|
129
|
+
optional :done, :bool, 2
|
130
|
+
end
|
131
|
+
|
132
|
+
class RpbGetBucketReq
|
133
|
+
include Beefcake::Message
|
134
|
+
required :bucket, :bytes, 1
|
135
|
+
end
|
136
|
+
|
137
|
+
class RpbGetBucketResp
|
138
|
+
include Beefcake::Message
|
139
|
+
required :props, RpbBucketProps, 1
|
140
|
+
end
|
141
|
+
|
142
|
+
class RpbSetBucketReq
|
143
|
+
include Beefcake::Message
|
144
|
+
required :bucket, :bytes, 1
|
145
|
+
required :props, RpbBucketProps, 2
|
146
|
+
end
|
147
|
+
|
148
|
+
class RpbMapRedReq
|
149
|
+
include Beefcake::Message
|
150
|
+
required :request, :bytes, 1
|
151
|
+
required :content_type, :bytes, 2
|
152
|
+
end
|
153
|
+
|
154
|
+
class RpbMapRedResp
|
155
|
+
include Beefcake::Message
|
156
|
+
optional :phase, :uint32, 1
|
157
|
+
optional :response, :bytes, 2
|
158
|
+
optional :done, :bool, 3
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|