couchbase 3.5.2-x86_64-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,293 @@
|
|
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
|
+
module Couchbase
|
18
|
+
class LookupInSpec
|
19
|
+
# Fetches the content from a field (if present) at the given path
|
20
|
+
#
|
21
|
+
# @param [String, Symbol] path the path identifying where to get the value. When path is a symbol, the library will try to expand it as
|
22
|
+
# macro.
|
23
|
+
# @return [LookupInSpec]
|
24
|
+
def self.get(path)
|
25
|
+
case path
|
26
|
+
when Symbol
|
27
|
+
new(:get, expand_macro(path))
|
28
|
+
when ""
|
29
|
+
new(:get_doc, "")
|
30
|
+
else
|
31
|
+
new(:get, path)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Checks if a value at the given path exists in the document
|
36
|
+
#
|
37
|
+
# @param [String] path the path to check if the field exists
|
38
|
+
# @return [LookupInSpec]
|
39
|
+
def self.exists(path)
|
40
|
+
new(:exists, path)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Counts the number of values at a given path in the document
|
44
|
+
#
|
45
|
+
# @param [String] path the path identifying where to count the values
|
46
|
+
# @return [LookupInSpec]
|
47
|
+
def self.count(path)
|
48
|
+
new(:count, path)
|
49
|
+
end
|
50
|
+
|
51
|
+
def xattr
|
52
|
+
@xattr = true
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
def xattr?
|
57
|
+
@xattr
|
58
|
+
end
|
59
|
+
|
60
|
+
attr_reader :type
|
61
|
+
attr_reader :path
|
62
|
+
|
63
|
+
# @api private
|
64
|
+
#
|
65
|
+
# @param [Symbol] macro
|
66
|
+
# @raise [Error::XattrUnknownMacro] if the macro cannot be expanded
|
67
|
+
def self.expand_macro(macro)
|
68
|
+
case macro
|
69
|
+
when :document
|
70
|
+
"$document"
|
71
|
+
when :expiry_time, :expiration_time
|
72
|
+
"$document.exptime"
|
73
|
+
when :cas
|
74
|
+
"$document.CAS"
|
75
|
+
when :seq_no, :sequence_number
|
76
|
+
"$document.seqno"
|
77
|
+
when :last_modified
|
78
|
+
"$document.last_modified"
|
79
|
+
when :is_deleted
|
80
|
+
"$document.deleted"
|
81
|
+
when :value_size_bytes
|
82
|
+
"$document.value_bytes"
|
83
|
+
when :rev_id, :revision_id
|
84
|
+
"$document.revid"
|
85
|
+
else
|
86
|
+
raise Error::XattrUnknownMacro, "unknown macro #{macro}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
private_class_method :expand_macro
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
# @param [:get_doc, :get, :exists, :count] type of the lookup
|
95
|
+
# @param [String] path
|
96
|
+
def initialize(type, path)
|
97
|
+
@xattr = false
|
98
|
+
@type = type
|
99
|
+
@path = path
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class MutateInSpec
|
104
|
+
# Creates a command with the intention of replacing an existing value in a JSON document.
|
105
|
+
#
|
106
|
+
# If the path is empty (""), then the value will be used for the document's full body. Will
|
107
|
+
# error if the last element of the path does not exist.
|
108
|
+
#
|
109
|
+
# @param [String] path the path identifying where to replace the value.
|
110
|
+
# @param [Object, Symbol] value the value to replace with.
|
111
|
+
# When symbol specified and it is matches to known macro, it will be expanded
|
112
|
+
#
|
113
|
+
# @return [MutateInSpec]
|
114
|
+
def self.replace(path, value)
|
115
|
+
new(path.empty? ? :set_doc : :replace, path, value)
|
116
|
+
end
|
117
|
+
|
118
|
+
# Creates a command with the intention of inserting a new value in a JSON object.
|
119
|
+
#
|
120
|
+
# Will error if the last element of the path already exists.
|
121
|
+
#
|
122
|
+
# @param [String] path the path identifying where to insert the value.
|
123
|
+
# @param [Object, Symbol] value the value to insert.
|
124
|
+
# When symbol specified and it is matches to known macro, it will be expanded
|
125
|
+
#
|
126
|
+
# @return [MutateInSpec]
|
127
|
+
def self.insert(path, value)
|
128
|
+
new(:dict_add, path, value)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Creates a command with the intention of removing an existing value in a JSON object.
|
132
|
+
#
|
133
|
+
# Will error if the path does not exist.
|
134
|
+
#
|
135
|
+
# @param path the path identifying what to remove.
|
136
|
+
#
|
137
|
+
# @return [MutateInSpec]
|
138
|
+
def self.remove(path)
|
139
|
+
new(path.empty? ? :remove_doc : :remove, path, nil)
|
140
|
+
end
|
141
|
+
|
142
|
+
# Creates a command with the intention of upserting a value in a JSON object.
|
143
|
+
#
|
144
|
+
# That is, the value will be replaced if the path already exists, or inserted if not.
|
145
|
+
#
|
146
|
+
# @param [String] path the path identifying where to upsert the value.
|
147
|
+
# @param [Object, Symbol] value the value to upsert.
|
148
|
+
# When symbol specified and it is matches to known macro, it will be expanded
|
149
|
+
#
|
150
|
+
# @return [MutateInSpec]
|
151
|
+
def self.upsert(path, value)
|
152
|
+
new(:dict_upsert, path, value)
|
153
|
+
end
|
154
|
+
|
155
|
+
# Creates a command with the intention of appending a value to an existing JSON array.
|
156
|
+
#
|
157
|
+
# Will error if the last element of the path does not exist or is not an array.
|
158
|
+
#
|
159
|
+
# @param [String] path the path identifying an array to which to append the value.
|
160
|
+
# @param [Array] values the value(s) to append.
|
161
|
+
#
|
162
|
+
# @return [MutateInSpec]
|
163
|
+
def self.array_append(path, values)
|
164
|
+
new(:array_push_last, path, values)
|
165
|
+
end
|
166
|
+
|
167
|
+
# Creates a command with the intention of prepending a value to an existing JSON array.
|
168
|
+
#
|
169
|
+
# Will error if the last element of the path does not exist or is not an array.
|
170
|
+
#
|
171
|
+
# @param [String] path the path identifying an array to which to append the value.
|
172
|
+
# @param [Array] values the value(s) to prepend.
|
173
|
+
#
|
174
|
+
# @return [MutateInSpec]
|
175
|
+
def self.array_prepend(path, values)
|
176
|
+
new(:array_push_first, path, values)
|
177
|
+
end
|
178
|
+
|
179
|
+
# Creates a command with the intention of inserting a value into an existing JSON array.
|
180
|
+
#
|
181
|
+
# Will error if the last element of the path does not exist or is not an array.
|
182
|
+
#
|
183
|
+
# @param [String] path the path identifying an array to which to append the value, and an index. E.g. "foo.bar[3]"
|
184
|
+
# @param [Array] values the value(s) to insert.
|
185
|
+
#
|
186
|
+
# @return [MutateInSpec]
|
187
|
+
def self.array_insert(path, values)
|
188
|
+
new(:array_insert, path, values)
|
189
|
+
end
|
190
|
+
|
191
|
+
# Creates a command with the intent of inserting a value into an existing JSON array, but only if the value
|
192
|
+
# is not already contained in the array (by way of string comparison).
|
193
|
+
#
|
194
|
+
# Will error if the last element of the path does not exist or is not an array.
|
195
|
+
#
|
196
|
+
# @param [String] path the path identifying an array to which to append the value, and an index. E.g. "foo.bar[3]"
|
197
|
+
# @param [Object, Symbol] value the value to insert.
|
198
|
+
#
|
199
|
+
# @return [MutateInSpec]
|
200
|
+
def self.array_add_unique(path, value)
|
201
|
+
new(:array_add_unique, path, value)
|
202
|
+
end
|
203
|
+
|
204
|
+
# Creates a command with the intent of incrementing a numerical field in a JSON object.
|
205
|
+
#
|
206
|
+
# If the field does not exist, then it is created and takes the value of +delta+
|
207
|
+
#
|
208
|
+
# @param [String] path the path identifying a numerical field to adjust or create
|
209
|
+
# @param [Integer] delta the value to increment the field by
|
210
|
+
#
|
211
|
+
# @return [MutateInSpec]
|
212
|
+
def self.increment(path, delta)
|
213
|
+
new(:counter, path, delta.abs)
|
214
|
+
end
|
215
|
+
|
216
|
+
# Creates a command with the intent of decrementing a numerical field in a JSON object.
|
217
|
+
#
|
218
|
+
# If the field does not exist, then it is created and takes the value of +delta+ * -1
|
219
|
+
#
|
220
|
+
# @param [String] path the path identifying a numerical field to adjust or create
|
221
|
+
# @param [Integer] delta the value to decrement the field by
|
222
|
+
#
|
223
|
+
# @return [MutateInSpec]
|
224
|
+
def self.decrement(path, delta)
|
225
|
+
new(:counter, path, -1 * delta.abs)
|
226
|
+
end
|
227
|
+
|
228
|
+
def xattr
|
229
|
+
@xattr = true
|
230
|
+
self
|
231
|
+
end
|
232
|
+
|
233
|
+
def create_path
|
234
|
+
@create_path = true
|
235
|
+
self
|
236
|
+
end
|
237
|
+
|
238
|
+
def xattr?
|
239
|
+
@xattr
|
240
|
+
end
|
241
|
+
|
242
|
+
def create_path?
|
243
|
+
@create_path
|
244
|
+
end
|
245
|
+
|
246
|
+
def expand_macros?
|
247
|
+
@expand_macros
|
248
|
+
end
|
249
|
+
|
250
|
+
CAS = "${Mutation.CAS}"
|
251
|
+
SEQ_NO = "${Mutation.seqno}"
|
252
|
+
VALUE_CRC32C = "${Mutation.value_crc32c}"
|
253
|
+
|
254
|
+
attr_reader :type
|
255
|
+
attr_reader :path
|
256
|
+
attr_reader :param
|
257
|
+
|
258
|
+
private
|
259
|
+
|
260
|
+
def initialize(type, path, param)
|
261
|
+
@create_path = false
|
262
|
+
@param = nil
|
263
|
+
@xattr = false
|
264
|
+
@type = type
|
265
|
+
@path = path
|
266
|
+
@param =
|
267
|
+
case param
|
268
|
+
when :cas
|
269
|
+
CAS
|
270
|
+
when :seq_no, :sequence_number
|
271
|
+
SEQ_NO
|
272
|
+
when :value_crc32c, :value_crc
|
273
|
+
VALUE_CRC32C
|
274
|
+
else
|
275
|
+
param
|
276
|
+
end
|
277
|
+
# Only set expand_macros when a the value is a symbol that matches one of the macros
|
278
|
+
@expand_macros = [:cas, :seq_no, :sequence_number, :value_crc, :value_crc32c].include?(param)
|
279
|
+
@xattr = true if @expand_macros
|
280
|
+
return if @param.nil?
|
281
|
+
|
282
|
+
@param =
|
283
|
+
case type
|
284
|
+
when :counter
|
285
|
+
@param.to_i
|
286
|
+
when :array_push_first, :array_push_last, :array_insert
|
287
|
+
@param.map { |entry| JSON.generate(entry) }.join(",")
|
288
|
+
else
|
289
|
+
JSON.generate(@param)
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
@@ -0,0 +1,64 @@
|
|
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
|
+
module Couchbase
|
18
|
+
# @api private
|
19
|
+
class TranscoderFlags
|
20
|
+
FORMAT_MAP = {
|
21
|
+
reserved: 0,
|
22
|
+
private: 1,
|
23
|
+
json: 2,
|
24
|
+
binary: 3,
|
25
|
+
string: 4,
|
26
|
+
}.freeze
|
27
|
+
INV_FORMAT_MAP = FORMAT_MAP.invert.freeze
|
28
|
+
|
29
|
+
COMPRESSION_MAP = {none: 0}.freeze
|
30
|
+
INV_COMPRESSION_MAP = COMPRESSION_MAP.invert
|
31
|
+
|
32
|
+
attr_reader :format
|
33
|
+
attr_reader :compression
|
34
|
+
attr_reader :lower_bits
|
35
|
+
|
36
|
+
def initialize(format:, compression: :none, lower_bits: 0)
|
37
|
+
@format = format
|
38
|
+
@compression = compression
|
39
|
+
@lower_bits = lower_bits
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.decode(flags)
|
43
|
+
return TranscoderFlags.new(format: flags) if flags.is_a?(Symbol)
|
44
|
+
|
45
|
+
common_flags = flags >> 24
|
46
|
+
lower_bits = flags & 0x00ffff
|
47
|
+
|
48
|
+
return TranscoderFlags.new(format: nil, lower_bits: lower_bits) if common_flags.zero?
|
49
|
+
|
50
|
+
compression_bits = common_flags >> 5
|
51
|
+
format_bits = common_flags & 0x0f
|
52
|
+
TranscoderFlags.new(
|
53
|
+
format: INV_FORMAT_MAP[format_bits],
|
54
|
+
compression: INV_COMPRESSION_MAP[compression_bits],
|
55
|
+
lower_bits: lower_bits
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
def encode
|
60
|
+
common_flags = (COMPRESSION_MAP[@compression] << 5) | FORMAT_MAP[@format]
|
61
|
+
(common_flags << 24) | @lower_bits
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2021 Couchbase, Inc.
|
4
|
+
# Copyright 2020-Present Couchbase, Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require "time"
|
19
|
+
|
20
|
+
module Couchbase
|
21
|
+
module Utils
|
22
|
+
class GenericLoggerAdapter
|
23
|
+
DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%6N"
|
24
|
+
|
25
|
+
def initialize(logger, verbose: false)
|
26
|
+
@logger = logger
|
27
|
+
@verbose = verbose
|
28
|
+
end
|
29
|
+
|
30
|
+
def log(level, thread_id, seconds, nanoseconds, payload, filename, line, function)
|
31
|
+
return unless @logger.respond_to?(level)
|
32
|
+
|
33
|
+
progname = "cxxcbc##{thread_id}"
|
34
|
+
payload += " at #{filename}:#{line} #{function}" if @verbose && filename
|
35
|
+
@logger.send(level,
|
36
|
+
"[#{::Time.at(seconds, nanoseconds, :nanosecond).strftime(DATETIME_FORMAT)} #{progname}] #{level} -- #{payload}")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2021 Couchbase, Inc.
|
4
|
+
# Copyright 2020-Present Couchbase, Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require "logger"
|
19
|
+
require "time"
|
20
|
+
|
21
|
+
module Couchbase
|
22
|
+
module Utils
|
23
|
+
class StdlibLoggerAdapter
|
24
|
+
def initialize(logger, verbose: false)
|
25
|
+
raise ArgumentError, "logger argument must be or derive from stdlib Logger class" unless logger.is_a?(::Logger)
|
26
|
+
|
27
|
+
@logger = logger
|
28
|
+
@verbose = verbose
|
29
|
+
end
|
30
|
+
|
31
|
+
def log(level, thread_id, seconds, nanoseconds, payload, filename, line, function)
|
32
|
+
logdev = @logger.instance_variable_get(:@logdev)
|
33
|
+
return unless logdev
|
34
|
+
|
35
|
+
severity = map_spdlog_level(level)
|
36
|
+
return unless severity
|
37
|
+
|
38
|
+
progname = "cxxcbc##{thread_id}"
|
39
|
+
payload += " at #{filename}:#{line} #{function}" if @verbose && filename
|
40
|
+
logdev.write(
|
41
|
+
@logger.send(:format_message, @logger.send(:format_severity, severity), ::Time.at(seconds, nanoseconds, :nanosecond), progname,
|
42
|
+
payload)
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def map_spdlog_level(level)
|
49
|
+
case level
|
50
|
+
when :trace, :debug
|
51
|
+
::Logger::Severity::DEBUG
|
52
|
+
when :info
|
53
|
+
::Logger::Severity::INFO
|
54
|
+
when :warn
|
55
|
+
::Logger::Severity::WARN
|
56
|
+
when :error
|
57
|
+
::Logger::Severity::ERROR
|
58
|
+
when :critical
|
59
|
+
::Logger::Severity::FATAL
|
60
|
+
else # rubocop:disable Style/EmptyElse
|
61
|
+
# covers :off
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,71 @@
|
|
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 "time"
|
18
|
+
|
19
|
+
module Couchbase
|
20
|
+
module Utils
|
21
|
+
# Various Time utilities
|
22
|
+
module Time
|
23
|
+
RELATIVE_EXPIRY_CUTOFF_SECONDS = 30 * 24 * 60 * 60
|
24
|
+
WORKAROUND_EXPIRY_CUTOFF_SECONDS = 50 * 365 * 24 * 60 * 60
|
25
|
+
|
26
|
+
module_function
|
27
|
+
|
28
|
+
# @param [Integer, #in_seconds, Time, nil] time_or_duration expiration time to associate with the document
|
29
|
+
def extract_expiry_time(time_or_duration)
|
30
|
+
if time_or_duration.respond_to?(:in_seconds) # Duration
|
31
|
+
[:duration, time_or_duration.in_seconds]
|
32
|
+
elsif time_or_duration.respond_to?(:tv_sec) # Time
|
33
|
+
[:time_point, time_or_duration.tv_sec]
|
34
|
+
elsif time_or_duration.is_a?(Integer)
|
35
|
+
if time_or_duration < RELATIVE_EXPIRY_CUTOFF_SECONDS
|
36
|
+
# looks like valid relative duration as specified in protocol (less than 30 days)
|
37
|
+
[:duration, time_or_duration]
|
38
|
+
elsif time_or_duration > WORKAROUND_EXPIRY_CUTOFF_SECONDS
|
39
|
+
effective_expiry = ::Time.at(time_or_duration).utc
|
40
|
+
warn "The specified expiry duration #{time_or_duration} is longer than 50 years. For bug-compatibility " \
|
41
|
+
"with previous versions of SDK 3.0.x, the number of seconds in the duration will be interpreted as " \
|
42
|
+
"the epoch second when the document should expire (#{effective_expiry}). Stuffing an epoch second " \
|
43
|
+
"into a Duration is deprecated and will no longer work in SDK 3.1. Consider using Time instance instead."
|
44
|
+
[:time_point, time_or_duration]
|
45
|
+
else
|
46
|
+
[:time_point, ::Time.now.tv_sec + time_or_duration]
|
47
|
+
end
|
48
|
+
else
|
49
|
+
[:duration, time_or_duration]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# This method converts its argument to milliseconds
|
54
|
+
#
|
55
|
+
# 1. Integer values are interpreted as a number of milliseconds
|
56
|
+
# 2. If the argument is a Duration-like object and responds to #in_milliseconds,
|
57
|
+
# then use it and convert result to Integer
|
58
|
+
# 3. Otherwise invoke #to_i on the argument and interpret it as a number of milliseconds
|
59
|
+
def extract_duration(number_or_duration)
|
60
|
+
return unless number_or_duration
|
61
|
+
return number_or_duration if number_or_duration.class == Integer # rubocop:disable Style/ClassEqualityComparison avoid overrides of #is_a?, #kind_of?
|
62
|
+
|
63
|
+
if number_or_duration.respond_to?(:in_milliseconds)
|
64
|
+
number_or_duration.in_milliseconds
|
65
|
+
else
|
66
|
+
number_or_duration
|
67
|
+
end.to_i
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,23 @@
|
|
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
|
+
module Couchbase
|
18
|
+
# Module for internal tools, extensions and utilities
|
19
|
+
module Utils
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
require "couchbase/utils/time"
|
@@ -0,0 +1,25 @@
|
|
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
|
+
module Couchbase
|
18
|
+
# Version of the library and all bundled dependencies
|
19
|
+
#
|
20
|
+
# @example Display version (+Couchbase::BUILD_INFO+ contains more details)
|
21
|
+
# $ ruby -rcouchbase -e 'pp Couchbase::VERSION'
|
22
|
+
# {:sdk=>"3.4.0", :ruby_abi=>"3.1.0", :revision=>"416fe68e6029ec8a4c40611cf6e6b30d3b90d20f"}
|
23
|
+
VERSION = {} unless defined?(VERSION) # rubocop:disable Style/MutableConstant
|
24
|
+
VERSION.update(:sdk => "3.5.2")
|
25
|
+
end
|
@@ -0,0 +1,67 @@
|
|
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 "json"
|
18
|
+
|
19
|
+
module Couchbase
|
20
|
+
class Bucket
|
21
|
+
class ViewRow
|
22
|
+
# @return [String]
|
23
|
+
attr_accessor :id
|
24
|
+
|
25
|
+
# @return [#to_json]
|
26
|
+
attr_accessor :key
|
27
|
+
|
28
|
+
# @return [#to_json]
|
29
|
+
attr_accessor :value
|
30
|
+
|
31
|
+
# @yieldparam [ViewRow] self
|
32
|
+
def initialize
|
33
|
+
yield self if block_given?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class ViewMetaData
|
38
|
+
# @return [Integer]
|
39
|
+
attr_accessor :total_rows
|
40
|
+
|
41
|
+
# @api private
|
42
|
+
attr_writer :debug_info
|
43
|
+
|
44
|
+
def debug
|
45
|
+
JSON.parse(@debug_info)
|
46
|
+
end
|
47
|
+
|
48
|
+
# @yieldparam [ViewMetaData] self
|
49
|
+
def initialize
|
50
|
+
yield self if block_given?
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class ViewResult
|
55
|
+
# @return [ViewMetaData] returns object representing additional metadata associated with this query
|
56
|
+
attr_accessor :meta_data
|
57
|
+
|
58
|
+
# @return [Array<ViewRow>]
|
59
|
+
attr_accessor :rows
|
60
|
+
|
61
|
+
# @yieldparam [ViewResult] self
|
62
|
+
def initialize
|
63
|
+
yield self if block_given?
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/couchbase.rb
ADDED
@@ -0,0 +1,30 @@
|
|
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 "couchbase/version"
|
18
|
+
require "couchbase/libcouchbase"
|
19
|
+
require "couchbase/logger"
|
20
|
+
require "couchbase/cluster"
|
21
|
+
|
22
|
+
require "couchbase/railtie" if defined?(Rails)
|
23
|
+
|
24
|
+
# @!macro uncommitted
|
25
|
+
# @couchbase.stability
|
26
|
+
# Uncommitted: This API may change in the future.
|
27
|
+
#
|
28
|
+
# @!macro volatile
|
29
|
+
# @couchbase.stability
|
30
|
+
# Volatile: This API is subject to change at any time.
|