@@ -58,66 +58,83 @@ class ActiveRecordStore < ActionDispatch::Session::AbstractStore
5858 cattr_accessor :session_class
5959
6060 SESSION_RECORD_KEY = 'rack.session.record'
61- ENV_SESSION_OPTIONS_KEY = Rack ::Session ::Abstract ::ENV_SESSION_OPTIONS_KEY
61+ if Rack . const_defined? ( :RACK_SESSION_OPTIONS )
62+ ENV_SESSION_OPTIONS_KEY = Rack ::RACK_SESSION_OPTIONS
63+ else
64+ ENV_SESSION_OPTIONS_KEY = Rack ::Session ::Abstract ::ENV_SESSION_OPTIONS_KEY
65+ end
6266
63- private
64- def get_session ( env , sid )
65- logger . silence_logger do
66- unless sid and session = @@session_class . find_by_session_id ( sid )
67- # If the sid was nil or if there is no pre-existing session under the sid,
68- # force the generation of a new sid and associate a new session associated with the new sid
69- sid = generate_sid
70- session = @@session_class . new ( :session_id => sid , :data => { } )
71- end
72- env [ SESSION_RECORD_KEY ] = session
73- [ sid , session . data ]
67+ private
68+ def get_session ( request , sid )
69+ logger . silence_logger do
70+ unless sid and session = @@session_class . find_by_session_id ( sid )
71+ # If the sid was nil or if there is no pre-existing session under the sid,
72+ # force the generation of a new sid and associate a new session associated with the new sid
73+ sid = generate_sid
74+ session = @@session_class . new ( :session_id => sid , :data => { } )
7475 end
76+ request . env [ SESSION_RECORD_KEY ] = session
77+ [ sid , session . data ]
7578 end
79+ end
7680
77- def set_session ( env , sid , session_data , options )
78- logger . silence_logger do
79- record = get_session_model ( env , sid )
80- record . data = session_data
81- return false unless record . save
81+ def write_session ( request , sid , session_data , options )
82+ logger . silence_logger do
83+ record = get_session_model ( request , sid )
84+ record . data = session_data
85+ return false unless record . save
8286
83- session_data = record . data
84- if session_data && session_data . respond_to? ( :each_value )
85- session_data . each_value do |obj |
86- obj . clear_association_cache if obj . respond_to? ( :clear_association_cache )
87- end
87+ session_data = record . data
88+ if session_data && session_data . respond_to? ( :each_value )
89+ session_data . each_value do |obj |
90+ obj . clear_association_cache if obj . respond_to? ( :clear_association_cache )
8891 end
89-
90- sid
9192 end
92- end
9393
94- def destroy_session ( env , session_id , options )
95- logger . silence_logger do
96- if sid = current_session_id ( env )
97- get_session_model ( env , sid ) . destroy
98- env [ SESSION_RECORD_KEY ] = nil
99- end
94+ sid
95+ end
96+ end
10097
101- generate_sid unless options [ :drop ]
98+ def delete_session ( request , session_id , options )
99+ logger . silence_logger do
100+ if sid = current_session_id ( request )
101+ get_session_model ( request , sid ) . destroy
102+ request . env [ SESSION_RECORD_KEY ] = nil
102103 end
104+ generate_sid unless options [ :drop ]
103105 end
106+ end
104107
105- def get_session_model ( env , sid )
106- if env [ ENV_SESSION_OPTIONS_KEY ] [ :id ] . nil?
107- env [ SESSION_RECORD_KEY ] = find_session ( sid )
108+ def get_session_model ( request , id )
109+ logger . silence_logger do
110+ model = @@session_class . find_by_session_id ( id )
111+ if !model
112+ id = generate_sid
113+ model = @@session_class . new ( :session_id => id , :data => { } )
114+ model . save
115+ end
116+ if request . env [ ENV_SESSION_OPTIONS_KEY ] [ :id ] . nil?
117+ request . env [ SESSION_RECORD_KEY ] = model
108118 else
109- env [ SESSION_RECORD_KEY ] ||= find_session ( sid )
119+ request . env [ SESSION_RECORD_KEY ] ||= model
110120 end
121+ model
111122 end
123+ end
112124
113- def find_session ( id )
114- @@session_class . find_by_session_id ( id ) ||
115- @@session_class . new ( : session_id => id , : data => { } )
116- end
125+ def find_session ( request , id )
126+ model = get_session_model ( request , id )
127+ [ model . session_id , model . data ]
128+ end
117129
118- def logger
119- ActiveRecord ::Base . logger || ActiveRecord ::SessionStore ::NilLogger
120- end
130+ def logger
131+ ActiveRecord ::Base . logger || ActiveRecord ::SessionStore ::NilLogger
132+ end
121133 end
122134 end
123135end
136+
137+ if ActiveRecord ::VERSION ::MAJOR == 4
138+ require 'action_dispatch/session/legacy_support'
139+ ActionDispatch ::Session ::ActiveRecordStore . send ( :include , ActionDispatch ::Session ::LegacySupport )
140+ end
0 commit comments