Class: ActiveSupport::Cache::CouchbaseStore

Inherits:
Store
  • Object
show all
Defined in:
lib/active_support/cache/couchbase_store.rb

Overview

This class implements Cache interface for Rails. To use it just put following line in your config/application.rb file:

config.cache_store = :couchbase_store

You can also pass additional connection options there

cache_options = {
  :bucket => 'protected',
  :username => 'protected',
  :password => 'secret',
  :expires_in => 30.seconds
}
config.cache_store = :couchbase_store, cache_options

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ CouchbaseStore

Creates a new CouchbaseStore object, with the given options. For more info see ActiveSupport::Cache::CouchbaseStore.{Couchbase{Couchbase::Bucket{Couchbase::Bucket#initialize}

ActiveSupport::Cache::CouchbaseStore.new(:bucket => "cache")

If no options are specified, then CouchbaseStore will connect to localhost port 8091 (default Couchbase Server port) and will use bucket named “default” which is always open for unauthorized access (if exists).



50
51
52
53
54
55
56
57
58
59
# File 'lib/active_support/cache/couchbase_store.rb', line 50

def initialize(*args)
  args = [*(args.flatten)]
  options = args.extract_options! || {}
  @raise_errors = !options[:quiet] = !options.delete(:raise_errors)
  options[:default_ttl] ||= options.delete(:expires_in)
  options[:default_format] ||= :marshal
  options[:key_prefix] ||= options.delete(:namespace)
  args.push(options)
  @data = ::Couchbase::Bucket.new(*args)
end

Instance Method Details

#decrement(name, amount = 1, options = nil) ⇒ Fixnum

Decrement an integer value in the cache.

Parameters:

  • name (String)

    name for the key

  • amount (Fixnum) (defaults to: 1)

    (1) the delta value

  • options (Hash) (defaults to: nil)

Options Hash (options):

  • :expires_in (Fixnum)

    the expiration time on the cache in seconds. Values larger than 30*24*60*60 seconds (30 days) are interpreted as absolute times (from the epoch).

  • :initial (Fixnum)

    this option allows to initialize the value if the key is missing in the cache

Returns:

  • (Fixnum)

    new value

Since:

  • 1.2.0.dp5



268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
# File 'lib/active_support/cache/couchbase_store.rb', line 268

def decrement(name, amount = 1, options = nil)
  options ||= {}
  name = expanded_key name

  if ttl = options.delete(:expires_in)
    options[:ttl] ||= ttl
  end
  options[:create] = true
  instrument(:decrement, name, options) do |payload|
    payload[:amount] = amount if payload
    @data.decr(name, amount, options)
  end
rescue ::Couchbase::Error::Base => e
  logger.error("#{e.class}: #{e.message}") if logger
  raise if @raise_errors
  false
end

#delete(name, options = nil) ⇒ true, false

Deletes an entry in the cache.

Returns:

  • (true, false)

    true if an entry is deleted

Since:

  • 1.2.0.dp5



213
214
215
216
217
218
219
220
# File 'lib/active_support/cache/couchbase_store.rb', line 213

def delete(name, options = nil)
  options ||= {}
  name = expanded_key name

  instrument(:delete, name) do
    delete_entry(name, options)
  end
end

#delete_entry(key, options) ⇒ Object (protected)

Delete an entry from the cache.



324
325
326
327
328
329
330
# File 'lib/active_support/cache/couchbase_store.rb', line 324

def delete_entry(key, options) # :nodoc:
  @data.delete(key, options)
rescue ::Couchbase::Error::Base => e
  logger.error("#{e.class}: #{e.message}") if logger
  raise if @raise_errors
  false
end

#exists?(name, options = nil) ⇒ true, false Also known as: exist?

Return true if the cache contains an entry for the given key.

Returns:

  • (true, false)

Since:

  • 1.2.0.dp5



198
199
200
201
202
203
204
205
# File 'lib/active_support/cache/couchbase_store.rb', line 198

def exists?(name, options = nil)
  options ||= {}
  name = expanded_key name

  instrument(:exists?, name) do
    !read_entry(name, options).nil?
  end
end

#fetch(name, options = nil) ⇒ Object

Fetches data from the cache, using the given key.

If there is data in the cache with the given key, then that data is returned. If there is no such data in the cache (a cache miss), then nil will be returned. However, if a block has been passed, that block will be run in the event of a cache miss. The return value of the block will be written to the cache under the given cache key, and that return value will be returned.

Parameters:

  • name (String)

    name for the key

  • options (Hash) (defaults to: nil)

Options Hash (options):

  • :force (true, false)

    if this option is true it will force cache miss.

  • :expires_in (Fixnum)

    the expiration time on the cache in seconds. Values larger than 30*24*60*60 seconds (30 days) are interpreted as absolute times (from the epoch).

  • :unless_exists (true, false)

    if this option is true it will write value only if the key doesn’t exist in the database (it accepts :unless_exist too).

Returns:

  • (Object)

Since:

  • 1.2.0.dp5



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/active_support/cache/couchbase_store.rb', line 84

def fetch(name, options = nil)
  options ||= {}
  name = expanded_key(name)

  if block_given?
    unless options[:force]
      entry = instrument(:read, name, options) do |payload|
        payload[:super_operation] = :fetch if payload
        read_entry(name, options)
      end
    end

    if !entry.nil?
      instrument(:fetch_hit, name, options) { |payload| }
      entry
    else
      result = instrument(:generate, name, options) do |payload|
        yield
      end
      write(name, result, options)
      result
    end
  else
    read(name, options)
  end
end

#increment(name, amount = 1, options = nil) ⇒ Fixnum

Increment an integer value in the cache.

Parameters:

  • name (String)

    name for the key

  • amount (Fixnum) (defaults to: 1)

    (1) the delta value

  • options (Hash) (defaults to: nil)

Options Hash (options):

  • :expires_in (Fixnum)

    the expiration time on the cache in seconds. Values larger than 30*24*60*60 seconds (30 days) are interpreted as absolute times (from the epoch).

  • :initial (Fixnum) — default: 1

    this option allows to initialize the value if the key is missing in the cache

Returns:

  • (Fixnum)

    new value

Since:

  • 1.2.0.dp5



236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
# File 'lib/active_support/cache/couchbase_store.rb', line 236

def increment(name, amount = 1, options = nil)
  options ||= {}
  name = expanded_key name

  if ttl = options.delete(:expires_in)
    options[:ttl] ||= ttl
  end
  options[:create] = true
  instrument(:increment, name, options) do |payload|
    payload[:amount] = amount if payload
    @data.incr(name, amount, options)
  end
rescue ::Couchbase::Error::Base => e
  logger.error("#{e.class}: #{e.message}") if logger
  raise if @raise_errors
  false
end

#read(name, options = nil) ⇒ Object

Fetches data from the cache, using the given key.

If there is data in the cache with the given key, then that data is returned. Otherwise, nil is returned.

Parameters:

  • name (String)

    name for the key

  • options (Hash) (defaults to: nil)

Options Hash (options):

  • :expires_in (Fixnum)

    the expiration time on the cache in seconds. Values larger than 30*24*60*60 seconds (30 days) are interpreted as absolute times (from the epoch).

  • :raw (true, false)

    do not marshal the value if this option is true

Returns:

  • (Object)

Since:

  • 1.2.0.dp5



154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/active_support/cache/couchbase_store.rb', line 154

def read(name, options = nil)
  options ||= {}
  name = expanded_key name
  if options.delete(:raw)
    options[:format] = :plain
  end

  instrument(:read, name, options) do |payload|
    entry = read_entry(name, options)
    payload[:hit] = !!entry if payload
    entry
  end
end

#read_entry(key, options) ⇒ Object (protected)

Read an entry from the cache.



298
299
300
301
302
303
304
# File 'lib/active_support/cache/couchbase_store.rb', line 298

def read_entry(key, options) # :nodoc:
  @data.get(key, options)
rescue ::Couchbase::Error::Base => e
  logger.error("#{e.class}: #{e.message}") if logger
  raise if @raise_errors
  nil
end

#read_multi(*names) ⇒ Hash

Read multiple values at once from the cache.

Options can be passed in the last argument.

Returns a hash mapping the names provided to the values found.

Returns:

  • (Hash)

    key-value pairs

Since:

  • 1.2.0.dp5



177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/active_support/cache/couchbase_store.rb', line 177

def read_multi(*names)
  options = names.extract_options!
  names = names.flatten.map{|name| expanded_key(name)}
  options[:assemble_hash] = true
  if options.delete(:raw)
    options[:format] = :plain
  end
  instrument(:read_multi, names, options) do
    @data.get(names, options)
  end
rescue ::Couchbase::Error::Base => e
  logger.error("#{e.class}: #{e.message}") if logger
  raise if @raise_errors
  false
end

#stats(*arg) ⇒ Hash

Get the statistics from the memcached servers.

Returns:

  • (Hash)

Since:

  • 1.2.0.dp5



291
292
293
# File 'lib/active_support/cache/couchbase_store.rb', line 291

def stats(*arg)
  @data.stats(*arg)
end

#write(name, value, options = nil) ⇒ Fixnum, false

Writes the value to the cache, with the key

Parameters:

  • name (String)

    name for the key

  • value (Object)

    value of the key

  • options (Hash) (defaults to: nil)

Options Hash (options):

  • :expires_in (Fixnum)

    the expiration time on the cache in seconds. Values larger than 30*24*60*60 seconds (30 days) are interpreted as absolute times (from the epoch).

Returns:

  • (Fixnum, false)

    false in case of failure and CAS value otherwise (it could be used as true value)

Since:

  • 1.2.0.dp5



124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/active_support/cache/couchbase_store.rb', line 124

def write(name, value, options = nil)
  options ||= {}
  name = expanded_key name
  if options.delete(:raw)
    options[:format] = :plain
    value = value.to_s
    value.force_encoding(Encoding::BINARY) if defined?(Encoding)
  end

  instrument(:write, name, options) do |payload|
    write_entry(name, value, options)
  end
end

#write_entry(key, value, options) ⇒ Object (protected)

Write an entry to the cache.



307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
# File 'lib/active_support/cache/couchbase_store.rb', line 307

def write_entry(key, value, options) # :nodoc:
  method = if options[:unless_exists] || options[:unless_exist]
             :add
           else
             :set
           end
  if ttl = options.delete(:expires_in)
    options[:ttl] ||= ttl
  end
  @data.send(method, key, value, options)
rescue ::Couchbase::Error::Base => e
  logger.error("#{e.class}: #{e.message}") if logger
  raise if @raise_errors
  false
end