couchbase 3.5.2-x86_64-darwin

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +202 -0
  3. data/README.md +154 -0
  4. data/ext/extconf.rb +0 -0
  5. data/lib/active_support/cache/couchbase_store.rb +342 -0
  6. data/lib/couchbase/3.1/libcouchbase.bundle +0 -0
  7. data/lib/couchbase/3.2/libcouchbase.bundle +0 -0
  8. data/lib/couchbase/3.3/libcouchbase.bundle +0 -0
  9. data/lib/couchbase/analytics_options.rb +109 -0
  10. data/lib/couchbase/authenticator.rb +66 -0
  11. data/lib/couchbase/binary_collection.rb +130 -0
  12. data/lib/couchbase/binary_collection_options.rb +26 -0
  13. data/lib/couchbase/bucket.rb +146 -0
  14. data/lib/couchbase/cluster.rb +462 -0
  15. data/lib/couchbase/cluster_registry.rb +49 -0
  16. data/lib/couchbase/collection.rb +707 -0
  17. data/lib/couchbase/collection_options.rb +401 -0
  18. data/lib/couchbase/config_profiles.rb +57 -0
  19. data/lib/couchbase/configuration.rb +58 -0
  20. data/lib/couchbase/datastructures/couchbase_list.rb +160 -0
  21. data/lib/couchbase/datastructures/couchbase_map.rb +194 -0
  22. data/lib/couchbase/datastructures/couchbase_queue.rb +134 -0
  23. data/lib/couchbase/datastructures/couchbase_set.rb +128 -0
  24. data/lib/couchbase/datastructures.rb +26 -0
  25. data/lib/couchbase/diagnostics.rb +183 -0
  26. data/lib/couchbase/errors.rb +414 -0
  27. data/lib/couchbase/json_transcoder.rb +41 -0
  28. data/lib/couchbase/key_value_scan.rb +119 -0
  29. data/lib/couchbase/libcouchbase.rb +6 -0
  30. data/lib/couchbase/logger.rb +87 -0
  31. data/lib/couchbase/management/analytics_index_manager.rb +1129 -0
  32. data/lib/couchbase/management/bucket_manager.rb +445 -0
  33. data/lib/couchbase/management/collection_manager.rb +472 -0
  34. data/lib/couchbase/management/collection_query_index_manager.rb +224 -0
  35. data/lib/couchbase/management/query_index_manager.rb +619 -0
  36. data/lib/couchbase/management/scope_search_index_manager.rb +200 -0
  37. data/lib/couchbase/management/search_index_manager.rb +426 -0
  38. data/lib/couchbase/management/user_manager.rb +470 -0
  39. data/lib/couchbase/management/view_index_manager.rb +239 -0
  40. data/lib/couchbase/management.rb +31 -0
  41. data/lib/couchbase/mutation_state.rb +65 -0
  42. data/lib/couchbase/options.rb +2846 -0
  43. data/lib/couchbase/protostellar/binary_collection.rb +55 -0
  44. data/lib/couchbase/protostellar/bucket.rb +55 -0
  45. data/lib/couchbase/protostellar/client.rb +99 -0
  46. data/lib/couchbase/protostellar/cluster.rb +171 -0
  47. data/lib/couchbase/protostellar/collection.rb +152 -0
  48. data/lib/couchbase/protostellar/connect_options.rb +63 -0
  49. data/lib/couchbase/protostellar/error_handling.rb +203 -0
  50. data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_pb.rb +61 -0
  51. data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_services_pb.rb +35 -0
  52. data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_pb.rb +57 -0
  53. data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_services_pb.rb +36 -0
  54. data/lib/couchbase/protostellar/generated/admin/query/v1/query_pb.rb +61 -0
  55. data/lib/couchbase/protostellar/generated/admin/query/v1/query_services_pb.rb +37 -0
  56. data/lib/couchbase/protostellar/generated/admin/search/v1/search_pb.rb +72 -0
  57. data/lib/couchbase/protostellar/generated/admin/search/v1/search_services_pb.rb +44 -0
  58. data/lib/couchbase/protostellar/generated/analytics/v1/analytics_pb.rb +52 -0
  59. data/lib/couchbase/protostellar/generated/analytics/v1/analytics_services_pb.rb +30 -0
  60. data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_pb.rb +70 -0
  61. data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_services_pb.rb +36 -0
  62. data/lib/couchbase/protostellar/generated/kv/v1/kv_pb.rb +97 -0
  63. data/lib/couchbase/protostellar/generated/kv/v1/kv_services_pb.rb +46 -0
  64. data/lib/couchbase/protostellar/generated/query/v1/query_pb.rb +57 -0
  65. data/lib/couchbase/protostellar/generated/query/v1/query_services_pb.rb +30 -0
  66. data/lib/couchbase/protostellar/generated/routing/v1/routing_pb.rb +52 -0
  67. data/lib/couchbase/protostellar/generated/routing/v1/routing_services_pb.rb +30 -0
  68. data/lib/couchbase/protostellar/generated/search/v1/search_pb.rb +99 -0
  69. data/lib/couchbase/protostellar/generated/search/v1/search_services_pb.rb +30 -0
  70. data/lib/couchbase/protostellar/generated/transactions/v1/transactions_pb.rb +57 -0
  71. data/lib/couchbase/protostellar/generated/transactions/v1/transactions_services_pb.rb +36 -0
  72. data/lib/couchbase/protostellar/generated/view/v1/view_pb.rb +51 -0
  73. data/lib/couchbase/protostellar/generated/view/v1/view_services_pb.rb +30 -0
  74. data/lib/couchbase/protostellar/generated.rb +9 -0
  75. data/lib/couchbase/protostellar/management/bucket_manager.rb +67 -0
  76. data/lib/couchbase/protostellar/management/collection_manager.rb +94 -0
  77. data/lib/couchbase/protostellar/management/collection_query_index_manager.rb +124 -0
  78. data/lib/couchbase/protostellar/management/query_index_manager.rb +112 -0
  79. data/lib/couchbase/protostellar/management.rb +24 -0
  80. data/lib/couchbase/protostellar/request.rb +78 -0
  81. data/lib/couchbase/protostellar/request_behaviour.rb +42 -0
  82. data/lib/couchbase/protostellar/request_generator/admin/bucket.rb +124 -0
  83. data/lib/couchbase/protostellar/request_generator/admin/collection.rb +94 -0
  84. data/lib/couchbase/protostellar/request_generator/admin/query.rb +130 -0
  85. data/lib/couchbase/protostellar/request_generator/admin.rb +24 -0
  86. data/lib/couchbase/protostellar/request_generator/kv.rb +474 -0
  87. data/lib/couchbase/protostellar/request_generator/query.rb +133 -0
  88. data/lib/couchbase/protostellar/request_generator/search.rb +387 -0
  89. data/lib/couchbase/protostellar/request_generator.rb +26 -0
  90. data/lib/couchbase/protostellar/response_converter/admin/bucket.rb +55 -0
  91. data/lib/couchbase/protostellar/response_converter/admin/collection.rb +42 -0
  92. data/lib/couchbase/protostellar/response_converter/admin/query.rb +59 -0
  93. data/lib/couchbase/protostellar/response_converter/admin.rb +24 -0
  94. data/lib/couchbase/protostellar/response_converter/kv.rb +151 -0
  95. data/lib/couchbase/protostellar/response_converter/query.rb +84 -0
  96. data/lib/couchbase/protostellar/response_converter/search.rb +136 -0
  97. data/lib/couchbase/protostellar/response_converter.rb +26 -0
  98. data/lib/couchbase/protostellar/retry/action.rb +38 -0
  99. data/lib/couchbase/protostellar/retry/orchestrator.rb +60 -0
  100. data/lib/couchbase/protostellar/retry/reason.rb +67 -0
  101. data/lib/couchbase/protostellar/retry/strategies/best_effort.rb +49 -0
  102. data/lib/couchbase/protostellar/retry/strategies.rb +26 -0
  103. data/lib/couchbase/protostellar/retry.rb +28 -0
  104. data/lib/couchbase/protostellar/scope.rb +57 -0
  105. data/lib/couchbase/protostellar/timeout_defaults.rb +30 -0
  106. data/lib/couchbase/protostellar/timeouts.rb +83 -0
  107. data/lib/couchbase/protostellar.rb +29 -0
  108. data/lib/couchbase/query_options.rb +122 -0
  109. data/lib/couchbase/railtie.rb +47 -0
  110. data/lib/couchbase/raw_binary_transcoder.rb +39 -0
  111. data/lib/couchbase/raw_json_transcoder.rb +40 -0
  112. data/lib/couchbase/raw_string_transcoder.rb +42 -0
  113. data/lib/couchbase/scope.rb +258 -0
  114. data/lib/couchbase/search_options.rb +1650 -0
  115. data/lib/couchbase/subdoc.rb +293 -0
  116. data/lib/couchbase/transcoder_flags.rb +64 -0
  117. data/lib/couchbase/utils/generic_logger_adapter.rb +40 -0
  118. data/lib/couchbase/utils/stdlib_logger_adapter.rb +67 -0
  119. data/lib/couchbase/utils/time.rb +71 -0
  120. data/lib/couchbase/utils.rb +23 -0
  121. data/lib/couchbase/version.rb +25 -0
  122. data/lib/couchbase/view_options.rb +67 -0
  123. data/lib/couchbase.rb +30 -0
  124. data/lib/rails/generators/couchbase/config/config_generator.rb +29 -0
  125. metadata +190 -0
@@ -0,0 +1,472 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2020-2021 Couchbase, Inc.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require "rubygems/deprecate"
18
+
19
+ require "couchbase/errors"
20
+ require "couchbase/options"
21
+
22
+ module Couchbase
23
+ module Management
24
+ module Options
25
+ module Collection
26
+ # Options for {CollectionManager#get_all_scopes}
27
+ class GetAllScopes < ::Couchbase::Options::Base
28
+ # Creates an instance of options for {CollectionManager#get_all_scopes}
29
+ #
30
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
31
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
32
+ # @param [Hash, nil] client_context the client context data, if set
33
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
34
+ #
35
+ # @yieldparam [GetAllScopes] self
36
+ def initialize(timeout: nil,
37
+ retry_strategy: nil,
38
+ client_context: nil,
39
+ parent_span: nil)
40
+ super
41
+ yield self if block_given?
42
+ end
43
+
44
+ DEFAULT = GetAllScopes.new.freeze
45
+ end
46
+
47
+ # Options for {CollectionManager#create_scope}
48
+ class CreateScope < ::Couchbase::Options::Base
49
+ # Creates an instance of options for {CollectionManager#create_scope}
50
+ #
51
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
52
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
53
+ # @param [Hash, nil] client_context the client context data, if set
54
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
55
+ #
56
+ # @yieldparam [CreateScope] self
57
+ def initialize(timeout: nil,
58
+ retry_strategy: nil,
59
+ client_context: nil,
60
+ parent_span: nil)
61
+ super
62
+ yield self if block_given?
63
+ end
64
+
65
+ DEFAULT = CreateScope.new.freeze
66
+ end
67
+
68
+ # Options for {CollectionManager#drop_scope}
69
+ class DropScope < ::Couchbase::Options::Base
70
+ # Creates an instance of options for {CollectionManager#drop_scope}
71
+ #
72
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
73
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
74
+ # @param [Hash, nil] client_context the client context data, if set
75
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
76
+ #
77
+ # @yieldparam [DropScope] self
78
+ def initialize(timeout: nil,
79
+ retry_strategy: nil,
80
+ client_context: nil,
81
+ parent_span: nil)
82
+ super
83
+ yield self if block_given?
84
+ end
85
+
86
+ DEFAULT = DropScope.new.freeze
87
+ end
88
+
89
+ # Options for {CollectionManager#create_collection}
90
+ class CreateCollection < ::Couchbase::Options::Base
91
+ # Creates an instance of options for {CollectionManager#create_collection}
92
+ #
93
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
94
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
95
+ # @param [Hash, nil] client_context the client context data, if set
96
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
97
+ #
98
+ # @yieldparam [CreateCollection] self
99
+ def initialize(timeout: nil,
100
+ retry_strategy: nil,
101
+ client_context: nil,
102
+ parent_span: nil)
103
+ super
104
+ yield self if block_given?
105
+ end
106
+
107
+ DEFAULT = CreateCollection.new.freeze
108
+ end
109
+
110
+ # Options for {CollectionManager#update_collection}
111
+ class UpdateCollection < ::Couchbase::Options::Base
112
+ # Creates an instance of options for {CollectionManager#update_collection}
113
+ #
114
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
115
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
116
+ # @param [Hash, nil] client_context the client context data, if set
117
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
118
+ #
119
+ # @yieldparam [UpdateCollection] self
120
+ def initialize(timeout: nil,
121
+ retry_strategy: nil,
122
+ client_context: nil,
123
+ parent_span: nil)
124
+ super
125
+ yield self if block_given?
126
+ end
127
+
128
+ DEFAULT = UpdateCollection.new.freeze
129
+ end
130
+
131
+ # Options for {CollectionManager#drop_collection}
132
+ class DropCollection < ::Couchbase::Options::Base
133
+ # Creates an instance of options for {CollectionManager#drop_collection}
134
+ #
135
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
136
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
137
+ # @param [Hash, nil] client_context the client context data, if set
138
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
139
+ #
140
+ # @yieldparam [DropCollection] self
141
+ def initialize(timeout: nil,
142
+ retry_strategy: nil,
143
+ client_context: nil,
144
+ parent_span: nil)
145
+ super
146
+ yield self if block_given?
147
+ end
148
+
149
+ DEFAULT = DropCollection.new.freeze
150
+ end
151
+
152
+ # rubocop:disable Naming/MethodName constructor shortcuts
153
+ module_function
154
+
155
+ # Construct {GetAllScopes} options for {CollectionManager#get_all_scopes}
156
+ #
157
+ # @return [GetAllScopes]
158
+ def GetAllScopes(**args)
159
+ GetAllScopes.new(**args)
160
+ end
161
+
162
+ # Construct {CreateScope} options for {CollectionManager#create_scope}
163
+ #
164
+ # @return [CreateScope]
165
+ def CreateScope(**args)
166
+ CreateScope.new(**args)
167
+ end
168
+
169
+ # Construct {DropScope} options for {CollectionManager#drop_scope}
170
+ #
171
+ # @return [DropScope]
172
+ def DropScope(**args)
173
+ DropScope.new(**args)
174
+ end
175
+
176
+ # Construct {CreateCollection} options for {CollectionManager#create_collection}
177
+ #
178
+ # @return [CreateCollection]
179
+ def CreateCollection(**args)
180
+ CreateCollection.new(**args)
181
+ end
182
+
183
+ # Construct {DropCollection} options for {CollectionManager#drop_collection}
184
+ #
185
+ # @return [DropCollection]
186
+ def DropCollection(**args)
187
+ DropCollection.new(**args)
188
+ end
189
+
190
+ # rubocop:enable Naming/MethodName
191
+ end
192
+ end
193
+
194
+ class CollectionManager
195
+ extend Gem::Deprecate
196
+
197
+ alias inspect to_s
198
+
199
+ # @param [Couchbase::Backend] backend
200
+ # @param [String] bucket_name
201
+ def initialize(backend, bucket_name)
202
+ @backend = backend
203
+ @bucket_name = bucket_name
204
+ end
205
+
206
+ # Get all scopes
207
+ #
208
+ # @param [Options::Collection::GetAllScopes] options
209
+ #
210
+ # @return [Array<ScopeSpec>]
211
+ def get_all_scopes(options = Options::Collection::GetAllScopes.new)
212
+ res = @backend.scope_get_all(@bucket_name, options.to_backend)
213
+ res[:scopes].map do |s|
214
+ ScopeSpec.new do |scope|
215
+ scope.name = s[:name]
216
+ scope.collections = s[:collections].map do |c|
217
+ CollectionSpec.new do |collection|
218
+ collection.name = c[:name]
219
+ collection.scope_name = s[:name]
220
+ collection.max_expiry = c[:max_expiry]
221
+ collection.history = c[:history]
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
227
+
228
+ # Get a scope by name
229
+ #
230
+ # @param [String] scope_name name of the scope
231
+ # @param [GetScopeOptions] options
232
+ #
233
+ # @deprecated Use {#get_all_scopes} with filter by name
234
+ #
235
+ # @return [ScopeSpec]
236
+ #
237
+ # @raise [Error::ScopeNotFound]
238
+ def get_scope(scope_name, options = GetScopeOptions.new)
239
+ get_all_scopes(Options::Collection::GetAllScopes(timeout: options.timeout))
240
+ .find { |scope| scope.name == scope_name } or raise Error::ScopeNotFound, "unable to find scope #{scope_name}"
241
+ end
242
+
243
+ deprecate :get_scope, :get_all_scopes, 2021, 6
244
+
245
+ # Creates a new scope
246
+ #
247
+ # @param [String] scope_name name of the scope
248
+ # @param [Options::Collection::CreateScope] options
249
+ #
250
+ # @return void
251
+ #
252
+ # @raise [ArgumentError]
253
+ def create_scope(scope_name, options = Options::Collection::CreateScope.new)
254
+ @backend.scope_create(@bucket_name, scope_name, options.to_backend)
255
+ end
256
+
257
+ # Removes a scope
258
+ #
259
+ # @param [String] scope_name name of the scope
260
+ # @param [Options::Collection::DropScope] options
261
+ #
262
+ # @return void
263
+ #
264
+ # @raise [Error::ScopeNotFound]
265
+ def drop_scope(scope_name, options = Options::Collection::DropScope.new)
266
+ @backend.scope_drop(@bucket_name, scope_name, options.to_backend)
267
+ end
268
+
269
+ # Creates a new collection
270
+ # @overload create_collection(scope_name, collection_name, settings = CreateCollectionSettings::DEFAULT,
271
+ # options = Options::Collection::CreateCollection::DEFAULT)
272
+ # @param [String] scope_name the name of the scope the collection will be created in
273
+ # @param [String] collection_name the name of the collection to be created
274
+ # @param [CreateCollectionSettings] settings settings for the new collection
275
+ # @param [Options::Collection::CreateCollection] options
276
+ #
277
+ # @overload create_collection(collection, options = Options::Collection::CreateCollection)
278
+ # @param [CollectionSpec] collection specification of the collection
279
+ # @param [Options::Collection::CreateCollection] options
280
+ #
281
+ # @deprecated Use +#create_collection(scope_name, collection_name, settings, options)+ instead
282
+ #
283
+ # @return void
284
+ #
285
+ # @raise [ArgumentError]
286
+ # @raise [Error::CollectionExists]
287
+ # @raise [Error::ScopeNotFound]
288
+ def create_collection(*args)
289
+ if args[0].is_a?(CollectionSpec)
290
+ collection = args[0]
291
+ options = args[1] || Options::Collection::CreateCollection::DEFAULT
292
+ settings = CreateCollectionSettings.new(max_expiry: collection.max_expiry, history: collection.history)
293
+
294
+ warn "Calling create_collection with a CollectionSpec object has been deprecated, supply scope name, " \
295
+ "collection name and optionally a CreateCollectionSettings instance"
296
+
297
+ @backend.collection_create(@bucket_name, collection.scope_name, collection.name, settings.to_backend, options.to_backend)
298
+ else
299
+ scope_name = args[0]
300
+ collection_name = args[1]
301
+ settings = args[2] || CreateCollectionSettings::DEFAULT
302
+ options = args[3] || Options::Collection::CreateCollection::DEFAULT
303
+ @backend.collection_create(@bucket_name, scope_name, collection_name, settings.to_backend, options.to_backend)
304
+ end
305
+ end
306
+
307
+ # Updates the settings of an existing collection
308
+ #
309
+ # @param [String] scope_name the name of the scope the collection is in
310
+ # @param [String] collection_name the name of the collection to be updated
311
+ # @param [UpdateCollectionSettings] settings the settings that should be updated
312
+ #
313
+ # @raise [ArgumentError]
314
+ # @raise [Error::CollectionNotFound]
315
+ # @raise [Error::ScopeNotFound]
316
+ def update_collection(scope_name, collection_name, settings = UpdateCollectionSettings::DEFAULT,
317
+ options = Options::Collection::UpdateCollection::DEFAULT)
318
+ @backend.collection_update(@bucket_name, scope_name, collection_name, settings.to_backend, options.to_backend)
319
+ end
320
+
321
+ # Removes a collection
322
+ # @overload drop_collection(scope_name, collection_name, settings = CreateCollectionSettings::DEFAULT,
323
+ # options = Options::Collection::CreateCollection::DEFAULT)
324
+ # @param [String] scope_name the name of the scope the collection is in
325
+ # @param [String] collection_name the name of the collection to be removed
326
+ #
327
+ # @overload drop_collection(collection, options = Options::Collection::CreateCollection)
328
+ # @param [CollectionSpec] collection specification of the collection
329
+ # @param [Options::Collection::CreateCollection] options
330
+ #
331
+ # @deprecated Use +#drop_collection(scope_name, collection_name, options)+ instead
332
+ #
333
+ # @return void
334
+ #
335
+ # @raise [ArgumentError]
336
+ # @raise [Error::CollectionNotFound]
337
+ # @raise [Error::ScopeNotFound]
338
+ def drop_collection(*args)
339
+ if args[0].is_a?(CollectionSpec)
340
+ collection = args[0]
341
+ options = args[1] || Options::Collection::CreateCollection::DEFAULT
342
+
343
+ warn "Calling drop_collection with a CollectionSpec object has been deprecated, supply scope name and collection name"
344
+
345
+ @backend.collection_drop(@bucket_name, collection.scope_name, collection.name, options.to_backend)
346
+ else
347
+ scope_name = args[0]
348
+ collection_name = args[1]
349
+ options = args[2] || Options::Collection::CreateCollection::DEFAULT
350
+ @backend.collection_drop(@bucket_name, scope_name, collection_name, options.to_backend)
351
+ end
352
+ end
353
+
354
+ # @deprecated use {CollectionManager#get_all_scopes} instead
355
+ class GetScopeOptions
356
+ # @return [Integer] the time in milliseconds allowed for the operation to complete
357
+ attr_accessor :timeout
358
+
359
+ # @yieldparam [GetScopeOptions] self
360
+ def initialize
361
+ yield self if block_given?
362
+ end
363
+ end
364
+
365
+ # @api private
366
+ # TODO: deprecate after 3.2
367
+ GetAllScopesOptions = ::Couchbase::Management::Options::Collection::GetAllScopes
368
+
369
+ # @api private
370
+ # TODO: deprecate after 3.2
371
+ CreateScopeOptions = ::Couchbase::Management::Options::Collection::CreateScope
372
+
373
+ # @api private
374
+ # TODO: deprecate after 3.2
375
+ DropScopeOptions = ::Couchbase::Management::Options::Collection::DropScope
376
+
377
+ # @api private
378
+ # TODO: deprecate after 3.2
379
+ CreateCollectionOptions = ::Couchbase::Management::Options::Collection::CreateCollection
380
+
381
+ # @api private
382
+ # TODO: deprecate after 3.2
383
+ DropCollectionOptions = ::Couchbase::Management::Options::Collection::DropCollection
384
+ end
385
+
386
+ class CreateCollectionSettings
387
+ # @return [Integer, nil] time in seconds of the maximum expiration time for new documents in the collection
388
+ # (set to +nil+ to use the bucket-level setting, and to +-1+ set it to no-expiry)
389
+ attr_accessor :max_expiry
390
+
391
+ # @return [Boolean, nil] whether history retention override should be enabled in the collection (set to +nil+ to
392
+ # default to the bucket-level setting)
393
+ attr_accessor :history
394
+
395
+ def initialize(max_expiry: nil, history: nil)
396
+ @max_expiry = max_expiry
397
+ @history = history
398
+
399
+ yield self if block_given?
400
+ end
401
+
402
+ # @api private
403
+ def to_backend
404
+ {
405
+ max_expiry: @max_expiry,
406
+ history: @history,
407
+ }
408
+ end
409
+
410
+ DEFAULT = CreateCollectionSettings.new.freeze
411
+ end
412
+
413
+ class UpdateCollectionSettings
414
+ # @return [Integer, nil] time in seconds of the maximum expiration time for new documents in the collection
415
+ # (set to +nil+ to not update it, and to +-1+ set it to no-expiry)
416
+ attr_accessor :max_expiry
417
+
418
+ # @return [Boolean, nil] whether history retention override should be enabled in the collection (set to +nil+ to
419
+ # not update it)
420
+ attr_accessor :history
421
+
422
+ def initialize(max_expiry: nil, history: nil)
423
+ @max_expiry = max_expiry
424
+ @history = history
425
+
426
+ yield self if block_given?
427
+ end
428
+
429
+ # @api private
430
+ def to_backend
431
+ {
432
+ max_expiry: @max_expiry,
433
+ history: @history,
434
+ }
435
+ end
436
+
437
+ DEFAULT = UpdateCollectionSettings.new.freeze
438
+ end
439
+
440
+ class ScopeSpec
441
+ # @return [String] name of the scope
442
+ attr_accessor :name
443
+
444
+ # @return [Array<CollectionSpec>] list of collections associated with the scope
445
+ attr_accessor :collections
446
+
447
+ # @yieldparam [ScopeSpec] self
448
+ def initialize
449
+ yield self if block_given?
450
+ end
451
+ end
452
+
453
+ class CollectionSpec
454
+ # @return [String] name of the collection
455
+ attr_accessor :name
456
+
457
+ # @return [String] name of the scope
458
+ attr_accessor :scope_name
459
+
460
+ # @return [Integer] time in seconds of the expiration for new documents in the collection (set to +nil+ to disable it)
461
+ attr_accessor :max_expiry
462
+
463
+ # @return [Boolean, nil] whether history retention is enabled for this collection
464
+ attr_accessor :history
465
+
466
+ # @yieldparam [CollectionSpec] self
467
+ def initialize
468
+ yield self if block_given?
469
+ end
470
+ end
471
+ end
472
+ end
@@ -0,0 +1,224 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2023 Couchbase, Inc.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require "couchbase/management/query_index_manager"
18
+ require "couchbase/utils/time"
19
+ require "couchbase/errors"
20
+
21
+ module Couchbase
22
+ module Management
23
+ class CollectionQueryIndexManager
24
+ alias inspect to_s
25
+
26
+ # @param [Couchbase::Backend] backend
27
+ # @param [String] bucket_name name of the bucket
28
+ # @param [String] scope_name name of the scope
29
+ # @param [String] collection_name name of the collection
30
+ def initialize(backend, bucket_name, scope_name, collection_name)
31
+ @backend = backend
32
+ @bucket_name = bucket_name
33
+ @scope_name = scope_name
34
+ @collection_name = collection_name
35
+ end
36
+
37
+ # Fetches all indexes from the server
38
+ #
39
+ # @param [Options::Query::GetAllIndexes] options
40
+ #
41
+ # @return [Array<QueryIndex>]
42
+ #
43
+ # @raise [Error::InvalidArgument]
44
+ def get_all_indexes(options = Options::Query::GetAllIndexes.new)
45
+ unless options.scope_name.nil?
46
+ raise Error::InvalidArgument,
47
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
48
+ end
49
+
50
+ unless options.collection_name.nil?
51
+ raise Error::InvalidArgument,
52
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
53
+ end
54
+
55
+ res = @backend.collection_query_index_get_all(@bucket_name, @scope_name, @collection_name, options.to_backend)
56
+ res[:indexes].map do |idx|
57
+ QueryIndex.new do |index|
58
+ index.name = idx[:name]
59
+ index.is_primary = idx[:is_primary]
60
+ index.type = idx[:type]
61
+ index.state = idx[:state]
62
+ index.bucket = idx[:bucket_name]
63
+ index.scope = idx[:scope_name]
64
+ index.collection = idx[:collection_name]
65
+ index.index_key = idx[:index_key]
66
+ index.condition = idx[:condition]
67
+ index.partition = idx[:partition]
68
+ end
69
+ end
70
+ end
71
+
72
+ # Creates a new index
73
+ #
74
+ # @param [String] index_name name of the index
75
+ # @param [Array<String>] fields the lists of fields to create th index over
76
+ # @param [Options::Query::CreateIndex] options
77
+ #
78
+ # @return void
79
+ #
80
+ # @raise [Error::InvalidArgument]
81
+ # @raise [Error::IndexExists]
82
+ def create_index(index_name, fields, options = Options::Query::CreateIndex.new)
83
+ unless options.scope_name.nil?
84
+ raise Error::InvalidArgument,
85
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
86
+ end
87
+
88
+ unless options.collection_name.nil?
89
+ raise Error::InvalidArgument,
90
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
91
+ end
92
+
93
+ @backend.collection_query_index_create(@bucket_name, @scope_name, @collection_name, index_name, fields, options.to_backend)
94
+ end
95
+
96
+ # Creates new primary index
97
+ #
98
+ # @param [Options::Query::CreatePrimaryIndex] options
99
+ #
100
+ # @return void
101
+ #
102
+ # @raise [Error::InvalidArgument]
103
+ # @raise [Error::IndexExists]
104
+ def create_primary_index(options = Options::Query::CreatePrimaryIndex.new)
105
+ unless options.scope_name.nil?
106
+ raise Error::InvalidArgument,
107
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
108
+ end
109
+
110
+ unless options.collection_name.nil?
111
+ raise Error::InvalidArgument,
112
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
113
+ end
114
+
115
+ @backend.collection_query_index_create_primary(@bucket_name, @scope_name, @collection_name, options.to_backend)
116
+ end
117
+
118
+ # Drops the index
119
+ #
120
+ # @param [String] index_name name of the index
121
+ # @param [Options::Query::DropIndex] options
122
+ #
123
+ # @return void
124
+ #
125
+ # @raise [Error::InvalidArgument]
126
+ # @raise [Error::IndexNotFound]
127
+ def drop_index(index_name, options = Options::Query::DropIndex.new)
128
+ unless options.scope_name.nil?
129
+ raise Error::InvalidArgument,
130
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
131
+ end
132
+
133
+ unless options.collection_name.nil?
134
+ raise Error::InvalidArgument,
135
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
136
+ end
137
+
138
+ @backend.collection_query_index_drop(@bucket_name, @scope_name, @collection_name, index_name, options.to_backend)
139
+ end
140
+
141
+ # Drops the primary index
142
+ #
143
+ # @param [Options::Query::DropPrimaryIndex] options
144
+ #
145
+ # @return void
146
+ #
147
+ # @raise [Error::InvalidArgument]
148
+ # @raise [Error::IndexNotFound]
149
+ def drop_primary_index(options = Options::Query::DropPrimaryIndex.new)
150
+ unless options.scope_name.nil?
151
+ raise Error::InvalidArgument,
152
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
153
+ end
154
+
155
+ unless options.collection_name.nil?
156
+ raise Error::InvalidArgument,
157
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
158
+ end
159
+
160
+ @backend.collection_query_index_drop_primary(@bucket_name, @scope_name, @collection_name, options.to_backend)
161
+ end
162
+
163
+ # Build all indexes which are currently in deferred state
164
+ #
165
+ # @param [Options::Query::BuildDeferredIndexes] options
166
+ #
167
+ # @return void
168
+ #
169
+ # @raise [Error::InvalidArgument]
170
+ def build_deferred_indexes(options = Options::Query::BuildDeferredIndexes.new)
171
+ unless options.scope_name.nil?
172
+ raise Error::InvalidArgument,
173
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
174
+ end
175
+
176
+ unless options.collection_name.nil?
177
+ raise Error::InvalidArgument,
178
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
179
+ end
180
+
181
+ @backend.collection_query_index_build_deferred(@bucket_name, @scope_name, @collection_name, options.to_backend)
182
+ end
183
+
184
+ # Polls indexes until they are online
185
+ #
186
+ # @param [Array<String>] index_names names of the indexes to watch
187
+ # @param [Integer, #in_milliseconds] timeout the time in milliseconds allowed for the operation to complete
188
+ # @param [Options::Query::WatchIndexes] options
189
+ #
190
+ # @raise [Error::InvalidArgument]
191
+ # @raise [Error::IndexNotFound]
192
+ def watch_indexes(index_names, timeout, options = Options::Query::WatchIndexes.new)
193
+ unless options.scope_name.nil?
194
+ raise Error::InvalidArgument,
195
+ "Scope name cannot be set in the options when using the Query Index manager at the collection level"
196
+ end
197
+
198
+ unless options.collection_name.nil?
199
+ raise Error::InvalidArgument,
200
+ "Collection name cannot be set in the options when using the Query Index manager at the collection level"
201
+ end
202
+
203
+ index_names.append("#primary") if options.watch_primary
204
+
205
+ interval_millis = 50
206
+ deadline = Time.now + (Utils::Time.extract_duration(timeout) * 0.001)
207
+ while Time.now <= deadline
208
+ get_all_opts = Options::Query::GetAllIndexes.new(timeout: ((deadline - Time.now) * 1000).round)
209
+ indexes = get_all_indexes(get_all_opts).select { |idx| index_names.include? idx.name }
210
+ indexes_not_found = index_names - indexes.map(&:name)
211
+ raise Error::IndexNotFound, "Failed to find the indexes: #{indexes_not_found.join(', ')}" unless indexes_not_found.empty?
212
+
213
+ all_online = indexes.all? { |idx| idx.state == :online }
214
+ return if all_online
215
+
216
+ sleep(interval_millis / 1000)
217
+ interval_millis += 500
218
+ interval_millis = 1000 if interval_millis > 1000
219
+ end
220
+ raise Error::UnambiguousTimeout, "Failed to find all indexes online within the allotted time"
221
+ end
222
+ end
223
+ end
224
+ end