better-riak-client 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +16 -0
- data/README.markdown +198 -0
- data/RELEASE_NOTES.md +211 -0
- data/better-riak-client.gemspec +61 -0
- data/erl_src/riak_kv_test014_backend.beam +0 -0
- data/erl_src/riak_kv_test014_backend.erl +189 -0
- data/erl_src/riak_kv_test_backend.beam +0 -0
- data/erl_src/riak_kv_test_backend.erl +697 -0
- data/erl_src/riak_search_test_backend.beam +0 -0
- data/erl_src/riak_search_test_backend.erl +175 -0
- data/lib/riak/bucket.rb +221 -0
- data/lib/riak/client/beefcake/messages.rb +213 -0
- data/lib/riak/client/beefcake/object_methods.rb +111 -0
- data/lib/riak/client/beefcake_protobuffs_backend.rb +226 -0
- data/lib/riak/client/decaying.rb +36 -0
- data/lib/riak/client/excon_backend.rb +162 -0
- data/lib/riak/client/feature_detection.rb +88 -0
- data/lib/riak/client/http_backend/configuration.rb +211 -0
- data/lib/riak/client/http_backend/key_streamer.rb +43 -0
- data/lib/riak/client/http_backend/object_methods.rb +106 -0
- data/lib/riak/client/http_backend/request_headers.rb +34 -0
- data/lib/riak/client/http_backend/transport_methods.rb +201 -0
- data/lib/riak/client/http_backend.rb +340 -0
- data/lib/riak/client/net_http_backend.rb +82 -0
- data/lib/riak/client/node.rb +115 -0
- data/lib/riak/client/protobuffs_backend.rb +173 -0
- data/lib/riak/client/search.rb +91 -0
- data/lib/riak/client.rb +540 -0
- data/lib/riak/cluster.rb +151 -0
- data/lib/riak/core_ext/blank.rb +53 -0
- data/lib/riak/core_ext/deep_dup.rb +13 -0
- data/lib/riak/core_ext/extract_options.rb +7 -0
- data/lib/riak/core_ext/json.rb +15 -0
- data/lib/riak/core_ext/slice.rb +18 -0
- data/lib/riak/core_ext/stringify_keys.rb +10 -0
- data/lib/riak/core_ext/symbolize_keys.rb +10 -0
- data/lib/riak/core_ext/to_param.rb +31 -0
- data/lib/riak/core_ext.rb +7 -0
- data/lib/riak/encoding.rb +6 -0
- data/lib/riak/failed_request.rb +81 -0
- data/lib/riak/i18n.rb +5 -0
- data/lib/riak/json.rb +52 -0
- data/lib/riak/link.rb +94 -0
- data/lib/riak/locale/en.yml +53 -0
- data/lib/riak/locale/fr.yml +52 -0
- data/lib/riak/map_reduce/filter_builder.rb +103 -0
- data/lib/riak/map_reduce/phase.rb +98 -0
- data/lib/riak/map_reduce.rb +225 -0
- data/lib/riak/map_reduce_error.rb +7 -0
- data/lib/riak/node/configuration.rb +293 -0
- data/lib/riak/node/console.rb +133 -0
- data/lib/riak/node/control.rb +207 -0
- data/lib/riak/node/defaults.rb +83 -0
- data/lib/riak/node/generation.rb +106 -0
- data/lib/riak/node/log.rb +34 -0
- data/lib/riak/node/version.rb +43 -0
- data/lib/riak/node.rb +38 -0
- data/lib/riak/robject.rb +318 -0
- data/lib/riak/search.rb +3 -0
- data/lib/riak/serializers.rb +74 -0
- data/lib/riak/stamp.rb +77 -0
- data/lib/riak/test_server.rb +89 -0
- data/lib/riak/util/escape.rb +76 -0
- data/lib/riak/util/headers.rb +53 -0
- data/lib/riak/util/multipart/stream_parser.rb +62 -0
- data/lib/riak/util/multipart.rb +52 -0
- data/lib/riak/util/tcp_socket_extensions.rb +58 -0
- data/lib/riak/util/translation.rb +19 -0
- data/lib/riak/version.rb +3 -0
- data/lib/riak/walk_spec.rb +105 -0
- data/lib/riak.rb +21 -0
- metadata +348 -0
Binary file
|
@@ -0,0 +1,175 @@
|
|
1
|
+
%% -------------------------------------------------------------------
|
2
|
+
%%
|
3
|
+
%% Copyright (c) 2007-2010 Basho Technologies, Inc. All Rights Reserved.
|
4
|
+
%%
|
5
|
+
%% -------------------------------------------------------------------
|
6
|
+
|
7
|
+
-module(riak_search_test_backend).
|
8
|
+
-behavior(riak_search_backend).
|
9
|
+
|
10
|
+
-export([
|
11
|
+
reset/0,
|
12
|
+
start/2,
|
13
|
+
stop/1,
|
14
|
+
index/2,
|
15
|
+
delete/2,
|
16
|
+
stream/6,
|
17
|
+
range/8,
|
18
|
+
info/5,
|
19
|
+
fold/3,
|
20
|
+
is_empty/1,
|
21
|
+
drop/1
|
22
|
+
]).
|
23
|
+
-export([
|
24
|
+
stream_results/3
|
25
|
+
]).
|
26
|
+
|
27
|
+
-include_lib("riak_search/include/riak_search.hrl").
|
28
|
+
-define(T(P), list_to_atom("rs" ++ integer_to_list(P))).
|
29
|
+
-record(state, {partition, table}).
|
30
|
+
|
31
|
+
reset() ->
|
32
|
+
{ok, Ring} = riak_core_ring_manager:get_my_ring(),
|
33
|
+
[ catch ets:delete_all_objects(?T(P)) ||
|
34
|
+
P <- riak_core_ring:my_indices(Ring) ],
|
35
|
+
riak_search_config:clear(),
|
36
|
+
ok.
|
37
|
+
|
38
|
+
start(Partition, _Config) ->
|
39
|
+
Table = ets:new(?T(Partition),
|
40
|
+
[named_table, public, ordered_set]),
|
41
|
+
{ok, #state{partition=Partition, table=Table}}.
|
42
|
+
|
43
|
+
stop(State) ->
|
44
|
+
maybe_delete(State).
|
45
|
+
|
46
|
+
index(IFTVPKList, #state{table=Table}=State) ->
|
47
|
+
lists:foreach(
|
48
|
+
fun({I, F, T, V, P, K}) ->
|
49
|
+
Key = {b(I), b(F), b(T), b(V)},
|
50
|
+
case ets:lookup(Table, Key) of
|
51
|
+
[{_, _, ExistingKeyClock}] ->
|
52
|
+
if ExistingKeyClock > K ->
|
53
|
+
%% stored data is newer
|
54
|
+
ok;
|
55
|
+
true ->
|
56
|
+
%% stored data is older
|
57
|
+
ets:update_element(Table, Key,
|
58
|
+
[{2, P},{3, K}])
|
59
|
+
end;
|
60
|
+
[] ->
|
61
|
+
ets:insert(Table, {Key, P, K})
|
62
|
+
end
|
63
|
+
end,
|
64
|
+
IFTVPKList),
|
65
|
+
{reply, {indexed, node()}, State}.
|
66
|
+
|
67
|
+
delete(IFTVKList, State) ->
|
68
|
+
Table = State#state.table,
|
69
|
+
lists:foreach(fun(IFTVK) -> delete_fun(IFTVK, Table) end, IFTVKList),
|
70
|
+
{reply, {deleted, node()}, State}.
|
71
|
+
|
72
|
+
delete_fun({I, F, T, V, K}, Table) ->
|
73
|
+
Key = {b(I), b(F), b(T), b(V)},
|
74
|
+
case ets:lookup(Table, Key) of
|
75
|
+
[{Key, _Props, ExistingKeyClock}] ->
|
76
|
+
if ExistingKeyClock > K ->
|
77
|
+
%% stored data is newer
|
78
|
+
ok;
|
79
|
+
true ->
|
80
|
+
%% stored data is older
|
81
|
+
ets:delete(Table, Key)
|
82
|
+
end;
|
83
|
+
[] ->
|
84
|
+
ok
|
85
|
+
end;
|
86
|
+
delete_fun({I, F, T, V, _P, K}, Table) ->
|
87
|
+
%% copied idea from merge_index_backend
|
88
|
+
%% other operations include Props, though delete shouldn't
|
89
|
+
delete_fun({I, F, T, V, K}, Table).
|
90
|
+
|
91
|
+
info(Index, Field, Term, Sender, State) ->
|
92
|
+
Count = ets:select_count(State#state.table,
|
93
|
+
[{{{b(Index), b(Field), b(Term), '_'},
|
94
|
+
'_', '_'},
|
95
|
+
[],[true]}]),
|
96
|
+
riak_search_backend:info_response(Sender, [{Term, node(), Count}]),
|
97
|
+
noreply.
|
98
|
+
|
99
|
+
-define(STREAM_SIZE, 100).
|
100
|
+
|
101
|
+
range(Index, Field, StartTerm, EndTerm, _Size, FilterFun, Sender, State) ->
|
102
|
+
ST = b(StartTerm),
|
103
|
+
ET = b(EndTerm),
|
104
|
+
spawn(riak_search_ets_backend, stream_results,
|
105
|
+
[Sender,
|
106
|
+
FilterFun,
|
107
|
+
ets:select(State#state.table,
|
108
|
+
[{{{b(Index), b(Field), '$1', '$2'}, '$3', '_'},
|
109
|
+
[{'>=', '$1', ST}, {'=<', '$1', ET}],
|
110
|
+
[{{'$2', '$3'}}]}],
|
111
|
+
?STREAM_SIZE)]),
|
112
|
+
noreply.
|
113
|
+
|
114
|
+
stream(Index, Field, Term, FilterFun, Sender, State) ->
|
115
|
+
spawn(riak_search_ets_backend, stream_results,
|
116
|
+
[Sender,
|
117
|
+
FilterFun,
|
118
|
+
ets:select(State#state.table,
|
119
|
+
[{{{b(Index), b(Field), b(Term), '$1'}, '$2', '_'},
|
120
|
+
[], [{{'$1', '$2'}}]}],
|
121
|
+
?STREAM_SIZE)]),
|
122
|
+
noreply.
|
123
|
+
|
124
|
+
stream_results(Sender, FilterFun, {Results0, Continuation}) ->
|
125
|
+
case lists:filter(fun({V,P}) -> FilterFun(V, P) end, Results0) of
|
126
|
+
[] ->
|
127
|
+
ok;
|
128
|
+
Results ->
|
129
|
+
riak_search_backend:response_results(Sender, Results)
|
130
|
+
end,
|
131
|
+
stream_results(Sender, FilterFun, ets:select(Continuation));
|
132
|
+
stream_results(Sender, _, '$end_of_table') ->
|
133
|
+
riak_search_backend:response_done(Sender).
|
134
|
+
|
135
|
+
fold(FoldFun, Acc, State) ->
|
136
|
+
Fun = fun({{I,F,T,V},P,K}, {OuterAcc, {{I,{F,T}},InnerAcc}}) ->
|
137
|
+
%% same IFT, just accumulate doc/props/clock
|
138
|
+
{OuterAcc, {{I,{F,T}},[{V,P,K}|InnerAcc]}};
|
139
|
+
({{I,F,T,V},P,K}, {OuterAcc, {FoldKey, VPKList}}) ->
|
140
|
+
%% finished a string of IFT, send it off
|
141
|
+
%% (sorted order is assumed)
|
142
|
+
NewOuterAcc = FoldFun(FoldKey, VPKList, OuterAcc),
|
143
|
+
{NewOuterAcc, {{I,{F,T}},[{V,P,K}]}};
|
144
|
+
({{I,F,T,V},P,K}, {OuterAcc, undefined}) ->
|
145
|
+
%% first round through the fold - just start building
|
146
|
+
{OuterAcc, {{I,{F,T}},[{V,P,K}]}}
|
147
|
+
end,
|
148
|
+
{OuterAcc0, Final} = ets:foldl(Fun, {Acc, undefined}, State#state.table),
|
149
|
+
OuterAcc = case Final of
|
150
|
+
{FoldKey, VPKList} ->
|
151
|
+
%% one last IFT to send off
|
152
|
+
FoldFun(FoldKey, VPKList, OuterAcc0);
|
153
|
+
undefined ->
|
154
|
+
%% this partition was empty
|
155
|
+
OuterAcc0
|
156
|
+
end,
|
157
|
+
{reply, OuterAcc, State}.
|
158
|
+
|
159
|
+
is_empty(State) ->
|
160
|
+
0 == ets:info(State#state.table, size).
|
161
|
+
|
162
|
+
drop(State) ->
|
163
|
+
maybe_delete(State).
|
164
|
+
|
165
|
+
maybe_delete(State) ->
|
166
|
+
case lists:member(State#state.table, ets:all()) of
|
167
|
+
true ->
|
168
|
+
ets:delete(State#state.table),
|
169
|
+
ok;
|
170
|
+
false ->
|
171
|
+
ok
|
172
|
+
end.
|
173
|
+
|
174
|
+
b(Binary) when is_binary(Binary) -> Binary;
|
175
|
+
b(List) when is_list(List) -> iolist_to_binary(List).
|
data/lib/riak/bucket.rb
ADDED
@@ -0,0 +1,221 @@
|
|
1
|
+
require 'riak/util/translation'
|
2
|
+
require 'riak/client'
|
3
|
+
require 'riak/robject'
|
4
|
+
require 'riak/failed_request'
|
5
|
+
|
6
|
+
module Riak
|
7
|
+
# Represents and encapsulates operations on a Riak bucket. You may retrieve a bucket
|
8
|
+
# using {Client#bucket}, or create it manually and retrieve its meta-information later.
|
9
|
+
class Bucket
|
10
|
+
include Util::Translation
|
11
|
+
|
12
|
+
# (Riak Search) The precommit specification for kv/search integration
|
13
|
+
SEARCH_PRECOMMIT_HOOK = {"mod" => "riak_search_kv_hook", "fun" => "precommit"}
|
14
|
+
|
15
|
+
# @return [Riak::Client] the associated client
|
16
|
+
attr_reader :client
|
17
|
+
|
18
|
+
# @return [String] the bucket name
|
19
|
+
attr_reader :name
|
20
|
+
|
21
|
+
# Create a Riak bucket manually.
|
22
|
+
# @param [Client] client the {Riak::Client} for this bucket
|
23
|
+
# @param [String] name the name of the bucket
|
24
|
+
def initialize(client, name)
|
25
|
+
raise ArgumentError, t("client_type", :client => client.inspect) unless Client === client
|
26
|
+
raise ArgumentError, t("string_type", :string => name.inspect) unless String === name
|
27
|
+
@client, @name = client, name
|
28
|
+
end
|
29
|
+
|
30
|
+
# Retrieves a list of keys in this bucket.
|
31
|
+
# If a block is given, keys will be streamed through
|
32
|
+
# the block (useful for large buckets). When streaming,
|
33
|
+
# results of the operation will not be returned to the caller.
|
34
|
+
# @yield [Array<String>] a list of keys from the current chunk
|
35
|
+
# @return [Array<String>] Keys in this bucket
|
36
|
+
# @note This operation has serious performance implications and
|
37
|
+
# should not be used in production applications.
|
38
|
+
def keys(&block)
|
39
|
+
warn(t('list_keys', :backtrace => caller.join("\n "))) unless Riak.disable_list_keys_warnings
|
40
|
+
if block_given?
|
41
|
+
@client.list_keys(self, &block)
|
42
|
+
else
|
43
|
+
@client.list_keys(self)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Sets internal properties on the bucket
|
48
|
+
# Note: this results in a request to the Riak server!
|
49
|
+
# @param [Hash] properties new properties for the bucket
|
50
|
+
# @option properties [Fixnum] :n_val (3) The N value (replication factor)
|
51
|
+
# @option properties [true,false] :allow_mult (false) Whether to permit object siblings
|
52
|
+
# @option properties [true,false] :last_write_wins (false) Whether to ignore vclocks
|
53
|
+
# @option properties [Array<Hash>] :precommit ([]) precommit hooks
|
54
|
+
# @option properties [Array<Hash>] :postcommit ([])postcommit hooks
|
55
|
+
# @option properties [Fixnum,String] :r ("quorum") read quorum (numeric or
|
56
|
+
# symbolic)
|
57
|
+
# @option properties [Fixnum,String] :w ("quorum") write quorum (numeric or
|
58
|
+
# symbolic)
|
59
|
+
# @option properties [Fixnum,String] :dw ("quorum") durable write quorum
|
60
|
+
# (numeric or symbolic)
|
61
|
+
# @option properties [Fixnum,String] :rw ("quorum") delete quorum (numeric or
|
62
|
+
# symbolic)
|
63
|
+
# @return [Hash] the merged bucket properties
|
64
|
+
# @raise [FailedRequest] if the new properties were not accepted by the Riakserver
|
65
|
+
# @see #n_value, #allow_mult, #r, #w, #dw, #rw
|
66
|
+
def props=(properties)
|
67
|
+
raise ArgumentError, t("hash_type", :hash => properties.inspect) unless Hash === properties
|
68
|
+
props.merge!(properties)
|
69
|
+
@client.set_bucket_props(self, properties)
|
70
|
+
props
|
71
|
+
end
|
72
|
+
alias :'properties=' :'props='
|
73
|
+
|
74
|
+
# @return [Hash] Internal Riak bucket properties.
|
75
|
+
# @see #props=
|
76
|
+
def props
|
77
|
+
@props ||= @client.get_bucket_props(self)
|
78
|
+
end
|
79
|
+
alias :properties :props
|
80
|
+
|
81
|
+
# Retrieve an object from within the bucket.
|
82
|
+
# @param [String] key the key of the object to retrieve
|
83
|
+
# @param [Hash] options query parameters for the request
|
84
|
+
# @option options [Fixnum] :r - the read quorum for the request - how many nodes should concur on the read
|
85
|
+
# @return [Riak::RObject] the object
|
86
|
+
# @raise [FailedRequest] if the object is not found or some other error occurs
|
87
|
+
def get(key, options={})
|
88
|
+
@client.get_object(self, key, options)
|
89
|
+
end
|
90
|
+
alias :[] :get
|
91
|
+
|
92
|
+
# Create a new blank object
|
93
|
+
# @param [String] key the key of the new object
|
94
|
+
# @return [RObject] the new, unsaved object
|
95
|
+
def new(key=nil)
|
96
|
+
RObject.new(self, key).tap do |obj|
|
97
|
+
obj.content_type = "application/json"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Fetches an object if it exists, otherwise creates a new one with the given key
|
102
|
+
# @param [String] key the key to fetch or create
|
103
|
+
# @return [RObject] the new or existing object
|
104
|
+
def get_or_new(key, options={})
|
105
|
+
begin
|
106
|
+
get(key, options)
|
107
|
+
rescue Riak::FailedRequest => fr
|
108
|
+
if fr.not_found?
|
109
|
+
new(key)
|
110
|
+
else
|
111
|
+
raise fr
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# Checks whether an object exists in Riak.
|
117
|
+
# @param [String] key the key to check
|
118
|
+
# @param [Hash] options quorum options
|
119
|
+
# @option options [Fixnum] :r - the read quorum value for the request (R)
|
120
|
+
# @return [true, false] whether the key exists in this bucket
|
121
|
+
def exists?(key, options={})
|
122
|
+
begin
|
123
|
+
get(key, options)
|
124
|
+
true
|
125
|
+
rescue Riak::FailedRequest
|
126
|
+
false
|
127
|
+
end
|
128
|
+
end
|
129
|
+
alias :exist? :exists?
|
130
|
+
|
131
|
+
# Deletes a key from the bucket
|
132
|
+
# @param [String] key the key to delete
|
133
|
+
# @param [Hash] options quorum options
|
134
|
+
# @option options [Fixnum] :rw - the read/write quorum for the
|
135
|
+
# delete
|
136
|
+
# @option options [String] :vclock - the vector clock of the
|
137
|
+
# object being deleted
|
138
|
+
def delete(key, options={})
|
139
|
+
client.delete_object(self, key, options)
|
140
|
+
end
|
141
|
+
|
142
|
+
# Queries a secondary index on the bucket.
|
143
|
+
# @note This will only work if your Riak installation supports 2I.
|
144
|
+
# @param [String] index the name of the index
|
145
|
+
# @param [String,Integer,Range] query the value of the index, or a
|
146
|
+
# Range of values to query
|
147
|
+
# @return [Array<String>] a list of keys that match the index
|
148
|
+
# query
|
149
|
+
def get_index(index, query)
|
150
|
+
client.get_index(self, index, query)
|
151
|
+
end
|
152
|
+
|
153
|
+
# @return [true, false] whether the bucket allows divergent siblings
|
154
|
+
def allow_mult
|
155
|
+
props['allow_mult']
|
156
|
+
end
|
157
|
+
|
158
|
+
# Set the allow_mult property. *NOTE* This will result in a PUT request to Riak.
|
159
|
+
# @param [true, false] value whether the bucket should allow siblings
|
160
|
+
def allow_mult=(value)
|
161
|
+
self.props = {'allow_mult' => value}
|
162
|
+
value
|
163
|
+
end
|
164
|
+
|
165
|
+
# @return [Fixnum] the N value, or number of replicas for this bucket
|
166
|
+
def n_value
|
167
|
+
props['n_val']
|
168
|
+
end
|
169
|
+
alias :n_val :n_value
|
170
|
+
|
171
|
+
# Set the N value (number of replicas). *NOTE* This will result in a PUT request to Riak.
|
172
|
+
# Setting this value after the bucket has objects stored in it may have unpredictable results.
|
173
|
+
# @param [Fixnum] value the number of replicas the bucket should keep of each object
|
174
|
+
def n_value=(value)
|
175
|
+
self.props = {'n_val' => value}
|
176
|
+
value
|
177
|
+
end
|
178
|
+
alias :'n_val=' :'n_value='
|
179
|
+
|
180
|
+
%w(r w dw rw).each do |q|
|
181
|
+
define_method(q) { props[q] }
|
182
|
+
define_method("#{q}=") { |value|
|
183
|
+
self.props = { q => value }
|
184
|
+
value
|
185
|
+
}
|
186
|
+
end
|
187
|
+
|
188
|
+
# (Riak Search) Installs a precommit hook that automatically indexes objects
|
189
|
+
# into riak_search.
|
190
|
+
def enable_index!
|
191
|
+
unless is_indexed?
|
192
|
+
self.props = {"precommit" => (props['precommit'] + [SEARCH_PRECOMMIT_HOOK]), "search" => true}
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
# (Riak Search) Removes the precommit hook that automatically indexes objects
|
197
|
+
# into riak_search.
|
198
|
+
def disable_index!
|
199
|
+
if is_indexed?
|
200
|
+
self.props = {"precommit" => (props['precommit'] - [SEARCH_PRECOMMIT_HOOK]), "search" => false}
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
# (Riak Search) Detects whether the bucket is automatically indexed into
|
205
|
+
# riak_search.
|
206
|
+
# @return [true,false] whether the bucket includes the search indexing hook
|
207
|
+
def is_indexed?
|
208
|
+
props['search'] == true || props['precommit'].include?(SEARCH_PRECOMMIT_HOOK)
|
209
|
+
end
|
210
|
+
|
211
|
+
# @return [String] a representation suitable for IRB and debugging output
|
212
|
+
def inspect
|
213
|
+
"#<Riak::Bucket {#{name}}#{" keys=[#{keys.join(',')}]" if defined?(@keys)}>"
|
214
|
+
end
|
215
|
+
|
216
|
+
# @return [true,false] whether the other is equivalent
|
217
|
+
def ==(other)
|
218
|
+
Bucket === other && other.client == client && other.name == name
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
@@ -0,0 +1,213 @@
|
|
1
|
+
require 'beefcake'
|
2
|
+
|
3
|
+
module Riak
|
4
|
+
class Client
|
5
|
+
# @private
|
6
|
+
class BeefcakeProtobuffsBackend
|
7
|
+
# Embedded messages
|
8
|
+
class RpbPair
|
9
|
+
include Beefcake::Message
|
10
|
+
required :key, :bytes, 1
|
11
|
+
optional :value, :bytes, 2
|
12
|
+
end
|
13
|
+
|
14
|
+
class RpbBucketProps
|
15
|
+
include Beefcake::Message
|
16
|
+
optional :n_val, :uint32, 1
|
17
|
+
optional :allow_mult, :bool, 2
|
18
|
+
end
|
19
|
+
|
20
|
+
class RpbLink
|
21
|
+
include Beefcake::Message
|
22
|
+
optional :bucket, :bytes, 1
|
23
|
+
optional :key, :bytes, 2
|
24
|
+
optional :tag, :bytes, 3
|
25
|
+
end
|
26
|
+
|
27
|
+
class RpbContent
|
28
|
+
include Beefcake::Message
|
29
|
+
required :value, :bytes, 1
|
30
|
+
optional :content_type, :bytes, 2
|
31
|
+
optional :charset, :bytes, 3
|
32
|
+
optional :content_encoding, :bytes, 4
|
33
|
+
optional :vtag, :bytes, 5
|
34
|
+
repeated :links, RpbLink, 6
|
35
|
+
optional :last_mod, :uint32, 7
|
36
|
+
optional :last_mod_usecs, :uint32, 8
|
37
|
+
repeated :usermeta, RpbPair, 9
|
38
|
+
repeated :indexes, RpbPair, 10
|
39
|
+
end
|
40
|
+
|
41
|
+
# Primary messages
|
42
|
+
class RpbErrorResp
|
43
|
+
include Beefcake::Message
|
44
|
+
required :errmsg, :bytes, 1
|
45
|
+
required :errcode, :uint32, 2
|
46
|
+
end
|
47
|
+
|
48
|
+
class RpbGetClientIdResp
|
49
|
+
include Beefcake::Message
|
50
|
+
required :client_id, :bytes, 1
|
51
|
+
end
|
52
|
+
|
53
|
+
class RpbSetClientIdReq
|
54
|
+
include Beefcake::Message
|
55
|
+
required :client_id, :bytes, 1
|
56
|
+
end
|
57
|
+
|
58
|
+
class RpbGetServerInfoResp
|
59
|
+
include Beefcake::Message
|
60
|
+
optional :node, :bytes, 1
|
61
|
+
optional :server_version, :bytes, 2
|
62
|
+
end
|
63
|
+
|
64
|
+
class RpbGetReq
|
65
|
+
include Beefcake::Message
|
66
|
+
required :bucket, :bytes, 1
|
67
|
+
required :key, :bytes, 2
|
68
|
+
optional :r, :uint32, 3
|
69
|
+
optional :pr, :uint32, 4
|
70
|
+
optional :basic_quorum, :bool, 5
|
71
|
+
optional :notfound_ok, :bool, 6
|
72
|
+
optional :if_modified, :bytes, 7
|
73
|
+
optional :head, :bool, 8
|
74
|
+
optional :deletedvclock, :bool, 9
|
75
|
+
end
|
76
|
+
|
77
|
+
class RpbGetResp
|
78
|
+
include Beefcake::Message
|
79
|
+
repeated :content, RpbContent, 1
|
80
|
+
optional :vclock, :bytes, 2
|
81
|
+
optional :unchanged, :bool, 3
|
82
|
+
end
|
83
|
+
|
84
|
+
class RpbPutReq
|
85
|
+
include Beefcake::Message
|
86
|
+
required :bucket, :bytes, 1
|
87
|
+
optional :key, :bytes, 2
|
88
|
+
optional :vclock, :bytes, 3
|
89
|
+
required :content, RpbContent, 4
|
90
|
+
optional :w, :uint32, 5
|
91
|
+
optional :dw, :uint32, 6
|
92
|
+
optional :returnbody, :bool, 7
|
93
|
+
optional :pw, :uint32, 8
|
94
|
+
optional :if_not_modified, :bool, 9
|
95
|
+
optional :if_none_match, :bool, 10
|
96
|
+
optional :return_head, :bool, 11
|
97
|
+
end
|
98
|
+
|
99
|
+
class RpbPutResp
|
100
|
+
include Beefcake::Message
|
101
|
+
repeated :content, RpbContent, 1
|
102
|
+
optional :vclock, :bytes, 2
|
103
|
+
optional :key, :bytes, 3
|
104
|
+
end
|
105
|
+
|
106
|
+
class RpbDelReq
|
107
|
+
include Beefcake::Message
|
108
|
+
required :bucket, :bytes, 1
|
109
|
+
required :key, :bytes, 2
|
110
|
+
optional :rw, :uint32, 3
|
111
|
+
optional :vclock, :bytes, 4
|
112
|
+
optional :r, :uint32, 5
|
113
|
+
optional :w, :uint32, 6
|
114
|
+
optional :pr, :uint32, 7
|
115
|
+
optional :pw, :uint32, 8
|
116
|
+
optional :dw, :uint32, 9
|
117
|
+
end
|
118
|
+
|
119
|
+
class RpbListBucketsResp
|
120
|
+
include Beefcake::Message
|
121
|
+
repeated :buckets, :bytes, 1
|
122
|
+
end
|
123
|
+
|
124
|
+
class RpbListKeysReq
|
125
|
+
include Beefcake::Message
|
126
|
+
required :bucket, :bytes, 1
|
127
|
+
end
|
128
|
+
|
129
|
+
class RpbListKeysResp
|
130
|
+
include Beefcake::Message
|
131
|
+
repeated :keys, :bytes, 1
|
132
|
+
optional :done, :bool, 2
|
133
|
+
end
|
134
|
+
|
135
|
+
class RpbGetBucketReq
|
136
|
+
include Beefcake::Message
|
137
|
+
required :bucket, :bytes, 1
|
138
|
+
end
|
139
|
+
|
140
|
+
class RpbGetBucketResp
|
141
|
+
include Beefcake::Message
|
142
|
+
required :props, RpbBucketProps, 1
|
143
|
+
end
|
144
|
+
|
145
|
+
class RpbSetBucketReq
|
146
|
+
include Beefcake::Message
|
147
|
+
required :bucket, :bytes, 1
|
148
|
+
required :props, RpbBucketProps, 2
|
149
|
+
end
|
150
|
+
|
151
|
+
class RpbMapRedReq
|
152
|
+
include Beefcake::Message
|
153
|
+
required :request, :bytes, 1
|
154
|
+
required :content_type, :bytes, 2
|
155
|
+
end
|
156
|
+
|
157
|
+
class RpbMapRedResp
|
158
|
+
include Beefcake::Message
|
159
|
+
optional :phase, :uint32, 1
|
160
|
+
optional :response, :bytes, 2
|
161
|
+
optional :done, :bool, 3
|
162
|
+
end
|
163
|
+
|
164
|
+
class RpbIndexReq
|
165
|
+
include Beefcake::Message
|
166
|
+
module IndexQueryType
|
167
|
+
EQ = 0
|
168
|
+
RANGE = 1
|
169
|
+
end
|
170
|
+
|
171
|
+
required :bucket, :bytes, 1
|
172
|
+
required :index, :bytes, 2
|
173
|
+
required :qtype, IndexQueryType, 3
|
174
|
+
optional :key, :bytes, 4
|
175
|
+
optional :range_min, :bytes, 5
|
176
|
+
optional :range_max, :bytes, 6
|
177
|
+
end
|
178
|
+
|
179
|
+
class RpbIndexResp
|
180
|
+
include Beefcake::Message
|
181
|
+
repeated :keys, :bytes, 1
|
182
|
+
end
|
183
|
+
|
184
|
+
class RpbSearchDoc
|
185
|
+
include Beefcake::Message
|
186
|
+
# We have to name this differently than the .proto file does
|
187
|
+
# because Beefcake uses 'fields' as an instance method.
|
188
|
+
repeated :properties, RpbPair, 1
|
189
|
+
end
|
190
|
+
|
191
|
+
class RpbSearchQueryReq
|
192
|
+
include Beefcake::Message
|
193
|
+
required :q, :bytes, 1
|
194
|
+
required :index, :bytes, 2
|
195
|
+
optional :rows, :uint32, 3
|
196
|
+
optional :start, :uint32, 4
|
197
|
+
optional :sort, :bytes, 5
|
198
|
+
optional :filter, :bytes, 6
|
199
|
+
optional :df, :bytes, 7
|
200
|
+
optional :op, :bytes, 8
|
201
|
+
repeated :fl, :bytes, 9
|
202
|
+
optional :presort, :bytes, 10
|
203
|
+
end
|
204
|
+
|
205
|
+
class RpbSearchQueryResp
|
206
|
+
include Beefcake::Message
|
207
|
+
repeated :docs, RpbSearchDoc, 1, :default => []
|
208
|
+
optional :max_score, :float, 2
|
209
|
+
optional :num_found, :uint32, 3
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|