Class: Rack::Session::Redis

Inherits:
Abstract::ID
  • Object
show all
Includes:
Merb::RedisStore
Defined in:
lib/rack/session/merb.rb,
lib/rack/session/redis.rb

Constant Summary collapse

DEFAULT_OPTIONS =
Abstract::ID::DEFAULT_OPTIONS.merge :redis_server => "redis://127.0.0.1:6379/0"

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Merb::RedisStore

#delete_session, #retrieve_session, #store_session

Constructor Details

#initialize(app, options = {}) ⇒ Redis

Returns a new instance of Redis.



7
8
9
10
11
# File 'lib/rack/session/redis.rb', line 7

def initialize(app, options = {})
  super
  @mutex = Mutex.new
  @pool = ::Redis::Factory.create options[:redis_server] || @default_options[:redis_server]
end

Instance Attribute Details

#mutexObject (readonly)

Returns the value of attribute mutex.



4
5
6
# File 'lib/rack/session/redis.rb', line 4

def mutex
  @mutex
end

#poolObject (readonly)

Returns the value of attribute pool.



4
5
6
# File 'lib/rack/session/redis.rb', line 4

def pool
  @pool
end

Instance Method Details

#generate_sidObject



13
14
15
16
17
18
# File 'lib/rack/session/redis.rb', line 13

def generate_sid
  loop do
    sid = super
    break sid unless @pool.get(sid)
  end
end

#get_session(env, sid) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/rack/session/redis.rb', line 20

def get_session(env, sid)
  session = @pool.get(sid) if sid
  @mutex.lock if env['rack.multithread']
  unless sid and session
    env['rack.errors'].puts("Session '#{sid.inspect}' not found, initializing...") if $VERBOSE and not sid.nil?
    session = {}
    sid = generate_sid
    ret = @pool.set sid, session
    raise "Session collision on '#{sid.inspect}'" unless ret
  end
  session.instance_variable_set('@old', {}.merge(session))
  return [sid, session]
rescue Errno::ECONNREFUSED
  warn "#{self} is unable to find server."
  warn $!.inspect
  return [ nil, {} ]
ensure
  @mutex.unlock if env['rack.multithread']
end

#set_session(env, session_id, new_session, options) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/rack/session/redis.rb', line 40

def set_session(env, session_id, new_session, options)
  @mutex.lock if env['rack.multithread']
  session = @pool.get(session_id) rescue {}
  if options[:renew] or options[:drop]
    @pool.del session_id
    return false if options[:drop]
    session_id = generate_sid
    @pool.set session_id, 0
  end
  old_session = new_session.instance_variable_get('@old') || {}
  session = merge_sessions session_id, old_session, new_session, session
  @pool.set session_id, session, options
  return session_id
rescue Errno::ECONNREFUSED
  warn "#{self} is unable to find server."
  warn $!.inspect
  return false
ensure
  @mutex.unlock if env['rack.multithread']
end