couchbase-jruby-client 0.2.2-java → 1.0.4-java

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.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +103 -0
  3. data/.ruby-version +1 -1
  4. data/Rakefile +13 -2
  5. data/couchbase-jruby-client.gemspec +7 -6
  6. data/lib/couchbase/bucket.rb +11 -338
  7. data/lib/couchbase/cluster.rb +10 -88
  8. data/lib/couchbase/configuration.rb +39 -0
  9. data/lib/couchbase/design_doc.rb +18 -73
  10. data/lib/couchbase/document.rb +34 -0
  11. data/lib/couchbase/error.rb +0 -35
  12. data/lib/couchbase/operations.rb +60 -40
  13. data/lib/couchbase/version.rb +1 -1
  14. data/lib/couchbase/view.rb +55 -345
  15. data/lib/couchbase.rb +37 -141
  16. data/lib/jars/couchbase-core-io-1.1.4.jar +0 -0
  17. data/lib/jars/couchbase-java-client-2.1.4.jar +0 -0
  18. data/lib/jars/rxjava-1.0.8.jar +0 -0
  19. data/lib/jars/rxjruby-0.0.1.jar +0 -0
  20. data/test/{test_cas.rb → helper.rb} +15 -10
  21. data/test/test_bucket.rb +14 -228
  22. data/test/test_cluster.rb +1 -29
  23. data/test/test_configuration.rb +51 -0
  24. data/test/test_couchbase.rb +28 -28
  25. data/test/test_design_doc.rb +29 -0
  26. data/test/test_document.rb +51 -0
  27. data/test/test_operations.rb +49 -0
  28. data/test/test_view.rb +62 -116
  29. metadata +43 -125
  30. data/lib/couchbase/async/callback.rb +0 -38
  31. data/lib/couchbase/async/queue.rb +0 -26
  32. data/lib/couchbase/async.rb +0 -32
  33. data/lib/couchbase/constants.rb +0 -29
  34. data/lib/couchbase/operations/arithmetic.rb +0 -290
  35. data/lib/couchbase/operations/delete.rb +0 -115
  36. data/lib/couchbase/operations/design_docs.rb +0 -99
  37. data/lib/couchbase/operations/fetch.rb +0 -33
  38. data/lib/couchbase/operations/get.rb +0 -303
  39. data/lib/couchbase/operations/stats.rb +0 -42
  40. data/lib/couchbase/operations/store.rb +0 -463
  41. data/lib/couchbase/operations/touch.rb +0 -140
  42. data/lib/couchbase/operations/unlock.rb +0 -209
  43. data/lib/couchbase/operations/utils.rb +0 -68
  44. data/lib/couchbase/query.rb +0 -76
  45. data/lib/couchbase/result.rb +0 -60
  46. data/lib/couchbase/transcoder.rb +0 -81
  47. data/lib/couchbase/utils.rb +0 -62
  48. data/lib/couchbase/view_row.rb +0 -227
  49. data/lib/jars/commons-codec-1.5.jar +0 -0
  50. data/lib/jars/couchbase-client-1.3.2-javadoc.jar +0 -0
  51. data/lib/jars/couchbase-client-1.3.2-sources.jar +0 -0
  52. data/lib/jars/couchbase-client-1.3.2.jar +0 -0
  53. data/lib/jars/httpcore-4.3.1.jar +0 -0
  54. data/lib/jars/httpcore-nio-4.3.1.jar +0 -0
  55. data/lib/jars/jettison-1.1.jar +0 -0
  56. data/lib/jars/netty-3.5.5.Final.jar +0 -0
  57. data/lib/jars/spymemcached-2.10.5-javadoc.jar +0 -0
  58. data/lib/jars/spymemcached-2.10.5-sources.jar +0 -0
  59. data/lib/jars/spymemcached-2.10.5.jar +0 -0
  60. data/tasks/benchmark.rake +0 -6
  61. data/tasks/test.rake +0 -36
  62. data/tasks/util.rake +0 -21
  63. data/test/mock.rb +0 -85
  64. data/test/profile/.gitignore +0 -1
  65. data/test/profile/.jrubyrc +0 -722
  66. data/test/profile/Gemfile +0 -7
  67. data/test/profile/benchmark.rb +0 -177
  68. data/test/profile/profile.rb +0 -59
  69. data/test/setup.rb +0 -74
  70. data/test/test_arithmetic.rb +0 -155
  71. data/test/test_async.rb +0 -24
  72. data/test/test_couchbase_rails_cache_store.rb +0 -341
  73. data/test/test_delete.rb +0 -139
  74. data/test/test_design_docs.rb +0 -67
  75. data/test/test_errors.rb +0 -74
  76. data/test/test_fetch.rb +0 -71
  77. data/test/test_format.rb +0 -142
  78. data/test/test_get.rb +0 -363
  79. data/test/test_query.rb +0 -23
  80. data/test/test_result.rb +0 -15
  81. data/test/test_stats.rb +0 -44
  82. data/test/test_store.rb +0 -203
  83. data/test/test_touch.rb +0 -90
  84. data/test/test_unlock.rb +0 -89
  85. data/test/test_utils.rb +0 -67
  86. data/test/test_version.rb +0 -28
  87. data/test/test_view_row.rb +0 -74
@@ -1,463 +0,0 @@
1
- # Author:: Mike Evans <mike@urlgonomics.com>
2
- # Copyright:: 2013 Urlgonomics LLC.
3
- # License:: Apache License, Version 2.0
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
-
18
- # java_import com.couchbase.client.CouchbaseClient
19
-
20
- # class CouchbaseClient
21
- # java_alias :java_set, :set, [java.lang.String, Java::int, java.lang.Object, Java::net.spy.memcached.transcoders.Transcoder.java_class]
22
- # end
23
-
24
- module Couchbase::Operations
25
- module Store
26
-
27
- STORE_OP_METHODS = {
28
- set: -> client, key, value, ttl, transcoder { client.set(key, ttl.to_i, value, transcoder) },
29
- add: -> client, key, value, ttl, transcoder { client.add(key, ttl.to_i, value, transcoder) },
30
- replace: -> client, key, value, ttl, transcoder { client.replace(key, ttl.to_i, value, transcoder) },
31
- append: -> client, key, value, ttl, transcoder { client.append(key, value, transcoder) },
32
- prepend: -> client, key, value, ttl, transcoder { client.prepend(key, value, transcoder) }
33
- }.freeze
34
-
35
- # Unconditionally store the object in the Couchbase
36
- #
37
- # @since 1.0.0
38
- #
39
- # @overload set(key, value, options = {})
40
- #
41
- # @param key [String, Symbol] Key used to reference the value.
42
- # @param value [Object] Value to be stored
43
- # @param options [Hash] Options for operation.
44
- # @option options [Fixnum] :ttl (self.default_ttl) Expiry time for key.
45
- # Values larger than 30*24*60*60 seconds (30 days) are interpreted as
46
- # absolute times (from the epoch).
47
- # @option options [Fixnum] :flags (self.default_flags) Flags for storage
48
- # options. Flags are ignored by the server but preserved for use by the
49
- # client. For more info see {Bucket#default_flags}.
50
- # @option options [Symbol] :format (self.default_format) The
51
- # representation for storing the value in the bucket. For more info see
52
- # {Bucket#default_format}.
53
- # @option options [Fixnum] :cas The CAS value for an object. This value is
54
- # created on the server and is guaranteed to be unique for each value of
55
- # a given key. This value is used to provide simple optimistic
56
- # concurrency control when multiple clients or threads try to update an
57
- # item simultaneously.
58
- # @option options [Hash] :observe Apply persistence condition before
59
- # returning result. When this option specified the library will observe
60
- # given condition. See {Bucket#observe_and_wait}.
61
- #
62
- # @yieldparam ret [Result] the result of operation in asynchronous mode
63
- # (valid attributes: +error+, +operation+, +key+).
64
- #
65
- # @return [Fixnum] The CAS value of the object.
66
- #
67
- # @raise [Couchbase::Error::Connect] if connection closed (see {Bucket#reconnect}).
68
- # @raise [Couchbase::Error::KeyExists] if the key already exists on the
69
- # server.
70
- # @raise [Couchbase::Error::ValueFormat] if the value cannot be serialized
71
- # with chosen encoder, e.g. if you try to store the Hash in +:plain+
72
- # mode.
73
- # @raise [ArgumentError] when passing the block in synchronous mode
74
- # @raise [Couchbase::Error::Timeout] if timeout interval for observe
75
- # exceeds
76
- #
77
- # @example Store the key which will be expired in 2 seconds using relative TTL.
78
- # c.set("foo", "bar", :ttl => 2)
79
- #
80
- # @example Perform multi-set operation. It takes a Hash store its keys/values into the bucket
81
- # c.set("foo1" => "bar1", "foo2" => "bar2")
82
- # #=> {"foo1" => cas1, "foo2" => cas2}
83
- #
84
- # @example More advanced multi-set using asynchronous mode
85
- # c.run do
86
- # # fire and forget
87
- # c.set("foo1", "bar1", :ttl => 10)
88
- # # receive result into the callback
89
- # c.set("foo2", "bar2", :ttl => 10) do |ret|
90
- # if ret.success?
91
- # puts ret.cas
92
- # end
93
- # end
94
- # end
95
- #
96
- # @example Store the key which will be expired in 2 seconds using absolute TTL.
97
- # c.set("foo", "bar", :ttl => Time.now.to_i + 2)
98
- #
99
- # @example Force JSON document format for value
100
- # c.set("foo", {"bar" => "baz}, :format => :document)
101
- #
102
- # @example Use hash-like syntax to store the value
103
- # c["foo"] = {"bar" => "baz}
104
- #
105
- # @example Use extended hash-like syntax
106
- # c["foo", {:flags => 0x1000, :format => :plain}] = "bar"
107
- # c["foo", :flags => 0x1000] = "bar" # for ruby 1.9.x only
108
- #
109
- # @example Set application specific flags (note that it will be OR-ed with format flags)
110
- # c.set("foo", "bar", :flags => 0x1000)
111
- #
112
- # @example Perform optimistic locking by specifying last known CAS version
113
- # c.set("foo", "bar", :cas => 8835713818674332672)
114
- #
115
- # @example Perform asynchronous call
116
- # c.run do
117
- # c.set("foo", "bar") do |ret|
118
- # ret.operation #=> :set
119
- # ret.success? #=> true
120
- # ret.key #=> "foo"
121
- # ret.cas
122
- # end
123
- # end
124
- #
125
- # @example Ensure that the key will be persisted at least on the one node
126
- # c.set("foo", "bar", :observe => {:persisted => 1})
127
- #
128
- def set(key, value = nil, options = {})
129
- store_op(:set, key, value, options)
130
- end
131
-
132
- def async_set(key, value, options = {}, &block)
133
- async_store_op(:set, key, value, options, &block)
134
- end
135
-
136
- def []=(key, *args)
137
- options = args.size > 1 ? args.shift : {}
138
- value = args.pop
139
-
140
- set(key, value, options)
141
- end
142
-
143
- # Add the item to the database, but fail if the object exists already
144
- #
145
- # @since 1.0.0
146
- #
147
- # @overload add(key, value, options = {})
148
- #
149
- # @param key [String, Symbol] Key used to reference the value.
150
- # @param value [Object] Value to be stored
151
- # @param options [Hash] Options for operation.
152
- # @option options [Fixnum] :ttl (self.default_ttl) Expiry time for key.
153
- # Values larger than 30*24*60*60 seconds (30 days) are interpreted as
154
- # absolute times (from the epoch).
155
- # @option options [Fixnum] :flags (self.default_flags) Flags for storage
156
- # options. Flags are ignored by the server but preserved for use by the
157
- # client. For more info see {Bucket#default_flags}.
158
- # @option options [Symbol] :format (self.default_format) The
159
- # representation for storing the value in the bucket. For more info see
160
- # {Bucket#default_format}.
161
- # @option options [Fixnum] :cas The CAS value for an object. This value
162
- # created on the server and is guaranteed to be unique for each value of
163
- # a given key. This value is used to provide simple optimistic
164
- # concurrency control when multiple clients or threads try to update an
165
- # item simultaneously.
166
- # @option options [Hash] :observe Apply persistence condition before
167
- # returning result. When this option specified the library will observe
168
- # given condition. See {Bucket#observe_and_wait}.
169
- #
170
- # @yieldparam ret [Result] the result of operation in asynchronous mode
171
- # (valid attributes: +error+, +operation+, +key+).
172
- #
173
- # @return [Fixnum] The CAS value of the object.
174
- #
175
- # @raise [Couchbase::Error::Connect] if connection closed (see {Bucket#reconnect})
176
- # @raise [Couchbase::Error::KeyExists] if the key already exists on the
177
- # server
178
- # @raise [Couchbase::Error::ValueFormat] if the value cannot be serialized
179
- # with chosen encoder, e.g. if you try to store the Hash in +:plain+
180
- # mode.
181
- # @raise [ArgumentError] when passing the block in synchronous mode
182
- # @raise [Couchbase::Error::Timeout] if timeout interval for observe
183
- # exceeds
184
- #
185
- # @example Add the same key twice
186
- # c.add("foo", "bar") #=> stored successully
187
- # c.add("foo", "baz") #=> will raise Couchbase::Error::KeyExists: failed to store value (key="foo", error=0x0c)
188
- #
189
- # @example Ensure that the key will be persisted at least on the one node
190
- # c.add("foo", "bar", :observe => {:persisted => 1})
191
- #
192
- def add(key, value = nil, options = {})
193
- store_op(:add, key, value, options)
194
- end
195
-
196
- def async_add(key, value, options, &block)
197
- async_store_op(:add, key, value, options, &block)
198
- end
199
-
200
- # Replace the existing object in the database
201
- #
202
- # @since 1.0.0
203
- #
204
- # @overload replace(key, value, options = {})
205
- # @param key [String, Symbol] Key used to reference the value.
206
- # @param value [Object] Value to be stored
207
- # @param options [Hash] Options for operation.
208
- # @option options [Fixnum] :ttl (self.default_ttl) Expiry time for key.
209
- # Values larger than 30*24*60*60 seconds (30 days) are interpreted as
210
- # absolute times (from the epoch).
211
- # @option options [Fixnum] :flags (self.default_flags) Flags for storage
212
- # options. Flags are ignored by the server but preserved for use by the
213
- # client. For more info see {Bucket#default_flags}.
214
- # @option options [Symbol] :format (self.default_format) The
215
- # representation for storing the value in the bucket. For more info see
216
- # {Bucket#default_format}.
217
- # @option options [Fixnum] :cas The CAS value for an object. This value
218
- # created on the server and is guaranteed to be unique for each value of
219
- # a given key. This value is used to provide simple optimistic
220
- # concurrency control when multiple clients or threads try to update an
221
- # item simultaneously.
222
- # @option options [Hash] :observe Apply persistence condition before
223
- # returning result. When this option specified the library will observe
224
- # given condition. See {Bucket#observe_and_wait}.
225
- #
226
- # @return [Fixnum] The CAS value of the object.
227
- #
228
- # @raise [Couchbase::Error::Connect] if connection closed (see {Bucket#reconnect})
229
- # @raise [Couchbase::Error::NotFound] if the key doesn't exists
230
- # @raise [Couchbase::Error::KeyExists] on CAS mismatch
231
- # @raise [ArgumentError] when passing the block in synchronous mode
232
- # @raise [Couchbase::Error::Timeout] if timeout interval for observe
233
- # exceeds
234
- #
235
- # @example Replacing missing key
236
- # c.replace("foo", "baz") #=> will raise Couchbase::Error::NotFound: failed to store value (key="foo", error=0x0d)
237
- #
238
- # @example Ensure that the key will be persisted at least on the one node
239
- # c.replace("foo", "bar", :observe => {:persisted => 1})
240
- #
241
- def replace(key, value, options = {})
242
- store_op(:replace, key, value, options)
243
- end
244
-
245
- def async_replace(key, value, options, &block)
246
- async_store_op(:replace, key, value, options, &block)
247
- end
248
-
249
- # Append this object to the existing object
250
- #
251
- # @since 1.0.0
252
- #
253
- # @note This operation is kind of data-aware from server point of view.
254
- # This mean that the server treats value as binary stream and just
255
- # perform concatenation, therefore it won't work with +:marshal+ and
256
- # +:document+ formats, because of lack of knowledge how to merge values
257
- # in these formats. See {Bucket#cas} for workaround.
258
- #
259
- # @overload append(key, value, options = {})
260
- # @param key [String, Symbol] Key used to reference the value.
261
- # @param value [Object] Value to be stored
262
- # @param options [Hash] Options for operation.
263
- # @option options [Fixnum] :cas The CAS value for an object. This value
264
- # created on the server and is guaranteed to be unique for each value of
265
- # a given key. This value is used to provide simple optimistic
266
- # concurrency control when multiple clients or threads try to update an
267
- # item simultaneously.
268
- # @option options [Symbol] :format (self.default_format) The
269
- # representation for storing the value in the bucket. For more info see
270
- # {Bucket#default_format}.
271
- # @option options [Hash] :observe Apply persistence condition before
272
- # returning result. When this option specified the library will observe
273
- # given condition. See {Bucket#observe_and_wait}.
274
- #
275
- # @return [Fixnum] The CAS value of the object.
276
- #
277
- # @raise [Couchbase::Error::Connect] if connection closed (see {Bucket#reconnect})
278
- # @raise [Couchbase::Error::KeyExists] on CAS mismatch
279
- # @raise [Couchbase::Error::NotStored] if the key doesn't exist
280
- # @raise [ArgumentError] when passing the block in synchronous mode
281
- # @raise [Couchbase::Error::Timeout] if timeout interval for observe
282
- # exceeds
283
- #
284
- # @example Simple append
285
- # c.set("foo", "aaa")
286
- # c.append("foo", "bbb")
287
- # c.get("foo") #=> "aaabbb"
288
- #
289
- # @example Implementing sets using append
290
- # def set_add(key, *values)
291
- # encoded = values.flatten.map{|v| "+#{v} "}.join
292
- # append(key, encoded)
293
- # end
294
- #
295
- # def set_remove(key, *values)
296
- # encoded = values.flatten.map{|v| "-#{v} "}.join
297
- # append(key, encoded)
298
- # end
299
- #
300
- # def set_get(key)
301
- # encoded = get(key)
302
- # ret = Set.new
303
- # encoded.split(' ').each do |v|
304
- # op, val = v[0], v[1..-1]
305
- # case op
306
- # when "-"
307
- # ret.delete(val)
308
- # when "+"
309
- # ret.add(val)
310
- # end
311
- # end
312
- # ret
313
- # end
314
- #
315
- # @example Using optimistic locking. The operation will fail on CAS mismatch
316
- # ver = c.set("foo", "aaa")
317
- # c.append("foo", "bbb", :cas => ver)
318
- #
319
- # @example Ensure that the key will be persisted at least on the one node
320
- # c.append("foo", "bar", :observe => {:persisted => 1})
321
- #
322
- def append(key, value)
323
- store_op(:append, key, value)
324
- end
325
-
326
- # Prepend this object to the existing object
327
- #
328
- # @since 1.0.0
329
- #
330
- # @note This operation is kind of data-aware from server point of view.
331
- # This mean that the server treats value as binary stream and just
332
- # perform concatenation, therefore it won't work with +:marshal+ and
333
- # +:document+ formats, because of lack of knowledge how to merge values
334
- # in these formats. See {Bucket#cas} for workaround.
335
- #
336
- # @overload prepend(key, value, options = {})
337
- # @param key [String, Symbol] Key used to reference the value.
338
- # @param value [Object] Value to be stored
339
- # @param options [Hash] Options for operation.
340
- # @option options [Fixnum] :cas The CAS value for an object. This value
341
- # created on the server and is guaranteed to be unique for each value of
342
- # a given key. This value is used to provide simple optimistic
343
- # concurrency control when multiple clients or threads try to update an
344
- # item simultaneously.
345
- # @option options [Symbol] :format (self.default_format) The
346
- # representation for storing the value in the bucket. For more info see
347
- # {Bucket#default_format}.
348
- # @option options [Hash] :observe Apply persistence condition before
349
- # returning result. When this option specified the library will observe
350
- # given condition. See {Bucket#observe_and_wait}.
351
- #
352
- # @raise [Couchbase::Error::Connect] if connection closed (see {Bucket#reconnect})
353
- # @raise [Couchbase::Error::KeyExists] on CAS mismatch
354
- # @raise [Couchbase::Error::NotStored] if the key doesn't exist
355
- # @raise [ArgumentError] when passing the block in synchronous mode
356
- # @raise [Couchbase::Error::Timeout] if timeout interval for observe
357
- # exceeds
358
- #
359
- # @example Simple prepend example
360
- # c.set("foo", "aaa")
361
- # c.prepend("foo", "bbb")
362
- # c.get("foo") #=> "bbbaaa"
363
- #
364
- # @example Using explicit format option
365
- # c.default_format #=> :document
366
- # c.set("foo", {"y" => "z"})
367
- # c.prepend("foo", '[', :format => :plain)
368
- # c.append("foo", ', {"z": "y"}]', :format => :plain)
369
- # c.get("foo") #=> [{"y"=>"z"}, {"z"=>"y"}]
370
- #
371
- # @example Using optimistic locking. The operation will fail on CAS mismatch
372
- # ver = c.set("foo", "aaa")
373
- # c.prepend("foo", "bbb", :cas => ver)
374
- #
375
- # @example Ensure that the key will be persisted at least on the one node
376
- # c.prepend("foo", "bar", :observe => {:persisted => 1})
377
- #
378
- def prepend(key, value)
379
- store_op(:prepend, key, value)
380
- end
381
-
382
- private
383
-
384
- def store_args_parser(key, value, options)
385
- key = key.to_str if key.respond_to?(:to_str)
386
- ttl = options.delete(:ttl) || default_ttl
387
- transcoder = @transcoders[options.delete(:format)] || self.transcoder
388
-
389
- [validate_key(key), value, ttl, transcoder]
390
- end
391
-
392
- def store_op(op, key, value, options = {})
393
- key, value, ttl, transcoder = store_args_parser(key, value, options)
394
-
395
- if key.is_a?(String) || key.is_a?(Symbol)
396
- store_by_string(op, key.to_s, value, ttl, transcoder, options)
397
- elsif key.is_a?(Hash)
398
- store_by_hash(op, key, value)
399
- else
400
- fail TypeError.new
401
- end
402
- end
403
-
404
- def store_by_string(op, key, value, ttl, transcoder, options)
405
- if options[:cas] && op == :set
406
- client_cas(key, value, ttl, options[:cas], transcoder)
407
- else
408
- transcoder = op == :append || op == :prepend ? transcoders[:plain] : transcoder
409
- future = client_store_op(op, key, value, ttl, transcoder)
410
- if cas = future_cas(future)
411
- cas
412
- else
413
- fail_store_op(op)
414
- end
415
- end
416
- end
417
-
418
- def store_by_hash(op, key, value)
419
- fail TypeError.new if !value.nil?
420
- multi_op(op, key)
421
- end
422
-
423
- def async_store_op(op, key, value, options, &block)
424
- key, value, ttl, transcoder = store_args_parser(key, value, options)
425
- future = client_store_op(op, key, value, ttl, transcoder)
426
- register_future(future, { op: op }, &block)
427
- end
428
-
429
- def multi_op(op, keys)
430
- {}.tap do |results|
431
- keys.each_pair do |key, value|
432
- results[key] = client.send(op, key, default_ttl, value)
433
- end
434
- end
435
- end
436
-
437
- def client_store_op(op, key, value, ttl, transcoder)
438
- STORE_OP_METHODS[op].call(self.client, key, value, ttl, transcoder)
439
- end
440
-
441
- def client_cas(key, value, ttl, cas, transcoder)
442
- cas_response = client.cas(key, cas, ttl, value, transcoder)
443
- if cas_response.to_s == 'OK'
444
- get(key, extended: true)[2]
445
- else
446
- raise Couchbase::Error::KeyExists.new
447
- end
448
- end
449
-
450
- def fail_store_op(op)
451
- case op
452
- when :replace
453
- fail Couchbase::Error::NotFound
454
- when :append, :prepend
455
- fail Couchbase::Error::NotStored
456
- else
457
- fail Couchbase::Error::KeyExists
458
- end
459
- end
460
-
461
- end
462
-
463
- end
@@ -1,140 +0,0 @@
1
- # Author:: Mike Evans <mike@urlgonomics.com>
2
- # Copyright:: 2013 Urlgonomics LLC.
3
- # License:: Apache License, Version 2.0
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
-
18
- module Couchbase::Operations
19
- module Touch
20
-
21
- # Update the expiry time of an item
22
- #
23
- # @since 1.0.0
24
- #
25
- # The +touch+ method allow you to update the expiration time on a given
26
- # key. This can be useful for situations where you want to prevent an item
27
- # from expiring without resetting the associated value. For example, for a
28
- # session database you might want to keep the session alive in the database
29
- # each time the user accesses a web page without explicitly updating the
30
- # session value, keeping the user's session active and available.
31
- #
32
- # @overload touch(key, options = {})
33
- # @param key [String, Symbol] Key used to reference the value.
34
- # @param options [Hash] Options for operation.
35
- # @option options [Fixnum] :ttl (self.default_ttl) Expiry time for key.
36
- # Values larger than 30*24*60*60 seconds (30 days) are interpreted as
37
- # absolute times (from the epoch).
38
- # @option options [true, false] :quiet (self.quiet) If set to +true+, the
39
- # operation won't raise error for missing key, it will return +nil+.
40
- #
41
- # @yieldparam ret [Result] the result of operation in asynchronous mode
42
- # (valid attributes: +error+, +operation+, +key+).
43
- #
44
- # @return [true, false] +true+ if the operation was successful and +false+
45
- # otherwise.
46
- #
47
- # @raise [Couchbase::Error::Connect] if connection closed (see {Bucket#reconnect})
48
- #
49
- # @raise [ArgumentError] when passing the block in synchronous mode
50
- #
51
- # @example Touch value using +default_ttl+
52
- # c.touch("foo")
53
- #
54
- # @example Touch value using custom TTL (10 seconds)
55
- # c.touch("foo", :ttl => 10)
56
- #
57
- # @overload touch(keys)
58
- # @param keys [Hash] The Hash where keys represent the keys in the
59
- # database, values -- the expiry times for corresponding key. See
60
- # description of +:ttl+ argument above for more information about TTL
61
- # values.
62
- #
63
- # @yieldparam ret [Result] the result of operation for each key in
64
- # asynchronous mode (valid attributes: +error+, +operation+, +key+).
65
- #
66
- # @return [Hash] Mapping keys to result of touch operation (+true+ if the
67
- # operation was successful and +false+ otherwise)
68
- #
69
- # @example Touch several values
70
- # c.touch("foo" => 10, :bar => 20) #=> {"foo" => true, "bar" => true}
71
- #
72
- # @example Touch several values in async mode
73
- # c.run do
74
- # c.touch("foo" => 10, :bar => 20) do |ret|
75
- # ret.operation #=> :touch
76
- # ret.success? #=> true
77
- # ret.key #=> "foo" and "bar" in separate calls
78
- # end
79
- # end
80
- #
81
- # @example Touch single value
82
- # c.touch("foo" => 10) #=> true
83
- #
84
- def touch(*args)
85
- key, ttl, options = expand_touch_args(args)
86
-
87
- case key
88
- when String, Symbol
89
- success = client_touch(key, ttl)
90
- not_found_error(!success, options)
91
- success
92
- when Hash
93
- multi_touch_hash(key, options)
94
- when Array
95
- multi_touch_array(key, options)
96
- end
97
- end
98
-
99
- def async_touch(key, ttl, &block)
100
- register_future(client.touch(key, ttl), { op: :touch }, &block)
101
- end
102
-
103
- private
104
-
105
- def expand_touch_args(args)
106
- options = extract_options_hash(args)
107
- ttl = options[:ttl] || if args.size > 1 && args.last.respond_to?(:to_int?)
108
- args.pop
109
- else
110
- default_ttl
111
- end
112
- key = args.size > 1 ? args : args.pop
113
-
114
- [validate_key(key), ttl, options]
115
- end
116
-
117
- def multi_touch_hash(keys, options = {})
118
- {}.tap do |results|
119
- keys.each_pair do |key, ttl|
120
- results[key] = client_touch(key, ttl)
121
- end
122
- end
123
- end
124
-
125
- def multi_touch_array(keys, options = {})
126
- ttl = options[:ttl] || default_ttl
127
-
128
- {}.tap do |results|
129
- keys.each do |key|
130
- results[key] = client_touch(key, ttl)
131
- end
132
- end
133
- end
134
-
135
- def client_touch(key, ttl, options = {})
136
- client.touch(key, ttl).get
137
- end
138
-
139
- end
140
- end