Parent

Class Index [+]

Quicksearch

Rack::Session::Memcache

Rack::Session::Memcache provides simple cookie based session management. Session data is stored in memcached. The corresponding session key is maintained in the cookie. You may treat Session::Memcache as you would Session::Pool with the following caveats.

Note that memcache does drop data before it may be listed to expire. For a full description of behaviour, please see memcache’s documentation.

Constants

DEFAULT_OPTIONS

Attributes

mutex[R]
pool[R]

Public Class Methods

new(app, options={}) click to toggle source
    # File lib/rack/session/memcache.rb, line 28
28:       def initialize(app, options={})
29:         super
30: 
31:         @mutex = Mutex.new
32:         mserv = @default_options[:memcache_server]
33:         mopts = @default_options.
34:           reject{|k,v| !MemCache::DEFAULT_OPTIONS.include? k }
35:         @pool = MemCache.new mserv, mopts
36:         unless @pool.active? and @pool.servers.any?{|c| c.alive? }
37:           raise 'No memcache servers'
38:         end
39:       end

Public Instance Methods

generate_sid() click to toggle source
    # File lib/rack/session/memcache.rb, line 41
41:       def generate_sid
42:         loop do
43:           sid = super
44:           break sid unless @pool.get(sid, true)
45:         end
46:       end
get_session(env, session_id) click to toggle source
    # File lib/rack/session/memcache.rb, line 48
48:       def get_session(env, session_id)
49:         @mutex.lock if env['rack.multithread']
50:         unless session_id and session = @pool.get(session_id)
51:           session_id, session = generate_sid, {}
52:           unless /^STORED/ =~ @pool.add(session_id, session)
53:             raise "Session collision on '#{session_id.inspect}'"
54:           end
55:         end
56:         session.instance_variable_set '@old', @pool.get(session_id, true)
57:         return [session_id, session]
58:       rescue MemCache::MemCacheError, Errno::ECONNREFUSED
59:         # MemCache server cannot be contacted
60:         warn "#{self} is unable to find memcached server."
61:         warn $!.inspect
62:         return [ nil, {} ]
63:       ensure
64:         @mutex.unlock if @mutex.locked?
65:       end
set_session(env, session_id, new_session, options) click to toggle source
     # File lib/rack/session/memcache.rb, line 67
 67:       def set_session(env, session_id, new_session, options)
 68:         expiry = options[:expire_after]
 69:         expiry = expiry.nil? ? 0 : expiry + 1
 70: 
 71:         @mutex.lock if env['rack.multithread']
 72:         if options[:renew] or options[:drop]
 73:           @pool.delete session_id
 74:           return false if options[:drop]
 75:           session_id = generate_sid
 76:           @pool.add session_id, {} # so we don't worry about cache miss on #set
 77:         end
 78: 
 79:         session = @pool.get(session_id) || {}
 80:         old_session = new_session.instance_variable_get '@old'
 81:         old_session = old_session ? Marshal.load(old_session) : {}
 82: 
 83:         unless Hash === old_session and Hash === new_session
 84:           env['rack.errors'].
 85:             puts 'Bad old_session or new_session sessions provided.'
 86:         else # merge sessions
 87:           # alterations are either update or delete, making as few changes as
 88:           # possible to prevent possible issues.
 89: 
 90:           # removed keys
 91:           delete = old_session.keys - new_session.keys
 92:           if $VERBOSE and not delete.empty?
 93:             env['rack.errors'].
 94:               puts "//@#{session_id}: delete #{delete*','}"
 95:           end
 96:           delete.each{|k| session.delete k }
 97: 
 98:           # added or altered keys
 99:           update = new_session.keys.
100:             select{|k| new_session[k] != old_session[k] }
101:           if $VERBOSE and not update.empty?
102:             env['rack.errors'].puts "//@#{session_id}: update #{update*','}"
103:           end
104:           update.each{|k| session[k] = new_session[k] }
105:         end
106: 
107:         @pool.set session_id, session, expiry
108:         return session_id
109:       rescue MemCache::MemCacheError, Errno::ECONNREFUSED
110:         # MemCache server cannot be contacted
111:         warn "#{self} is unable to find memcached server."
112:         warn $!.inspect
113:         return false
114:       ensure
115:         @mutex.unlock if @mutex.locked?
116:       end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.