couchbase 3.5.3-arm64-darwin
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.
- 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
|