couchbase 3.0.0.alpha.1 → 3.0.0.alpha.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/tests-6.0.3.yml +49 -0
- data/.github/workflows/tests.yml +47 -0
- data/.gitmodules +3 -0
- data/.idea/dictionaries/gem_terms.xml +5 -0
- data/.idea/inspectionProfiles/Project_Default.xml +1 -0
- data/.idea/vcs.xml +1 -0
- data/Gemfile +1 -0
- data/README.md +55 -2
- data/Rakefile +18 -0
- data/bin/init-cluster +62 -0
- data/bin/setup +1 -0
- data/couchbase.gemspec +3 -2
- data/examples/crud.rb +1 -2
- data/examples/managing_buckets.rb +47 -0
- data/examples/managing_collections.rb +58 -0
- data/examples/managing_query_indexes.rb +63 -0
- data/examples/query.rb +3 -2
- data/examples/query_with_consistency.rb +76 -0
- data/examples/subdocument.rb +23 -1
- data/ext/.clang-format +1 -1
- data/ext/.idea/dictionaries/couchbase_terms.xml +2 -0
- data/ext/.idea/vcs.xml +1 -0
- data/ext/CMakeLists.txt +30 -12
- data/ext/build_version.hxx.in +26 -0
- data/ext/couchbase/bucket.hxx +69 -8
- data/ext/couchbase/cluster.hxx +70 -54
- data/ext/couchbase/collections_manifest.hxx +3 -3
- data/ext/couchbase/configuration.hxx +14 -0
- data/ext/couchbase/couchbase.cxx +2044 -383
- data/ext/couchbase/{operations/document_id.hxx → document_id.hxx} +5 -4
- data/ext/couchbase/io/http_message.hxx +5 -1
- data/ext/couchbase/io/http_parser.hxx +2 -1
- data/ext/couchbase/io/http_session.hxx +6 -3
- data/ext/couchbase/io/{binary_message.hxx → mcbp_message.hxx} +15 -12
- data/ext/couchbase/io/mcbp_parser.hxx +99 -0
- data/ext/couchbase/io/{key_value_session.hxx → mcbp_session.hxx} +200 -95
- data/ext/couchbase/io/session_manager.hxx +37 -22
- data/ext/couchbase/mutation_token.hxx +2 -1
- data/ext/couchbase/operations.hxx +38 -8
- data/ext/couchbase/operations/bucket_create.hxx +138 -0
- data/ext/couchbase/operations/bucket_drop.hxx +65 -0
- data/ext/couchbase/operations/bucket_flush.hxx +65 -0
- data/ext/couchbase/operations/bucket_get.hxx +69 -0
- data/ext/couchbase/operations/bucket_get_all.hxx +62 -0
- data/ext/couchbase/operations/bucket_settings.hxx +111 -0
- data/ext/couchbase/operations/bucket_update.hxx +115 -0
- data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +60 -0
- data/ext/couchbase/operations/collection_create.hxx +86 -0
- data/ext/couchbase/operations/collection_drop.hxx +82 -0
- data/ext/couchbase/operations/command.hxx +10 -10
- data/ext/couchbase/operations/document_decrement.hxx +80 -0
- data/ext/couchbase/operations/document_exists.hxx +80 -0
- data/ext/couchbase/operations/{get.hxx → document_get.hxx} +4 -2
- data/ext/couchbase/operations/document_get_and_lock.hxx +64 -0
- data/ext/couchbase/operations/document_get_and_touch.hxx +64 -0
- data/ext/couchbase/operations/document_increment.hxx +80 -0
- data/ext/couchbase/operations/document_insert.hxx +74 -0
- data/ext/couchbase/operations/{lookup_in.hxx → document_lookup_in.hxx} +2 -2
- data/ext/couchbase/operations/{mutate_in.hxx → document_mutate_in.hxx} +11 -2
- data/ext/couchbase/operations/{query.hxx → document_query.hxx} +101 -6
- data/ext/couchbase/operations/document_remove.hxx +67 -0
- data/ext/couchbase/operations/document_replace.hxx +76 -0
- data/ext/couchbase/operations/{upsert.hxx → document_touch.hxx} +14 -14
- data/ext/couchbase/operations/{remove.hxx → document_unlock.hxx} +12 -10
- data/ext/couchbase/operations/document_upsert.hxx +74 -0
- data/ext/couchbase/operations/query_index_build_deferred.hxx +85 -0
- data/ext/couchbase/operations/query_index_create.hxx +134 -0
- data/ext/couchbase/operations/query_index_drop.hxx +108 -0
- data/ext/couchbase/operations/query_index_get_all.hxx +106 -0
- data/ext/couchbase/operations/scope_create.hxx +81 -0
- data/ext/couchbase/operations/scope_drop.hxx +79 -0
- data/ext/couchbase/operations/scope_get_all.hxx +72 -0
- data/ext/couchbase/protocol/client_opcode.hxx +35 -0
- data/ext/couchbase/protocol/client_request.hxx +56 -9
- data/ext/couchbase/protocol/client_response.hxx +52 -15
- data/ext/couchbase/protocol/cmd_cluster_map_change_notification.hxx +81 -0
- data/ext/couchbase/protocol/cmd_decrement.hxx +187 -0
- data/ext/couchbase/protocol/cmd_exists.hxx +171 -0
- data/ext/couchbase/protocol/cmd_get.hxx +31 -8
- data/ext/couchbase/protocol/cmd_get_and_lock.hxx +142 -0
- data/ext/couchbase/protocol/cmd_get_and_touch.hxx +142 -0
- data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +16 -3
- data/ext/couchbase/protocol/cmd_get_collections_manifest.hxx +16 -3
- data/ext/couchbase/protocol/cmd_get_error_map.hxx +16 -3
- data/ext/couchbase/protocol/cmd_hello.hxx +24 -8
- data/ext/couchbase/protocol/cmd_increment.hxx +187 -0
- data/ext/couchbase/protocol/cmd_info.hxx +1 -0
- data/ext/couchbase/protocol/cmd_insert.hxx +172 -0
- data/ext/couchbase/protocol/cmd_lookup_in.hxx +28 -13
- data/ext/couchbase/protocol/cmd_mutate_in.hxx +65 -13
- data/ext/couchbase/protocol/cmd_remove.hxx +59 -4
- data/ext/couchbase/protocol/cmd_replace.hxx +172 -0
- data/ext/couchbase/protocol/cmd_sasl_auth.hxx +15 -3
- data/ext/couchbase/protocol/cmd_sasl_list_mechs.hxx +15 -3
- data/ext/couchbase/protocol/cmd_sasl_step.hxx +15 -3
- data/ext/couchbase/protocol/cmd_select_bucket.hxx +14 -2
- data/ext/couchbase/protocol/cmd_touch.hxx +102 -0
- data/ext/couchbase/protocol/cmd_unlock.hxx +95 -0
- data/ext/couchbase/protocol/cmd_upsert.hxx +50 -14
- data/ext/couchbase/protocol/durability_level.hxx +67 -0
- data/ext/couchbase/protocol/frame_info_id.hxx +187 -0
- data/ext/couchbase/protocol/hello_feature.hxx +137 -0
- data/ext/couchbase/protocol/server_opcode.hxx +57 -0
- data/ext/couchbase/protocol/server_request.hxx +122 -0
- data/ext/couchbase/protocol/unsigned_leb128.h +15 -15
- data/ext/couchbase/utils/byteswap.hxx +1 -2
- data/ext/couchbase/utils/url_codec.hxx +225 -0
- data/ext/couchbase/version.hxx +3 -1
- data/ext/extconf.rb +4 -1
- data/ext/test/main.cxx +37 -113
- data/ext/third_party/snappy/.appveyor.yml +36 -0
- data/ext/third_party/snappy/.gitignore +8 -0
- data/ext/third_party/snappy/.travis.yml +98 -0
- data/ext/third_party/snappy/AUTHORS +1 -0
- data/ext/third_party/snappy/CMakeLists.txt +345 -0
- data/ext/third_party/snappy/CONTRIBUTING.md +26 -0
- data/ext/third_party/snappy/COPYING +54 -0
- data/ext/third_party/snappy/NEWS +188 -0
- data/ext/third_party/snappy/README.md +148 -0
- data/ext/third_party/snappy/cmake/SnappyConfig.cmake.in +33 -0
- data/ext/third_party/snappy/cmake/config.h.in +59 -0
- data/ext/third_party/snappy/docs/README.md +72 -0
- data/ext/third_party/snappy/format_description.txt +110 -0
- data/ext/third_party/snappy/framing_format.txt +135 -0
- data/ext/third_party/snappy/snappy-c.cc +90 -0
- data/ext/third_party/snappy/snappy-c.h +138 -0
- data/ext/third_party/snappy/snappy-internal.h +315 -0
- data/ext/third_party/snappy/snappy-sinksource.cc +121 -0
- data/ext/third_party/snappy/snappy-sinksource.h +182 -0
- data/ext/third_party/snappy/snappy-stubs-internal.cc +42 -0
- data/ext/third_party/snappy/snappy-stubs-internal.h +493 -0
- data/ext/third_party/snappy/snappy-stubs-public.h.in +63 -0
- data/ext/third_party/snappy/snappy-test.cc +613 -0
- data/ext/third_party/snappy/snappy-test.h +526 -0
- data/ext/third_party/snappy/snappy.cc +1770 -0
- data/ext/third_party/snappy/snappy.h +209 -0
- data/ext/third_party/snappy/snappy_compress_fuzzer.cc +60 -0
- data/ext/third_party/snappy/snappy_uncompress_fuzzer.cc +58 -0
- data/ext/third_party/snappy/snappy_unittest.cc +1512 -0
- data/ext/third_party/snappy/testdata/alice29.txt +3609 -0
- data/ext/third_party/snappy/testdata/asyoulik.txt +4122 -0
- data/ext/third_party/snappy/testdata/baddata1.snappy +0 -0
- data/ext/third_party/snappy/testdata/baddata2.snappy +0 -0
- data/ext/third_party/snappy/testdata/baddata3.snappy +0 -0
- data/ext/third_party/snappy/testdata/fireworks.jpeg +0 -0
- data/ext/third_party/snappy/testdata/geo.protodata +0 -0
- data/ext/third_party/snappy/testdata/html +1 -0
- data/ext/third_party/snappy/testdata/html_x_4 +1 -0
- data/ext/third_party/snappy/testdata/kppkn.gtb +0 -0
- data/ext/third_party/snappy/testdata/lcet10.txt +7519 -0
- data/ext/third_party/snappy/testdata/paper-100k.pdf +600 -2
- data/ext/third_party/snappy/testdata/plrabn12.txt +10699 -0
- data/ext/third_party/snappy/testdata/urls.10K +10000 -0
- data/lib/couchbase/binary_collection.rb +33 -76
- data/lib/couchbase/binary_collection_options.rb +94 -0
- data/lib/couchbase/bucket.rb +9 -3
- data/lib/couchbase/cluster.rb +161 -23
- data/lib/couchbase/collection.rb +108 -191
- data/lib/couchbase/collection_options.rb +430 -0
- data/lib/couchbase/errors.rb +136 -134
- data/lib/couchbase/json_transcoder.rb +32 -0
- data/lib/couchbase/management/analytics_index_manager.rb +185 -9
- data/lib/couchbase/management/bucket_manager.rb +84 -33
- data/lib/couchbase/management/collection_manager.rb +166 -1
- data/lib/couchbase/management/query_index_manager.rb +261 -0
- data/lib/couchbase/management/search_index_manager.rb +291 -0
- data/lib/couchbase/management/user_manager.rb +12 -10
- data/lib/couchbase/management/view_index_manager.rb +151 -1
- data/lib/couchbase/mutation_state.rb +11 -1
- data/lib/couchbase/scope.rb +4 -4
- data/lib/couchbase/version.rb +1 -1
- metadata +113 -18
- data/.travis.yml +0 -7
- data/ext/couchbase/io/binary_parser.hxx +0 -64
- data/lib/couchbase/results.rb +0 -307
data/lib/couchbase/collection.rb
CHANGED
@@ -12,9 +12,9 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
15
|
+
require "couchbase/errors"
|
16
|
+
require "couchbase/collection_options"
|
17
|
+
require "couchbase/binary_collection"
|
18
18
|
|
19
19
|
module Couchbase
|
20
20
|
class Collection
|
@@ -26,8 +26,8 @@ module Couchbase
|
|
26
26
|
|
27
27
|
# @param [Couchbase::Backend] backend
|
28
28
|
# @param [String] bucket_name name of the bucket
|
29
|
-
# @param [String, :
|
30
|
-
# @param [String, :
|
29
|
+
# @param [String, :_default] scope_name name of the scope
|
30
|
+
# @param [String, :_default] collection_name name of the collection
|
31
31
|
def initialize(backend, bucket_name, scope_name, collection_name)
|
32
32
|
@backend = backend
|
33
33
|
@bucket_name = bucket_name
|
@@ -43,16 +43,18 @@ module Couchbase
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# Fetches the full document from the collection
|
46
|
-
#
|
46
|
+
#
|
47
47
|
# @param [String] id the document id which is used to uniquely identify it
|
48
48
|
# @param [GetOptions] options request customization
|
49
|
-
#
|
49
|
+
#
|
50
50
|
# @return [GetResult]
|
51
51
|
def get(id, options = GetOptions.new)
|
52
|
-
resp = @backend.
|
52
|
+
resp = @backend.document_get(bucket_name, "#{@scope_name}.#{@name}", id)
|
53
53
|
GetResult.new do |res|
|
54
|
+
res.transcoder = options.transcoder
|
54
55
|
res.cas = resp[:cas]
|
55
|
-
res.
|
56
|
+
res.flags = resp[:flags]
|
57
|
+
res.encoded = resp[:content]
|
56
58
|
end
|
57
59
|
end
|
58
60
|
|
@@ -61,24 +63,40 @@ module Couchbase
|
|
61
63
|
# @param [String] id the document id which is used to uniquely identify it.
|
62
64
|
# @param [Integer] lock_time how long to lock the document (values over 30 seconds will be capped)
|
63
65
|
# @param [GetAndLockOptions] options request customization
|
64
|
-
#
|
66
|
+
#
|
65
67
|
# @return [GetResult]
|
66
|
-
def get_and_lock(id, lock_time, options = GetAndLockOptions.new)
|
68
|
+
def get_and_lock(id, lock_time, options = GetAndLockOptions.new)
|
69
|
+
resp = @backend.document_get_and_lock(bucket_name, "#{@scope_name}.#{@name}", id, lock_time)
|
70
|
+
GetResult.new do |res|
|
71
|
+
res.transcoder = options.transcoder
|
72
|
+
res.cas = resp[:cas]
|
73
|
+
res.flags = resp[:flags]
|
74
|
+
res.encoded = resp[:content]
|
75
|
+
end
|
76
|
+
end
|
67
77
|
|
68
78
|
# Fetches a full document and resets its expiration time to the expiration duration provided
|
69
79
|
#
|
70
80
|
# @param [String] id the document id which is used to uniquely identify it.
|
71
81
|
# @param [Integer] expiration the new expiration time for the document
|
72
82
|
# @param [GetAndTouchOptions] options request customization
|
73
|
-
#
|
83
|
+
#
|
74
84
|
# @return [GetResult]
|
75
|
-
def get_and_touch(id, expiration, options = GetAndTouchOptions.new)
|
85
|
+
def get_and_touch(id, expiration, options = GetAndTouchOptions.new)
|
86
|
+
resp = @backend.document_get_and_touch(bucket_name, "#{@scope_name}.#{@name}", id, expiration)
|
87
|
+
GetResult.new do |res|
|
88
|
+
res.transcoder = options.transcoder
|
89
|
+
res.cas = resp[:cas]
|
90
|
+
res.flags = resp[:flags]
|
91
|
+
res.encoded = resp[:content]
|
92
|
+
end
|
93
|
+
end
|
76
94
|
|
77
95
|
# Reads from all available replicas and the active node and returns the results
|
78
|
-
#
|
96
|
+
#
|
79
97
|
# @param [String] id the document id which is used to uniquely identify it.
|
80
98
|
# @param [GetAllReplicasOptions] options request customization
|
81
|
-
#
|
99
|
+
#
|
82
100
|
# @return [Array<GetReplicaResult>]
|
83
101
|
def get_all_replicas(id, options = GetAllReplicasOptions.new) end
|
84
102
|
|
@@ -91,12 +109,19 @@ module Couchbase
|
|
91
109
|
def get_any_replica(id, options = GetAnyReplicaOptions.new) end
|
92
110
|
|
93
111
|
# Checks if the given document ID exists on the active partition.
|
94
|
-
#
|
112
|
+
#
|
95
113
|
# @param [String] id the document id which is used to uniquely identify it.
|
96
114
|
# @param [ExistsOptions] options request customization
|
97
115
|
#
|
98
116
|
# @return [ExistsResult]
|
99
|
-
def exists(id, options = ExistsOptions.new)
|
117
|
+
def exists(id, options = ExistsOptions.new)
|
118
|
+
resp = @backend.document_exists(bucket_name, "#{@scope_name}.#{@name}", id)
|
119
|
+
ExistsResult.new do |res|
|
120
|
+
res.status = resp[:status]
|
121
|
+
res.partition_id = resp[:partition_id]
|
122
|
+
res.cas = resp[:cas] if res.status != :not_found
|
123
|
+
end
|
124
|
+
end
|
100
125
|
|
101
126
|
# Removes a document from the collection
|
102
127
|
#
|
@@ -105,59 +130,97 @@ module Couchbase
|
|
105
130
|
#
|
106
131
|
# @return [MutationResult]
|
107
132
|
def remove(id, options = RemoveOptions.new)
|
108
|
-
resp = @backend.
|
133
|
+
resp = @backend.document_remove(bucket_name, "#{@scope_name}.#{@name}", id, {
|
134
|
+
durability_level: options.durability_level
|
135
|
+
})
|
109
136
|
MutationResult.new do |res|
|
110
137
|
res.cas = resp[:cas]
|
138
|
+
res.mutation_token = extract_mutation_token(resp)
|
111
139
|
end
|
112
140
|
end
|
113
141
|
|
114
142
|
# Inserts a full document which does not exist yet
|
115
|
-
#
|
143
|
+
#
|
116
144
|
# @param [String] id the document id which is used to uniquely identify it.
|
117
145
|
# @param [Object] content the document content to insert
|
118
146
|
# @param [InsertOptions] options request customization
|
119
147
|
#
|
120
148
|
# @return [MutationResult]
|
121
|
-
def insert(id, content, options = InsertOptions.new)
|
149
|
+
def insert(id, content, options = InsertOptions.new)
|
150
|
+
blob, flags = options.transcoder.encode(content)
|
151
|
+
resp = @backend.document_insert(bucket_name, "#{@scope_name}.#{@name}", id, blob, flags, {
|
152
|
+
durability_level: options.durability_level,
|
153
|
+
expiration: options.expiration,
|
154
|
+
})
|
155
|
+
MutationResult.new do |res|
|
156
|
+
res.cas = resp[:cas]
|
157
|
+
res.mutation_token = extract_mutation_token(resp)
|
158
|
+
end
|
159
|
+
end
|
122
160
|
|
123
161
|
# Upserts (inserts or updates) a full document which might or might not exist yet
|
124
|
-
#
|
162
|
+
#
|
125
163
|
# @param [String] id the document id which is used to uniquely identify it.
|
126
164
|
# @param [Object] content the document content to upsert
|
127
165
|
# @param [UpsertOptions] options request customization
|
128
166
|
#
|
129
167
|
# @return [MutationResult]
|
130
168
|
def upsert(id, content, options = UpsertOptions.new)
|
131
|
-
|
169
|
+
blob, flags = options.transcoder.encode(content)
|
170
|
+
resp = @backend.document_upsert(bucket_name, "#{@scope_name}.#{@name}", id, blob, flags, {
|
171
|
+
durability_level: options.durability_level,
|
172
|
+
expiration: options.expiration,
|
173
|
+
})
|
132
174
|
MutationResult.new do |res|
|
133
175
|
res.cas = resp[:cas]
|
176
|
+
res.mutation_token = extract_mutation_token(resp)
|
134
177
|
end
|
135
178
|
end
|
136
179
|
|
137
180
|
# Replaces a full document which already exists
|
138
|
-
#
|
181
|
+
#
|
139
182
|
# @param [String] id the document id which is used to uniquely identify it.
|
140
183
|
# @param [Object] content the document content to upsert
|
141
184
|
# @param [ReplaceOptions] options request customization
|
142
185
|
#
|
143
186
|
# @return [MutationResult]
|
144
|
-
def replace(id, content, options = ReplaceOptions.new)
|
187
|
+
def replace(id, content, options = ReplaceOptions.new)
|
188
|
+
blob, flags = options.transcoder.encode(content)
|
189
|
+
resp = @backend.document_replace(bucket_name, "#{@scope_name}.#{@name}", id, blob, flags, {
|
190
|
+
durability_level: options.durability_level,
|
191
|
+
expiration: options.expiration,
|
192
|
+
cas: options.cas,
|
193
|
+
})
|
194
|
+
MutationResult.new do |res|
|
195
|
+
res.cas = resp[:cas]
|
196
|
+
res.mutation_token = extract_mutation_token(resp)
|
197
|
+
end
|
198
|
+
end
|
145
199
|
|
146
200
|
# Update the expiration of the document with the given id
|
147
|
-
#
|
201
|
+
#
|
148
202
|
# @param [String] id the document id which is used to uniquely identify it.
|
149
203
|
# @param [Integer] expiration new expiration time for the document
|
150
204
|
# @param [TouchOptions] options request customization
|
151
205
|
#
|
152
206
|
# @return [MutationResult]
|
153
|
-
def touch(id, expiration, options = TouchOptions.new)
|
207
|
+
def touch(id, expiration, options = TouchOptions.new)
|
208
|
+
resp = @backend.document_touch(bucket_name, "#{@scope_name}.#{@name}", id, expiration)
|
209
|
+
MutationResult.new do |res|
|
210
|
+
res.cas = resp[:cas]
|
211
|
+
end
|
212
|
+
end
|
154
213
|
|
155
214
|
# Unlocks a document if it has been locked previously
|
156
|
-
#
|
215
|
+
#
|
157
216
|
# @param [String] id the document id which is used to uniquely identify it.
|
158
217
|
# @param [Integer] cas CAS value which is needed to unlock the document
|
159
|
-
# @param [
|
160
|
-
|
218
|
+
# @param [UnlockOptions] options request customization
|
219
|
+
#
|
220
|
+
# @raise [Error::DocumentNotFound]
|
221
|
+
def unlock(id, cas, options = UnlockOptions.new)
|
222
|
+
@backend.document_unlock(bucket_name, "#{@scope_name}.#{@name}", id, cas)
|
223
|
+
end
|
161
224
|
|
162
225
|
# Performs lookups to document fragments
|
163
226
|
#
|
@@ -167,11 +230,12 @@ module Couchbase
|
|
167
230
|
#
|
168
231
|
# @return [LookupInResult]
|
169
232
|
def lookup_in(id, specs, options = LookupInOptions.new)
|
170
|
-
resp = @backend.
|
233
|
+
resp = @backend.document_lookup_in(
|
171
234
|
bucket_name, "#{@scope_name}.#{@name}", id, options.access_deleted,
|
172
235
|
specs.map { |s| {opcode: s.type, xattr: s.xattr?, path: s.path} }
|
173
236
|
)
|
174
237
|
LookupInResult.new do |res|
|
238
|
+
res.transcoder = options.transcoder
|
175
239
|
res.cas = resp[:cas]
|
176
240
|
res.encoded = resp[:fields].map do |field|
|
177
241
|
SubDocumentField.new do |f|
|
@@ -193,13 +257,17 @@ module Couchbase
|
|
193
257
|
#
|
194
258
|
# @return [MutateInResult]
|
195
259
|
def mutate_in(id, specs, options = MutateInOptions.new)
|
196
|
-
resp = @backend.
|
260
|
+
resp = @backend.document_mutate_in(
|
197
261
|
bucket_name, "#{@scope_name}.#{@name}", id, options.access_deleted,
|
198
262
|
specs.map { |s| {opcode: s.type, path: s.path, param: s.param,
|
199
|
-
xattr: s.xattr?, expand_macros: s.expand_macros?, create_parents: s.create_parents?} }
|
263
|
+
xattr: s.xattr?, expand_macros: s.expand_macros?, create_parents: s.create_parents?} }, {
|
264
|
+
durability_level: options.durability_level
|
265
|
+
}
|
200
266
|
)
|
201
267
|
MutateInResult.new do |res|
|
268
|
+
res.transcoder = options.transcoder
|
202
269
|
res.cas = resp[:cas]
|
270
|
+
res.mutation_token = extract_mutation_token(resp)
|
203
271
|
res.first_error_index = resp[:first_error_index]
|
204
272
|
res.encoded = resp[:fields].map do |field|
|
205
273
|
SubDocumentField.new do |f|
|
@@ -213,166 +281,15 @@ module Couchbase
|
|
213
281
|
end
|
214
282
|
end
|
215
283
|
|
216
|
-
|
217
|
-
# @return [Boolean] if the expiration should also fetched with get
|
218
|
-
attr_accessor :with_expiry
|
219
|
-
|
220
|
-
# @return [Proc] transcoder used for decoding
|
221
|
-
attr_accessor :transcoder
|
222
|
-
|
223
|
-
def initialize
|
224
|
-
yield self if block_given?
|
225
|
-
end
|
226
|
-
|
227
|
-
# Allows to specify a custom list paths to fetch from the document instead of the whole.
|
228
|
-
#
|
229
|
-
# Note that a maximum of 16 individual paths can be projected at a time due to a server limitation. If you need
|
230
|
-
# more than that, think about fetching less-generic paths or the full document straight away.
|
231
|
-
#
|
232
|
-
# @param [String, Array<String>] paths a path that should be loaded if present.
|
233
|
-
def project(*paths)
|
234
|
-
@projections ||= []
|
235
|
-
@projections |= paths # union with current projections
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
class GetAndLockOptions < CommonOptions
|
240
|
-
# @return [Proc] transcoder used for decoding
|
241
|
-
attr_accessor :transcoder
|
242
|
-
|
243
|
-
def initialize
|
244
|
-
yield self if block_given?
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
class GetAndTouchOptions < CommonOptions
|
249
|
-
# @return [Proc] transcoder used for decoding
|
250
|
-
attr_accessor :transcoder
|
251
|
-
|
252
|
-
def initialize
|
253
|
-
yield self if block_given?
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
257
|
-
class GetAllReplicasOptions < CommonOptions
|
258
|
-
# @return [Proc] transcoder used for decoding
|
259
|
-
attr_accessor :transcoder
|
260
|
-
|
261
|
-
def initialize
|
262
|
-
yield self if block_given?
|
263
|
-
end
|
264
|
-
end
|
265
|
-
|
266
|
-
class GetAnyReplicaOptions < CommonOptions
|
267
|
-
# @return [Proc] transcoder used for decoding
|
268
|
-
attr_accessor :transcoder
|
269
|
-
|
270
|
-
def initialize
|
271
|
-
yield self if block_given?
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
|
-
class ExistsOptions < CommonOptions
|
276
|
-
def initialize
|
277
|
-
yield self if block_given?
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
|
-
class RemoveOptions < CommonOptions
|
282
|
-
# @return [Integer] Specifies a CAS value that will be taken into account on the server side for optimistic concurrency
|
283
|
-
attr_accessor :cas
|
284
|
-
|
285
|
-
def initialize
|
286
|
-
yield self if block_given?
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
class InsertOptions < CommonOptions
|
291
|
-
# @return [Integer] expiration time to associate with the document
|
292
|
-
attr_accessor :expiration
|
293
|
-
|
294
|
-
# @return [Proc] transcoder used for encoding
|
295
|
-
attr_accessor :transcoder
|
296
|
-
|
297
|
-
def initialize
|
298
|
-
yield self if block_given?
|
299
|
-
end
|
300
|
-
end
|
301
|
-
|
302
|
-
class UpsertOptions < CommonOptions
|
303
|
-
# @return [Integer] expiration time to associate with the document
|
304
|
-
attr_accessor :expiration
|
305
|
-
|
306
|
-
# @return [Proc] transcoder used for encoding
|
307
|
-
attr_accessor :transcoder
|
308
|
-
|
309
|
-
def initialize
|
310
|
-
yield self if block_given?
|
311
|
-
end
|
312
|
-
end
|
313
|
-
|
314
|
-
class ReplaceOptions < CommonOptions
|
315
|
-
# @return [Integer] expiration time to associate with the document
|
316
|
-
attr_accessor :expiration
|
317
|
-
|
318
|
-
# @return [Proc] transcoder used for encoding
|
319
|
-
attr_accessor :transcoder
|
320
|
-
|
321
|
-
# @return [Integer] Specifies a CAS value that will be taken into account on the server side for optimistic concurrency
|
322
|
-
attr_accessor :cas
|
323
|
-
|
324
|
-
def initialize
|
325
|
-
yield self if block_given?
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
|
-
class TouchOptions < CommonOptions
|
330
|
-
def initialize
|
331
|
-
yield self if block_given?
|
332
|
-
end
|
333
|
-
end
|
334
|
-
|
335
|
-
class UnlockOptions < CommonOptions
|
336
|
-
def initialize
|
337
|
-
yield self if block_given?
|
338
|
-
end
|
339
|
-
end
|
340
|
-
|
341
|
-
class LookupInOptions < CommonOptions
|
342
|
-
# @return [Boolean] For internal use only: allows access to deleted documents that are in 'tombstone' form
|
343
|
-
attr_accessor :access_deleted
|
344
|
-
|
345
|
-
def initialize
|
346
|
-
yield self if block_given?
|
347
|
-
end
|
348
|
-
end
|
349
|
-
|
350
|
-
class MutateInOptions < CommonOptions
|
351
|
-
# @return [Integer] expiration time to associate with the document
|
352
|
-
attr_accessor :expiration
|
353
|
-
|
354
|
-
# Describes how the outer document store semantics on subdoc should act
|
355
|
-
#
|
356
|
-
# * +:replace+: replace the document, fail if it does not exist. This is the default
|
357
|
-
# * +:upsert+: replace the document or create if it does not exist
|
358
|
-
# * +:insert+: create the document, fail if it exists
|
359
|
-
#
|
360
|
-
# @return [:replace, :upsert, :insert]
|
361
|
-
attr_accessor :store_semantics
|
362
|
-
|
363
|
-
# @return [Integer] Specifies a CAS value that will be taken into account on the server side for optimistic concurrency
|
364
|
-
attr_accessor :cas
|
365
|
-
|
366
|
-
# @return [Boolean] For internal use only: allows access to deleted documents that are in 'tombstone' form
|
367
|
-
attr_accessor :access_deleted
|
368
|
-
|
369
|
-
# @return [Boolean] For internal use only: allows creating documents in 'tombstone' form
|
370
|
-
attr_accessor :create_as_deleted
|
284
|
+
private
|
371
285
|
|
372
|
-
|
373
|
-
|
374
|
-
|
286
|
+
def extract_mutation_token(resp)
|
287
|
+
MutationToken.new do |token|
|
288
|
+
token.partition_id = resp[:mutation_token][:partition_id]
|
289
|
+
token.partition_uuid = resp[:mutation_token][:partition_uuid]
|
290
|
+
token.sequence_number = resp[:mutation_token][:sequence_number]
|
291
|
+
token.bucket_name = resp[:mutation_token][:bucket_name]
|
375
292
|
end
|
376
293
|
end
|
377
294
|
end
|
378
|
-
end
|
295
|
+
end
|
@@ -0,0 +1,430 @@
|
|
1
|
+
# Copyright 2020 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
|
+
require "couchbase/json_transcoder"
|
16
|
+
require "couchbase/common_options"
|
17
|
+
require "couchbase/subdoc"
|
18
|
+
require "couchbase/mutation_state"
|
19
|
+
|
20
|
+
module Couchbase
|
21
|
+
class Collection
|
22
|
+
class GetOptions < CommonOptions
|
23
|
+
# @return [Boolean] if the expiration should also fetched with get
|
24
|
+
attr_accessor :with_expiry
|
25
|
+
|
26
|
+
# @return [JsonTranscoder] transcoder used for decoding
|
27
|
+
attr_accessor :transcoder
|
28
|
+
|
29
|
+
# @yieldparam [GetOptions] self
|
30
|
+
def initialize
|
31
|
+
@transcoder = JsonTranscoder.new
|
32
|
+
yield self if block_given?
|
33
|
+
end
|
34
|
+
|
35
|
+
# Allows to specify a custom list paths to fetch from the document instead of the whole.
|
36
|
+
#
|
37
|
+
# Note that a maximum of 16 individual paths can be projected at a time due to a server limitation. If you need
|
38
|
+
# more than that, think about fetching less-generic paths or the full document straight away.
|
39
|
+
#
|
40
|
+
# @param [String, Array<String>] paths a path that should be loaded if present.
|
41
|
+
def project(*paths)
|
42
|
+
@projections ||= []
|
43
|
+
@projections |= paths # union with current projections
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class GetAndLockOptions < CommonOptions
|
48
|
+
# @return [JsonTranscoder] transcoder used for decoding
|
49
|
+
attr_accessor :transcoder
|
50
|
+
|
51
|
+
# @yieldparam [GetAndLockOptions] self
|
52
|
+
def initialize
|
53
|
+
@transcoder = JsonTranscoder.new
|
54
|
+
yield self if block_given?
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class GetAndTouchOptions < CommonOptions
|
59
|
+
# @return [JsonTranscoder] transcoder used for decoding
|
60
|
+
attr_accessor :transcoder
|
61
|
+
|
62
|
+
# @yieldparam [GetAndTouchOptions] self
|
63
|
+
def initialize
|
64
|
+
@transcoder = JsonTranscoder.new
|
65
|
+
yield self if block_given?
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class GetResult
|
70
|
+
# @return [Integer] holds the CAS value of the fetched document
|
71
|
+
attr_accessor :cas
|
72
|
+
|
73
|
+
# @return [Integer] the expiration if fetched and present
|
74
|
+
attr_accessor :expiration
|
75
|
+
|
76
|
+
# @return [String] The encoded content when loading the document
|
77
|
+
attr_accessor :encoded
|
78
|
+
|
79
|
+
# Decodes the content of the document using given (or default transcoder)
|
80
|
+
#
|
81
|
+
# @param [JsonTranscoder] transcoder custom transcoder
|
82
|
+
#
|
83
|
+
# @return [Object]
|
84
|
+
def content(transcoder = self.transcoder)
|
85
|
+
transcoder.decode(@encoded, @flags)
|
86
|
+
end
|
87
|
+
|
88
|
+
# @yieldparam [GetResult] self
|
89
|
+
def initialize
|
90
|
+
yield self if block_given?
|
91
|
+
end
|
92
|
+
|
93
|
+
# @return [Integer] The flags from the operation
|
94
|
+
attr_accessor :flags
|
95
|
+
|
96
|
+
# @return [JsonTranscoder] The default transcoder which should be used
|
97
|
+
attr_accessor :transcoder
|
98
|
+
end
|
99
|
+
|
100
|
+
class GetAllReplicasOptions < CommonOptions
|
101
|
+
# @return [JsonTranscoder] transcoder used for decoding
|
102
|
+
attr_accessor :transcoder
|
103
|
+
|
104
|
+
# @yieldparam [GetAllReplicasOptions] self
|
105
|
+
def initialize
|
106
|
+
yield self if block_given?
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
class GetAnyReplicaOptions < CommonOptions
|
111
|
+
# @return [JsonTranscoder] transcoder used for decoding
|
112
|
+
attr_accessor :transcoder
|
113
|
+
|
114
|
+
# @yieldparam [GetAnyReplicaOptions] self
|
115
|
+
def initialize
|
116
|
+
yield self if block_given?
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
class GetReplicaResult < GetResult
|
121
|
+
# @return [Boolean] true if this result came from a replica
|
122
|
+
attr_accessor :is_replica
|
123
|
+
alias_method :replica?, :is_replica
|
124
|
+
end
|
125
|
+
|
126
|
+
class ExistsOptions < CommonOptions
|
127
|
+
# @yieldparam [ExistsOptions] self
|
128
|
+
def initialize
|
129
|
+
yield self if block_given?
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
class ExistsResult
|
134
|
+
# @return [Integer] holds the CAS value of the fetched document
|
135
|
+
attr_accessor :cas
|
136
|
+
|
137
|
+
# @api private
|
138
|
+
# @return [:found, :not_found, :persisted, :logically_deleted]
|
139
|
+
attr_accessor :status
|
140
|
+
|
141
|
+
def exists?
|
142
|
+
status == :found || status == :persisted
|
143
|
+
end
|
144
|
+
|
145
|
+
# @yieldparam [ExistsResult]
|
146
|
+
def initialize
|
147
|
+
@durability_level = :none
|
148
|
+
yield self if block_given?
|
149
|
+
end
|
150
|
+
|
151
|
+
# @api private
|
152
|
+
# @return [Integer] holds the index of the partition, to which the given key is mapped
|
153
|
+
attr_accessor :partition_id
|
154
|
+
end
|
155
|
+
|
156
|
+
class RemoveOptions < CommonOptions
|
157
|
+
# @return [Integer] Specifies a CAS value that will be taken into account on the server side for optimistic concurrency
|
158
|
+
attr_accessor :cas
|
159
|
+
|
160
|
+
# @return [:none, :majority, :majority_and_persist_to_active, :persist_to_majority] level of durability
|
161
|
+
attr_accessor :durability_level
|
162
|
+
|
163
|
+
# @yieldparam [RemoveOptions]
|
164
|
+
def initialize
|
165
|
+
@durability_level = :none
|
166
|
+
yield self if block_given?
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
class InsertOptions < CommonOptions
|
171
|
+
# @return [Integer] expiration time to associate with the document
|
172
|
+
attr_accessor :expiration
|
173
|
+
|
174
|
+
# @return [Proc] transcoder used for encoding
|
175
|
+
attr_accessor :transcoder
|
176
|
+
|
177
|
+
# @return [:none, :majority, :majority_and_persist_to_active, :persist_to_majority] level of durability
|
178
|
+
attr_accessor :durability_level
|
179
|
+
|
180
|
+
# @yieldparam [InsertOptions]
|
181
|
+
def initialize
|
182
|
+
@transcoder = JsonTranscoder.new
|
183
|
+
@durability_level = :none
|
184
|
+
yield self if block_given?
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
class UpsertOptions < CommonOptions
|
189
|
+
# @return [Integer] expiration time to associate with the document
|
190
|
+
attr_accessor :expiration
|
191
|
+
|
192
|
+
# @return [JsonTranscoder] transcoder used for encoding
|
193
|
+
attr_accessor :transcoder
|
194
|
+
|
195
|
+
# @return [:none, :majority, :majority_and_persist_to_active, :persist_to_majority] level of durability
|
196
|
+
attr_accessor :durability_level
|
197
|
+
|
198
|
+
# @yieldparam [UpsertOptions]
|
199
|
+
def initialize
|
200
|
+
@transcoder = JsonTranscoder.new
|
201
|
+
@durability_level = :none
|
202
|
+
yield self if block_given?
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
class ReplaceOptions < CommonOptions
|
207
|
+
# @return [Integer] expiration time to associate with the document
|
208
|
+
attr_accessor :expiration
|
209
|
+
|
210
|
+
# @return [JsonTranscoder] transcoder used for encoding
|
211
|
+
attr_accessor :transcoder
|
212
|
+
|
213
|
+
# @return [Integer] Specifies a CAS value that will be taken into account on the server side for optimistic concurrency
|
214
|
+
attr_accessor :cas
|
215
|
+
|
216
|
+
# @return [:none, :majority, :majority_and_persist_to_active, :persist_to_majority] level of durability
|
217
|
+
attr_accessor :durability_level
|
218
|
+
|
219
|
+
# @yieldparam [ReplaceOptions]
|
220
|
+
def initialize
|
221
|
+
@transcoder = JsonTranscoder.new
|
222
|
+
@durability_level = :none
|
223
|
+
yield self if block_given?
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
class MutationResult
|
228
|
+
# @return [Integer] holds the CAS value of the document after the mutation
|
229
|
+
attr_accessor :cas
|
230
|
+
|
231
|
+
# @return [MutationToken] if returned, holds the mutation token of the document after the mutation
|
232
|
+
attr_accessor :mutation_token
|
233
|
+
|
234
|
+
# @yieldparam [MutationResult] self
|
235
|
+
def initialize
|
236
|
+
yield self if block_given?
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
class TouchOptions < CommonOptions
|
241
|
+
# @yieldparam [TouchOptions] self
|
242
|
+
def initialize
|
243
|
+
yield self if block_given?
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
class UnlockOptions < CommonOptions
|
248
|
+
# @yieldparam [UnlockOptions] self
|
249
|
+
def initialize
|
250
|
+
yield self if block_given?
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
class LookupInOptions < CommonOptions
|
255
|
+
# @return [Boolean] For internal use only: allows access to deleted documents that are in 'tombstone' form
|
256
|
+
attr_accessor :access_deleted
|
257
|
+
|
258
|
+
# @return [JsonTranscoder] transcoder used for decoding
|
259
|
+
attr_accessor :transcoder
|
260
|
+
|
261
|
+
# @yieldparam [LookupInOptions] self
|
262
|
+
def initialize
|
263
|
+
@transcoder = JsonTranscoder.new
|
264
|
+
yield self if block_given?
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
class LookupInResult
|
269
|
+
# @return [Integer] holds the CAS value of the fetched document
|
270
|
+
attr_accessor :cas
|
271
|
+
|
272
|
+
# Decodes the content at the given index
|
273
|
+
#
|
274
|
+
# @param [Integer] index the index of the subdocument value to decode
|
275
|
+
#
|
276
|
+
# @return [Object] the decoded
|
277
|
+
def content(index, transcoder = self.transcoder)
|
278
|
+
transcoder.decode(encoded[index].value, :json)
|
279
|
+
end
|
280
|
+
|
281
|
+
# Allows to check if a value at the given index exists
|
282
|
+
#
|
283
|
+
# @param [Integer] index the index of the subdocument value to check
|
284
|
+
#
|
285
|
+
# @return [Boolean] true if a value is present at the index, false otherwise
|
286
|
+
def exists?(index)
|
287
|
+
encoded[index].exists
|
288
|
+
end
|
289
|
+
|
290
|
+
# @return [Array<SubDocumentField>] holds the encoded subdocument responses
|
291
|
+
attr_accessor :encoded
|
292
|
+
|
293
|
+
# @yieldparam [LookupInResult] self
|
294
|
+
def initialize
|
295
|
+
yield self if block_given?
|
296
|
+
end
|
297
|
+
|
298
|
+
# @return [JsonTranscoder] The default transcoder which should be used
|
299
|
+
attr_accessor :transcoder
|
300
|
+
end
|
301
|
+
|
302
|
+
class MutateInOptions < CommonOptions
|
303
|
+
# @return [Integer] expiration time to associate with the document
|
304
|
+
attr_accessor :expiration
|
305
|
+
|
306
|
+
# Describes how the outer document store semantics on subdoc should act
|
307
|
+
#
|
308
|
+
# * +:replace+: replace the document, fail if it does not exist. This is the default
|
309
|
+
# * +:upsert+: replace the document or create if it does not exist
|
310
|
+
# * +:insert+: create the document, fail if it exists
|
311
|
+
#
|
312
|
+
# @return [:replace, :upsert, :insert]
|
313
|
+
attr_accessor :store_semantics
|
314
|
+
|
315
|
+
# @return [Integer] Specifies a CAS value that will be taken into account on the server side for optimistic concurrency
|
316
|
+
attr_accessor :cas
|
317
|
+
|
318
|
+
# @return [Boolean] For internal use only: allows access to deleted documents that are in 'tombstone' form
|
319
|
+
attr_accessor :access_deleted
|
320
|
+
|
321
|
+
# @return [Boolean] For internal use only: allows creating documents in 'tombstone' form
|
322
|
+
attr_accessor :create_as_deleted
|
323
|
+
|
324
|
+
# @return [:none, :majority, :majority_and_persist_to_active, :persist_to_majority] level of durability
|
325
|
+
attr_accessor :durability_level
|
326
|
+
|
327
|
+
# @yieldparam [MutateInOptions]
|
328
|
+
def initialize
|
329
|
+
@durability_level = :none
|
330
|
+
@store_semantics = :replace
|
331
|
+
@transcoder = JsonTranscoder.new
|
332
|
+
yield self if block_given?
|
333
|
+
end
|
334
|
+
|
335
|
+
attr_accessor :transcoder
|
336
|
+
end
|
337
|
+
|
338
|
+
class MutateInResult < MutationResult
|
339
|
+
# Decodes the content at the given index
|
340
|
+
#
|
341
|
+
# @param [Integer] index the index of the subdocument value to decode
|
342
|
+
#
|
343
|
+
# @return [Object] the decoded
|
344
|
+
def content(index, transcoder = self.transcoder)
|
345
|
+
transcoder.decode(encoded[index].value, :json)
|
346
|
+
end
|
347
|
+
|
348
|
+
# @yieldparam [MutateInResult] self
|
349
|
+
def initialize
|
350
|
+
yield self if block_given?
|
351
|
+
end
|
352
|
+
|
353
|
+
def success?
|
354
|
+
!!first_error_index
|
355
|
+
end
|
356
|
+
|
357
|
+
# @return [Array<SubDocumentField>] holds the encoded subdocument responses
|
358
|
+
attr_accessor :encoded
|
359
|
+
|
360
|
+
# @return [Integer, nil] index of first operation entry that generated an error
|
361
|
+
attr_accessor :first_error_index
|
362
|
+
|
363
|
+
# @return [JsonTranscoder] The default transcoder which should be used
|
364
|
+
attr_accessor :transcoder
|
365
|
+
end
|
366
|
+
|
367
|
+
# @api private
|
368
|
+
class SubDocumentField
|
369
|
+
attr_accessor :error
|
370
|
+
|
371
|
+
# @return [Boolean] true if the path exists in the document
|
372
|
+
attr_accessor :exists
|
373
|
+
|
374
|
+
# @return [String] value
|
375
|
+
attr_accessor :value
|
376
|
+
|
377
|
+
# @return [String] path
|
378
|
+
attr_accessor :path
|
379
|
+
|
380
|
+
# Operation type
|
381
|
+
#
|
382
|
+
# * +:set_doc+
|
383
|
+
# * +:counter+
|
384
|
+
# * +:replace+
|
385
|
+
# * +:dict_add+
|
386
|
+
# * +:dict_upsert+
|
387
|
+
# * +:array_push_first+
|
388
|
+
# * +:array_push_last+
|
389
|
+
# * +:array_add_unique+
|
390
|
+
# * +:array_insert+
|
391
|
+
# * +:delete+
|
392
|
+
# * +:get+
|
393
|
+
# * +:exists+
|
394
|
+
# * +:count+
|
395
|
+
# * +:get_doc+
|
396
|
+
#
|
397
|
+
# @return [Symbol]
|
398
|
+
attr_accessor :type
|
399
|
+
|
400
|
+
# Status of the subdocument path operation.
|
401
|
+
#
|
402
|
+
# [+:success+] Indicates a successful response in general.
|
403
|
+
# [+:path_not_found+] The provided path does not exist in the document
|
404
|
+
# [+:path_mismatch+] One of path components treats a non-dictionary as a dictionary, or a non-array as an array, or value the path points to is not a number
|
405
|
+
# [+:path_invalid+] The path's syntax was incorrect
|
406
|
+
# [+:path_too_big+] The path provided is too large: either the string is too long, or it contains too many components
|
407
|
+
# [+:value_cannot_insert+] The value provided will invalidate the JSON if inserted
|
408
|
+
# [+:doc_not_json+] The existing document is not valid JSON
|
409
|
+
# [+:num_range+] The existing number is out of the valid range for arithmetic operations
|
410
|
+
# [+:delta_invalid+] The operation would result in a number outside the valid range
|
411
|
+
# [+:path_exists+] The requested operation requires the path to not already exist, but it exists
|
412
|
+
# [+:value_too_deep+] Inserting the value would cause the document to be too deep
|
413
|
+
# [+:invalid_combo+] An invalid combination of commands was specified
|
414
|
+
# [+:xattr_invalid_flag_combo+] An invalid combination of operations, using macros when not using extended attributes
|
415
|
+
# [+:xattr_invalid_key_combo+] Only single xattr key may be accessed at the same time
|
416
|
+
# [+:xattr_unknown_macro+] The server has no knowledge of the requested macro
|
417
|
+
# [+:xattr_unknown_vattr+] Unknown virtual attribute.
|
418
|
+
# [+:xattr_cannot_modify_vattr+] Cannot modify this virtual attribute.
|
419
|
+
# [+:unknown+] Unknown error.
|
420
|
+
#
|
421
|
+
# @return [Symbol]
|
422
|
+
attr_accessor :status
|
423
|
+
|
424
|
+
# @yieldparam [SubDocumentField] self
|
425
|
+
def initialize
|
426
|
+
yield self if block_given?
|
427
|
+
end
|
428
|
+
end
|
429
|
+
end
|
430
|
+
end
|