delete_session(req, sid, options)
click to toggle source
def delete_session(req, sid, options)
destroy_session req.env, sid, options
end
destroy_session(env, session_id, options)
click to toggle source
def destroy_session(env, session_id, options)
with_lock(env) do
@pool.delete(session_id)
generate_sid unless options[:drop]
end
end
find_session(req, sid)
click to toggle source
def find_session(req, sid)
get_session req.env, sid
end
generate_sid()
click to toggle source
def generate_sid
while true
sid = super
break sid unless @pool.get(sid)
end
end
get_session(env, sid)
click to toggle source
def get_session(env, sid)
with_lock(env, [nil, {}]) do
unless sid and !sid.empty? and session = @pool.get(sid)
sid, session = generate_sid, {}
unless @pool.add(sid, session)
raise "Session collision on '#{sid.inspect}'"
end
end
[sid, session]
end
end
set_session(env, session_id, new_session, options)
click to toggle source
def set_session(env, session_id, new_session, options)
return false unless session_id
expiry = options[:expire_after]
expiry = expiry.nil? ? 0 : expiry + 1
with_lock(env, false) do
@pool.set session_id, new_session, expiry
session_id
end
end
with_lock(env, default=nil) { || ... }
click to toggle source
def with_lock(env, default=nil)
@mutex.lock if env['rack.multithread']
yield
rescue ::Dalli::DalliError, Errno::ECONNREFUSED
raise if $!.message =~ /undefined class/
if $VERBOSE
warn "#{self} is unable to find memcached server."
warn $!.inspect
end
default
ensure
@mutex.unlock if @mutex.locked?
end
write_session(req, sid, session, options)
click to toggle source
def write_session(req, sid, session, options)
set_session req.env, sid, session, options
end