couchbase 3.5.3-arm64-darwin
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +202 -0
- data/README.md +154 -0
- data/ext/extconf.rb +0 -0
- data/lib/active_support/cache/couchbase_store.rb +342 -0
- data/lib/couchbase/3.1/libcouchbase.bundle +0 -0
- data/lib/couchbase/3.2/libcouchbase.bundle +0 -0
- data/lib/couchbase/3.3/libcouchbase.bundle +0 -0
- data/lib/couchbase/analytics_options.rb +109 -0
- data/lib/couchbase/authenticator.rb +66 -0
- data/lib/couchbase/binary_collection.rb +130 -0
- data/lib/couchbase/binary_collection_options.rb +26 -0
- data/lib/couchbase/bucket.rb +146 -0
- data/lib/couchbase/cluster.rb +462 -0
- data/lib/couchbase/cluster_registry.rb +49 -0
- data/lib/couchbase/collection.rb +707 -0
- data/lib/couchbase/collection_options.rb +401 -0
- data/lib/couchbase/config_profiles.rb +57 -0
- data/lib/couchbase/configuration.rb +58 -0
- data/lib/couchbase/datastructures/couchbase_list.rb +160 -0
- data/lib/couchbase/datastructures/couchbase_map.rb +194 -0
- data/lib/couchbase/datastructures/couchbase_queue.rb +134 -0
- data/lib/couchbase/datastructures/couchbase_set.rb +128 -0
- data/lib/couchbase/datastructures.rb +26 -0
- data/lib/couchbase/diagnostics.rb +183 -0
- data/lib/couchbase/errors.rb +414 -0
- data/lib/couchbase/json_transcoder.rb +41 -0
- data/lib/couchbase/key_value_scan.rb +119 -0
- data/lib/couchbase/libcouchbase.rb +6 -0
- data/lib/couchbase/logger.rb +87 -0
- data/lib/couchbase/management/analytics_index_manager.rb +1129 -0
- data/lib/couchbase/management/bucket_manager.rb +445 -0
- data/lib/couchbase/management/collection_manager.rb +472 -0
- data/lib/couchbase/management/collection_query_index_manager.rb +224 -0
- data/lib/couchbase/management/query_index_manager.rb +619 -0
- data/lib/couchbase/management/scope_search_index_manager.rb +200 -0
- data/lib/couchbase/management/search_index_manager.rb +426 -0
- data/lib/couchbase/management/user_manager.rb +470 -0
- data/lib/couchbase/management/view_index_manager.rb +239 -0
- data/lib/couchbase/management.rb +31 -0
- data/lib/couchbase/mutation_state.rb +65 -0
- data/lib/couchbase/options.rb +2846 -0
- data/lib/couchbase/protostellar/binary_collection.rb +55 -0
- data/lib/couchbase/protostellar/bucket.rb +55 -0
- data/lib/couchbase/protostellar/client.rb +99 -0
- data/lib/couchbase/protostellar/cluster.rb +171 -0
- data/lib/couchbase/protostellar/collection.rb +152 -0
- data/lib/couchbase/protostellar/connect_options.rb +63 -0
- data/lib/couchbase/protostellar/error_handling.rb +203 -0
- data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_pb.rb +61 -0
- data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_services_pb.rb +35 -0
- data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_pb.rb +57 -0
- data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_services_pb.rb +36 -0
- data/lib/couchbase/protostellar/generated/admin/query/v1/query_pb.rb +61 -0
- data/lib/couchbase/protostellar/generated/admin/query/v1/query_services_pb.rb +37 -0
- data/lib/couchbase/protostellar/generated/admin/search/v1/search_pb.rb +72 -0
- data/lib/couchbase/protostellar/generated/admin/search/v1/search_services_pb.rb +44 -0
- data/lib/couchbase/protostellar/generated/analytics/v1/analytics_pb.rb +52 -0
- data/lib/couchbase/protostellar/generated/analytics/v1/analytics_services_pb.rb +30 -0
- data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_pb.rb +70 -0
- data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_services_pb.rb +36 -0
- data/lib/couchbase/protostellar/generated/kv/v1/kv_pb.rb +97 -0
- data/lib/couchbase/protostellar/generated/kv/v1/kv_services_pb.rb +46 -0
- data/lib/couchbase/protostellar/generated/query/v1/query_pb.rb +57 -0
- data/lib/couchbase/protostellar/generated/query/v1/query_services_pb.rb +30 -0
- data/lib/couchbase/protostellar/generated/routing/v1/routing_pb.rb +52 -0
- data/lib/couchbase/protostellar/generated/routing/v1/routing_services_pb.rb +30 -0
- data/lib/couchbase/protostellar/generated/search/v1/search_pb.rb +99 -0
- data/lib/couchbase/protostellar/generated/search/v1/search_services_pb.rb +30 -0
- data/lib/couchbase/protostellar/generated/transactions/v1/transactions_pb.rb +57 -0
- data/lib/couchbase/protostellar/generated/transactions/v1/transactions_services_pb.rb +36 -0
- data/lib/couchbase/protostellar/generated/view/v1/view_pb.rb +51 -0
- data/lib/couchbase/protostellar/generated/view/v1/view_services_pb.rb +30 -0
- data/lib/couchbase/protostellar/generated.rb +9 -0
- data/lib/couchbase/protostellar/management/bucket_manager.rb +67 -0
- data/lib/couchbase/protostellar/management/collection_manager.rb +94 -0
- data/lib/couchbase/protostellar/management/collection_query_index_manager.rb +124 -0
- data/lib/couchbase/protostellar/management/query_index_manager.rb +112 -0
- data/lib/couchbase/protostellar/management.rb +24 -0
- data/lib/couchbase/protostellar/request.rb +78 -0
- data/lib/couchbase/protostellar/request_behaviour.rb +42 -0
- data/lib/couchbase/protostellar/request_generator/admin/bucket.rb +124 -0
- data/lib/couchbase/protostellar/request_generator/admin/collection.rb +94 -0
- data/lib/couchbase/protostellar/request_generator/admin/query.rb +130 -0
- data/lib/couchbase/protostellar/request_generator/admin.rb +24 -0
- data/lib/couchbase/protostellar/request_generator/kv.rb +474 -0
- data/lib/couchbase/protostellar/request_generator/query.rb +133 -0
- data/lib/couchbase/protostellar/request_generator/search.rb +387 -0
- data/lib/couchbase/protostellar/request_generator.rb +26 -0
- data/lib/couchbase/protostellar/response_converter/admin/bucket.rb +55 -0
- data/lib/couchbase/protostellar/response_converter/admin/collection.rb +42 -0
- data/lib/couchbase/protostellar/response_converter/admin/query.rb +59 -0
- data/lib/couchbase/protostellar/response_converter/admin.rb +24 -0
- data/lib/couchbase/protostellar/response_converter/kv.rb +151 -0
- data/lib/couchbase/protostellar/response_converter/query.rb +84 -0
- data/lib/couchbase/protostellar/response_converter/search.rb +136 -0
- data/lib/couchbase/protostellar/response_converter.rb +26 -0
- data/lib/couchbase/protostellar/retry/action.rb +38 -0
- data/lib/couchbase/protostellar/retry/orchestrator.rb +60 -0
- data/lib/couchbase/protostellar/retry/reason.rb +67 -0
- data/lib/couchbase/protostellar/retry/strategies/best_effort.rb +49 -0
- data/lib/couchbase/protostellar/retry/strategies.rb +26 -0
- data/lib/couchbase/protostellar/retry.rb +28 -0
- data/lib/couchbase/protostellar/scope.rb +57 -0
- data/lib/couchbase/protostellar/timeout_defaults.rb +30 -0
- data/lib/couchbase/protostellar/timeouts.rb +83 -0
- data/lib/couchbase/protostellar.rb +29 -0
- data/lib/couchbase/query_options.rb +122 -0
- data/lib/couchbase/railtie.rb +47 -0
- data/lib/couchbase/raw_binary_transcoder.rb +39 -0
- data/lib/couchbase/raw_json_transcoder.rb +40 -0
- data/lib/couchbase/raw_string_transcoder.rb +42 -0
- data/lib/couchbase/scope.rb +258 -0
- data/lib/couchbase/search_options.rb +1650 -0
- data/lib/couchbase/subdoc.rb +293 -0
- data/lib/couchbase/transcoder_flags.rb +64 -0
- data/lib/couchbase/utils/generic_logger_adapter.rb +40 -0
- data/lib/couchbase/utils/stdlib_logger_adapter.rb +67 -0
- data/lib/couchbase/utils/time.rb +71 -0
- data/lib/couchbase/utils.rb +23 -0
- data/lib/couchbase/version.rb +25 -0
- data/lib/couchbase/view_options.rb +67 -0
- data/lib/couchbase.rb +30 -0
- data/lib/rails/generators/couchbase/config/config_generator.rb +29 -0
- metadata +190 -0
@@ -0,0 +1,124 @@
|
|
1
|
+
# Copyright 2023. Couchbase, 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
|
+
|
15
|
+
# frozen_string_literal: true
|
16
|
+
|
17
|
+
require "couchbase/management/query_index_manager"
|
18
|
+
|
19
|
+
require_relative "../request_generator/admin/query"
|
20
|
+
require_relative "../response_converter/admin/query"
|
21
|
+
|
22
|
+
module Couchbase
|
23
|
+
module Protostellar
|
24
|
+
module Management
|
25
|
+
class CollectionQueryIndexManager
|
26
|
+
def initialize(client:, bucket_name:, scope_name:, collection_name:)
|
27
|
+
@client = client
|
28
|
+
@bucket_name = bucket_name
|
29
|
+
@scope_name = scope_name
|
30
|
+
@collection_name = collection_name
|
31
|
+
@request_generator = RequestGenerator::Admin::Query.new(
|
32
|
+
bucket_name: @bucket_name, scope_name: @scope_name, collection_name: @collection_name
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_all_indexes(options = Couchbase::Management::Options::Query::GetAllIndexes.new)
|
37
|
+
validate_options(options)
|
38
|
+
|
39
|
+
req = @request_generator.get_all_indexes_request(options)
|
40
|
+
resp = @client.send_request(req)
|
41
|
+
ResponseConverter::Admin::Query.to_query_index_array(resp)
|
42
|
+
end
|
43
|
+
|
44
|
+
def create_index(index_name, fields, options = Couchbase::Management::Options::Query::CreateIndex.new)
|
45
|
+
validate_options(options)
|
46
|
+
|
47
|
+
req = @request_generator.create_index_request(index_name, fields, options)
|
48
|
+
@client.send_request(req)
|
49
|
+
end
|
50
|
+
|
51
|
+
def create_primary_index(options = Couchbase::Management::Options::Query::CreatePrimaryIndex.new)
|
52
|
+
validate_options(options)
|
53
|
+
|
54
|
+
req = @request_generator.create_primary_index_request(options)
|
55
|
+
@client.send_request(req)
|
56
|
+
end
|
57
|
+
|
58
|
+
def drop_index(index_name, options = Couchbase::Management::Options::Query::DropIndex.new)
|
59
|
+
validate_options(options)
|
60
|
+
|
61
|
+
req = @request_generator.drop_index_request(index_name, options)
|
62
|
+
@client.send_request(req)
|
63
|
+
end
|
64
|
+
|
65
|
+
def drop_primary_index(options = Couchbase::Management::Options::Query::DropPrimaryIndex.new)
|
66
|
+
validate_options(options)
|
67
|
+
|
68
|
+
req = @request_generator.drop_primary_index_request(options)
|
69
|
+
@client.send_request(req)
|
70
|
+
end
|
71
|
+
|
72
|
+
def build_deferred_indexes(options = Couchbase::Management::Options::Query::BuildDeferredIndexes.new)
|
73
|
+
validate_options(options)
|
74
|
+
|
75
|
+
req = @request_generator.build_deferred_indexes_request(options)
|
76
|
+
@client.send_request(req)
|
77
|
+
end
|
78
|
+
|
79
|
+
def watch_indexes(index_names, timeout, options = Couchbase::Management::Options::Query::WatchIndexes.new)
|
80
|
+
validate_options(options)
|
81
|
+
|
82
|
+
# TODO: Will this be implemented in the gateway instead?
|
83
|
+
|
84
|
+
index_names.append("#primary") if options.watch_primary
|
85
|
+
|
86
|
+
interval_millis = 50
|
87
|
+
deadline = Time.now + (Utils::Time.extract_duration(timeout) * 0.001)
|
88
|
+
|
89
|
+
while Time.now <= deadline
|
90
|
+
get_all_opts = Couchbase::Management::Options::Query::GetAllIndexes.new(timeout: ((deadline - Time.now) * 1000).round)
|
91
|
+
indexes = get_all_indexes(get_all_opts).select { |idx| index_names.include? idx.name }
|
92
|
+
indexes_not_found = index_names - indexes.map(&:name)
|
93
|
+
unless indexes_not_found.empty?
|
94
|
+
raise Couchbase::Error::IndexNotFound,
|
95
|
+
"Failed to find the indexes: #{indexes_not_found.join(', ')}"
|
96
|
+
end
|
97
|
+
|
98
|
+
all_online = indexes.all? { |idx| idx.state == :online }
|
99
|
+
return if all_online
|
100
|
+
|
101
|
+
sleep(interval_millis / 1000)
|
102
|
+
interval_millis += 500
|
103
|
+
interval_millis = 1000 if interval_millis > 1000
|
104
|
+
end
|
105
|
+
raise Couchbase::Error::UnambiguousTimeout, "Failed to find all indexes online within the allotted time"
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def validate_options(options)
|
111
|
+
unless options.scope_name.nil?
|
112
|
+
raise Couchbase::Error::InvalidArgument,
|
113
|
+
"Scope name cannot be set in the options when using the Query Index manager at the collection level"
|
114
|
+
end
|
115
|
+
|
116
|
+
return if options.collection_name.nil?
|
117
|
+
|
118
|
+
raise Couchbase::Error::InvalidArgument,
|
119
|
+
"Collection name cannot be set in the options when using the Query Index manager at the collection level"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# Copyright 2023. Couchbase, 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
|
+
|
15
|
+
# frozen_string_literal: true
|
16
|
+
|
17
|
+
require "couchbase/management/query_index_manager"
|
18
|
+
|
19
|
+
require_relative "../request_generator/admin/query"
|
20
|
+
require_relative "../response_converter/admin/query"
|
21
|
+
|
22
|
+
module Couchbase
|
23
|
+
module Protostellar
|
24
|
+
module Management
|
25
|
+
class QueryIndexManager
|
26
|
+
def initialize(client:)
|
27
|
+
@client = client
|
28
|
+
@request_generator = RequestGenerator::Admin::Query.new
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_all_indexes(bucket_name, options = Couchbase::Management::Options::Query::GetAllIndexes.new)
|
32
|
+
validate_options(options)
|
33
|
+
|
34
|
+
req = @request_generator.get_all_indexes_request(options, bucket_name)
|
35
|
+
resp = @client.send_request(req)
|
36
|
+
ResponseConverter::Admin::Query.to_query_index_array(resp)
|
37
|
+
end
|
38
|
+
|
39
|
+
def create_index(bucket_name, index_name, fields, options = Couchbase::Management::Options::Query::CreateIndex.new)
|
40
|
+
validate_options(options)
|
41
|
+
|
42
|
+
req = @request_generator.create_index_request(index_name, fields, options, bucket_name)
|
43
|
+
@client.send_request(req)
|
44
|
+
end
|
45
|
+
|
46
|
+
def create_primary_index(bucket_name, options = Couchbase::Management::Options::Query::CreatePrimaryIndex.new)
|
47
|
+
validate_options(options)
|
48
|
+
|
49
|
+
req = @request_generator.create_primary_index_request(options, bucket_name)
|
50
|
+
@client.send_request(req)
|
51
|
+
end
|
52
|
+
|
53
|
+
def drop_index(bucket_name, index_name, options = Couchbase::Management::Options::Query::DropIndex.new)
|
54
|
+
validate_options(options)
|
55
|
+
|
56
|
+
req = @request_generator.drop_index_request(index_name, options, bucket_name)
|
57
|
+
@client.send_request(req)
|
58
|
+
end
|
59
|
+
|
60
|
+
def drop_primary_index(bucket_name, options = Couchbase::Management::Options::Query::DropPrimaryIndex.new)
|
61
|
+
validate_options(options)
|
62
|
+
|
63
|
+
req = @request_generator.drop_primary_index_request(options, bucket_name)
|
64
|
+
@client.send_request(req)
|
65
|
+
end
|
66
|
+
|
67
|
+
def build_deferred_indexes(bucket_name, options = Couchbase::Management::Options::Query::BuildDeferredIndexes.new)
|
68
|
+
validate_options(options)
|
69
|
+
|
70
|
+
req = @request_generator.build_deferred_indexes_request(options, bucket_name)
|
71
|
+
@client.send_request(req)
|
72
|
+
end
|
73
|
+
|
74
|
+
def watch_indexes(bucket_name, index_names, timeout, options = Couchbase::Management::Options::Query::WatchIndexes.new)
|
75
|
+
validate_options(options)
|
76
|
+
|
77
|
+
# TODO: Will this be implemented in the gateway instead?
|
78
|
+
|
79
|
+
index_names.append("#primary") if options.watch_primary
|
80
|
+
|
81
|
+
interval_millis = 50
|
82
|
+
deadline = Time.now + (Utils::Time.extract_duration(timeout) * 0.001)
|
83
|
+
while Time.now <= deadline
|
84
|
+
get_all_opts = Couchbase::Management::Options::Query::GetAllIndexes.new(timeout: ((deadline - Time.now) * 1000).round)
|
85
|
+
indexes = get_all_indexes(bucket_name, get_all_opts).select { |idx| index_names.include? idx.name }
|
86
|
+
indexes_not_found = index_names - indexes.map(&:name)
|
87
|
+
unless indexes_not_found.empty?
|
88
|
+
raise Couchbase::Error::IndexNotFound,
|
89
|
+
"Failed to find the indexes: #{indexes_not_found.join(', ')}"
|
90
|
+
end
|
91
|
+
|
92
|
+
all_online = indexes.all? { |idx| idx.state == :online }
|
93
|
+
return if all_online
|
94
|
+
|
95
|
+
sleep(interval_millis / 1000)
|
96
|
+
interval_millis += 500
|
97
|
+
interval_millis = 1000 if interval_millis > 1000
|
98
|
+
end
|
99
|
+
raise Couchbase::Error::UnambiguousTimeout, "Failed to find all indexes online within the allotted time"
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def validate_options(options)
|
105
|
+
return if options.scope_name.nil? && options.collection_name.nil?
|
106
|
+
|
107
|
+
warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Copyright 2023. Couchbase, 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
|
+
|
15
|
+
# frozen_string_literal: true
|
16
|
+
|
17
|
+
require_relative "management/collection_manager"
|
18
|
+
|
19
|
+
module Couchbase
|
20
|
+
module Protostellar
|
21
|
+
module Management
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# Copyright 2023. Couchbase, 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
|
+
|
15
|
+
# frozen_string_literal: true
|
16
|
+
|
17
|
+
require "couchbase/utils/time"
|
18
|
+
require_relative "retry/strategies/best_effort"
|
19
|
+
|
20
|
+
module Couchbase
|
21
|
+
module Protostellar
|
22
|
+
# @api private
|
23
|
+
class Request
|
24
|
+
attr_reader :service
|
25
|
+
attr_reader :rpc
|
26
|
+
attr_reader :timeout
|
27
|
+
attr_reader :proto_request
|
28
|
+
attr_reader :idempotent
|
29
|
+
attr_reader :retry_attempts
|
30
|
+
attr_reader :retry_reasons
|
31
|
+
attr_reader :retry_strategy
|
32
|
+
attr_accessor :context
|
33
|
+
|
34
|
+
def initialize(
|
35
|
+
service:,
|
36
|
+
rpc:,
|
37
|
+
proto_request:,
|
38
|
+
timeout:,
|
39
|
+
retry_strategy: Retry::Strategies::BestEffort::DEFAULT,
|
40
|
+
idempotent: false
|
41
|
+
)
|
42
|
+
@service = service
|
43
|
+
@rpc = rpc
|
44
|
+
@timeout = timeout
|
45
|
+
@deadline = nil
|
46
|
+
@proto_request = proto_request
|
47
|
+
@idempotent = idempotent
|
48
|
+
@retry_attempts = 0
|
49
|
+
@retry_reasons = Set.new
|
50
|
+
@retry_strategy = retry_strategy
|
51
|
+
@context = {}
|
52
|
+
end
|
53
|
+
|
54
|
+
def deadline
|
55
|
+
if @deadline.nil?
|
56
|
+
timeout_secs = 0.001 * Utils::Time.extract_duration(@timeout)
|
57
|
+
@deadline = Time.now + timeout_secs
|
58
|
+
end
|
59
|
+
@deadline
|
60
|
+
end
|
61
|
+
|
62
|
+
def add_retry_attempt(reason)
|
63
|
+
@retry_reasons.add(reason)
|
64
|
+
@retry_attempts += 1
|
65
|
+
end
|
66
|
+
|
67
|
+
def error_context
|
68
|
+
@context.merge({retry_reasons: @retry_reasons.to_a, retry_attempts: @retry_attempts})
|
69
|
+
end
|
70
|
+
|
71
|
+
def set_timeout_from_defaults(timeouts)
|
72
|
+
return unless @timeout.nil?
|
73
|
+
|
74
|
+
@timeout = timeouts.timeout_for_request(self)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Copyright 2023. Couchbase, 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
|
+
|
15
|
+
# frozen_string_literal: true
|
16
|
+
|
17
|
+
module Couchbase
|
18
|
+
module Protostellar
|
19
|
+
# @api private
|
20
|
+
class RequestBehaviour
|
21
|
+
attr_reader :retry_duration
|
22
|
+
attr_reader :error
|
23
|
+
|
24
|
+
def initialize(retry_duration: nil, error: nil)
|
25
|
+
@retry_duration = retry_duration
|
26
|
+
@error = error
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.fail(error)
|
30
|
+
RequestBehaviour.new(error: error)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.retry(retry_duration)
|
34
|
+
RequestBehaviour.new(retry_duration: retry_duration)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.success
|
38
|
+
RequestBehaviour.new(retry_duration: nil, error: nil)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# Copyright 2023. Couchbase, 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
|
+
|
15
|
+
# frozen_string_literal: true
|
16
|
+
|
17
|
+
require_relative "../../request"
|
18
|
+
require_relative "../../generated/admin/bucket/v1/bucket_pb"
|
19
|
+
require_relative "../kv"
|
20
|
+
|
21
|
+
module Couchbase
|
22
|
+
module Protostellar
|
23
|
+
module RequestGenerator
|
24
|
+
module Admin
|
25
|
+
class Bucket
|
26
|
+
BUCKET_TYPE_MAP = {
|
27
|
+
:couchbase => :BUCKET_TYPE_COUCHBASE,
|
28
|
+
:memcached => :BUCKET_TYPE_MEMCACHED,
|
29
|
+
:ephemeral => :BUCKET_TYPE_EPHEMERAL,
|
30
|
+
}.freeze
|
31
|
+
|
32
|
+
EVICTION_MODE_MAP = {
|
33
|
+
:full => :EVICTION_MODE_FULL,
|
34
|
+
:value_only => :EVICTION_MODE_VALUE_ONLY,
|
35
|
+
:no_eviction => :EVICTION_MODE_NONE,
|
36
|
+
:not_recently_used => :EVICTION_MODE_NOT_RECENTLY_USED,
|
37
|
+
}.freeze
|
38
|
+
|
39
|
+
COMPRESSION_MODE_MAP = {
|
40
|
+
:off => :COMPRESSION_MODE_OFF,
|
41
|
+
:passive => :COMPRESSION_MODE_PASSIVE,
|
42
|
+
:active => :COMPRESSION_MODE_ACTIVE,
|
43
|
+
}.freeze
|
44
|
+
|
45
|
+
STORAGE_BACKEND_MAP = {
|
46
|
+
:couchstore => :STORAGE_BACKEND_COUCHSTORE,
|
47
|
+
:magma => :STORAGE_BACKEND_MAGMA,
|
48
|
+
}.freeze
|
49
|
+
|
50
|
+
CONFLICT_RESOLUTION_TYPE_MAP = {
|
51
|
+
:timestamp => :CONFLICT_RESOLUTION_TYPE_TIMESTAMP,
|
52
|
+
:sequence_number => :CONFLICT_RESOLUTION_TYPE_SEQUENCE_NUMBER,
|
53
|
+
:custom => :CONFLICT_RESOLUTION_TYPE_CUSTOM,
|
54
|
+
}.freeze
|
55
|
+
|
56
|
+
DURABILITY_LEVEL_MAP = RequestGenerator::KV::DURABILITY_LEVEL_MAP
|
57
|
+
|
58
|
+
def list_buckets_request(options)
|
59
|
+
proto_req = Generated::Admin::Bucket::V1::ListBucketsRequest.new
|
60
|
+
create_request(proto_req, :list_buckets, options, idempotent: true)
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_bucket_request(settings, options)
|
64
|
+
proto_req = Generated::Admin::Bucket::V1::CreateBucketRequest.new(
|
65
|
+
extract_bucket_settings(settings, create: true)
|
66
|
+
)
|
67
|
+
create_request(proto_req, :create_bucket, options)
|
68
|
+
end
|
69
|
+
|
70
|
+
def update_bucket_request(settings, options)
|
71
|
+
proto_req = Generated::Admin::Bucket::V1::UpdateBucketRequest.new(
|
72
|
+
extract_bucket_settings(settings, create: false)
|
73
|
+
)
|
74
|
+
create_request(proto_req, :update_bucket, options)
|
75
|
+
end
|
76
|
+
|
77
|
+
def delete_bucket_request(bucket_name, options)
|
78
|
+
proto_req = Generated::Admin::Bucket::V1::DeleteBucketRequest.new(
|
79
|
+
bucket_name: bucket_name
|
80
|
+
)
|
81
|
+
create_request(proto_req, :delete_bucket, options)
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def extract_bucket_settings(settings, create: false)
|
87
|
+
s = {bucket_name: settings.name}
|
88
|
+
|
89
|
+
if create
|
90
|
+
s[:bucket_type] = BUCKET_TYPE_MAP[settings.bucket_type]
|
91
|
+
s[:storage_backend] = STORAGE_BACKEND_MAP[settings.storage_backend] unless settings.storage_backend.nil?
|
92
|
+
unless settings.conflict_resolution_type.nil?
|
93
|
+
s[:conflict_resolution_type] = CONFLICT_RESOLUTION_TYPE_MAP[settings.conflict_resolution_type]
|
94
|
+
end
|
95
|
+
s[:replica_indexes] = settings.replica_indexes unless settings.replica_indexes.nil?
|
96
|
+
end
|
97
|
+
|
98
|
+
s[:ram_quota_mb] = settings.ram_quota_mb unless settings.ram_quota_mb.nil?
|
99
|
+
s[:num_replicas] = settings.num_replicas unless settings.num_replicas.nil?
|
100
|
+
s[:flush_enabled] = settings.flush_enabled unless settings.flush_enabled.nil?
|
101
|
+
s[:eviction_mode] = EVICTION_MODE_MAP[settings.eviction_policy] unless settings.eviction_policy.nil?
|
102
|
+
s[:max_expiry_secs] = settings.max_expiry unless settings.max_expiry.nil?
|
103
|
+
s[:compression_mode] = COMPRESSION_MODE_MAP[settings.compression_mode] unless settings.compression_mode.nil?
|
104
|
+
unless settings.minimum_durability_level.nil?
|
105
|
+
s[:minimum_durability_level] = DURABILITY_LEVEL_MAP[settings.minimum_durability_level]
|
106
|
+
end
|
107
|
+
|
108
|
+
s
|
109
|
+
end
|
110
|
+
|
111
|
+
def create_request(proto_request, rpc, options, idempotent: false)
|
112
|
+
Request.new(
|
113
|
+
service: :bucket_admin,
|
114
|
+
rpc: rpc,
|
115
|
+
proto_request: proto_request,
|
116
|
+
idempotent: idempotent,
|
117
|
+
timeout: options.timeout
|
118
|
+
)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# Copyright 2023. Couchbase, 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
|
+
|
15
|
+
# frozen_string_literal: true
|
16
|
+
|
17
|
+
require "couchbase/protostellar/request"
|
18
|
+
require "couchbase/protostellar/generated/admin/collection/v1/collection_pb"
|
19
|
+
|
20
|
+
module Couchbase
|
21
|
+
module Protostellar
|
22
|
+
module RequestGenerator
|
23
|
+
module Admin
|
24
|
+
class Collection
|
25
|
+
attr_reader :client
|
26
|
+
|
27
|
+
def initialize(bucket_name:)
|
28
|
+
@bucket_name = bucket_name
|
29
|
+
end
|
30
|
+
|
31
|
+
def list_collections_request(options)
|
32
|
+
proto_req = Generated::Admin::Collection::V1::ListCollectionsRequest.new(
|
33
|
+
bucket_name: @bucket_name
|
34
|
+
)
|
35
|
+
create_request(proto_req, :list_collections, options, idempotent: true)
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_scope_request(scope_name, options)
|
39
|
+
proto_req = Generated::Admin::Collection::V1::CreateScopeRequest.new(
|
40
|
+
bucket_name: @bucket_name,
|
41
|
+
scope_name: scope_name
|
42
|
+
)
|
43
|
+
create_request(proto_req, :create_scope, options)
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete_scope_request(scope_name, options)
|
47
|
+
proto_req = Generated::Admin::Collection::V1::DeleteScopeRequest.new(
|
48
|
+
bucket_name: @bucket_name,
|
49
|
+
scope_name: scope_name
|
50
|
+
)
|
51
|
+
create_request(proto_req, :delete_scope, options)
|
52
|
+
end
|
53
|
+
|
54
|
+
def create_collection_request(scope_name, collection_name, settings, options)
|
55
|
+
proto_opts = {}
|
56
|
+
proto_opts[:max_expiry_secs] = settings.max_expiry unless settings.max_expiry.nil?
|
57
|
+
unless settings.history.nil?
|
58
|
+
raise Couchbase::Error::FeatureNotAvailable, "The #{Protostellar::NAME} protocol does not support the history setting"
|
59
|
+
end
|
60
|
+
|
61
|
+
proto_req = Generated::Admin::Collection::V1::CreateCollectionRequest.new(
|
62
|
+
bucket_name: @bucket_name,
|
63
|
+
scope_name: scope_name,
|
64
|
+
collection_name: collection_name,
|
65
|
+
**proto_opts
|
66
|
+
)
|
67
|
+
create_request(proto_req, :create_collection, options)
|
68
|
+
end
|
69
|
+
|
70
|
+
def delete_collection_request(scope_name, collection_name, options)
|
71
|
+
proto_req = Generated::Admin::Collection::V1::DeleteCollectionRequest.new(
|
72
|
+
bucket_name: @bucket_name,
|
73
|
+
scope_name: scope_name,
|
74
|
+
collection_name: collection_name
|
75
|
+
)
|
76
|
+
create_request(proto_req, :delete_collection, options)
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def create_request(proto_request, rpc, options, idempotent: false)
|
82
|
+
Request.new(
|
83
|
+
service: :collection_admin,
|
84
|
+
rpc: rpc,
|
85
|
+
proto_request: proto_request,
|
86
|
+
idempotent: idempotent,
|
87
|
+
timeout: options.timeout
|
88
|
+
)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|