mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
51 lines
1.4 KiB
Ruby
51 lines
1.4 KiB
Ruby
begin
|
|
require_library_or_gem 'memcache'
|
|
|
|
module ActionController
|
|
module Session
|
|
class MemCacheStore < AbstractStore
|
|
def initialize(app, options = {})
|
|
# Support old :expires option
|
|
options[:expire_after] ||= options[:expires]
|
|
|
|
super
|
|
|
|
@default_options = {
|
|
:namespace => 'rack:session',
|
|
:memcache_server => 'localhost:11211'
|
|
}.merge(@default_options)
|
|
|
|
@pool = options[:cache] || MemCache.new(@default_options[:memcache_server], @default_options)
|
|
unless @pool.servers.any? { |s| s.alive? }
|
|
raise "#{self} unable to find server during initialization."
|
|
end
|
|
@mutex = Mutex.new
|
|
|
|
super
|
|
end
|
|
|
|
private
|
|
def get_session(env, sid)
|
|
sid ||= generate_sid
|
|
begin
|
|
session = @pool.get(sid) || {}
|
|
rescue MemCache::MemCacheError, Errno::ECONNREFUSED
|
|
session = {}
|
|
end
|
|
[sid, session]
|
|
end
|
|
|
|
def set_session(env, sid, session_data)
|
|
options = env['rack.session.options']
|
|
expiry = options[:expire_after] || 0
|
|
@pool.set(sid, session_data, expiry)
|
|
return true
|
|
rescue MemCache::MemCacheError, Errno::ECONNREFUSED
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
end
|
|
rescue LoadError
|
|
# MemCache wasn't available so neither can the store be
|
|
end
|