Class: ActiveRecord::SessionStore::SqlBypass
- Extended by:
- ClassMethods
- Defined in:
- activerecord/lib/active_record/session_store.rb
Overview
A barebones session store which duck-types with the default session store but bypasses Active Record and issues SQL directly. This is an example session model class meant as a basis for your own classes.
The database connection, table name, and session id and data columns are configurable class attributes. Marshaling and unmarshaling are implemented as class methods that you may override. By default, marshaling data is
::Base64.encode64(Marshal.dump(data))
and unmarshaling data is
Marshal.load(::Base64.decode64(data))
This marshaling behavior is intended to store the widest range of binary session data in a text
column. For higher performance, store in a blob
column instead and forgo the Base64 encoding.
Constant Summary collapse
- @@table_name =
'sessions'
- @@session_id_column =
'session_id'
- @@data_column =
'data'
Class Attribute Summary collapse
Instance Attribute Summary collapse
-
#data ⇒ Object
Lazy-unmarshal session state.
-
#new_record ⇒ Object
(also: #new_record?)
readonly
Returns the value of attribute new_record.
-
#session_id ⇒ Object
readonly
Returns the value of attribute session_id.
Class Method Summary collapse
-
.find_by_session_id(session_id) ⇒ Object
Look up a session by id and unmarshal its data if found.
Instance Method Summary collapse
-
#data_column ⇒ Object
:singleton-method: The data field defaults to ‘data’.
- #destroy ⇒ Object
-
#initialize(attributes) ⇒ SqlBypass
constructor
Look for normal and marshaled data, self.find_by_session_id’s way of telling us to postpone unmarshaling until the data is requested.
- #loaded? ⇒ Boolean
- #save ⇒ Object
-
#session_id_column ⇒ Object
:singleton-method: The session id field defaults to ‘session_id’.
-
#table_name ⇒ Object
:singleton-method: The table name defaults to ‘sessions’.
Methods included from ClassMethods
create_table!, drop_table!, marshal, unmarshal
Constructor Details
#initialize(attributes) ⇒ SqlBypass
Look for normal and marshaled data, self.find_by_session_id’s way of telling us to postpone unmarshaling until the data is requested. We need to handle a normal data attribute in case of a new record.
239 240 241 242 243 244 |
# File 'activerecord/lib/active_record/session_store.rb', line 239 def initialize(attributes) @session_id = attributes[:session_id] @data = attributes[:data] @marshaled_data = attributes[:marshaled_data] @new_record = @marshaled_data.nil? end |
Class Attribute Details
.connection ⇒ Object
213 214 215 |
# File 'activerecord/lib/active_record/session_store.rb', line 213 def connection @connection ||= ActiveRecord::Base.connection end |
.connection_pool ⇒ Object
217 218 219 |
# File 'activerecord/lib/active_record/session_store.rb', line 217 def connection_pool @connection_pool ||= ActiveRecord::Base.connection_pool end |
Instance Attribute Details
#data ⇒ Object
Lazy-unmarshal session state.
247 248 249 250 251 252 253 254 255 256 |
# File 'activerecord/lib/active_record/session_store.rb', line 247 def data unless @data if @marshaled_data @data, @marshaled_data = self.class.unmarshal(@marshaled_data) || {}, nil else @data = {} end end @data end |
#new_record ⇒ Object (readonly) Also known as: new_record?
Returns the value of attribute new_record
231 232 233 |
# File 'activerecord/lib/active_record/session_store.rb', line 231 def new_record @new_record end |
#session_id ⇒ Object (readonly)
Returns the value of attribute session_id
231 232 233 |
# File 'activerecord/lib/active_record/session_store.rb', line 231 def session_id @session_id end |
Class Method Details
.find_by_session_id(session_id) ⇒ Object
Look up a session by id and unmarshal its data if found.
222 223 224 225 226 |
# File 'activerecord/lib/active_record/session_store.rb', line 222 def find_by_session_id(session_id) if record = connection.select_one("SELECT * FROM #{@@table_name} WHERE #{@@session_id_column}=#{connection.quote(session_id)}") new(:session_id => session_id, :marshaled_data => record['data']) end end |
Instance Method Details
#data_column ⇒ Object
:singleton-method: The data field defaults to ‘data’.
201 |
# File 'activerecord/lib/active_record/session_store.rb', line 201 cattr_accessor :data_column |
#destroy ⇒ Object
286 287 288 289 290 291 292 293 294 |
# File 'activerecord/lib/active_record/session_store.rb', line 286 def destroy return if @new_record connect = connection connect.delete <<-end_sql, 'Destroy session' DELETE FROM #{table_name} WHERE #{connect.quote_column_name(session_id_column)}=#{connect.quote(session_id)} end_sql end |
#loaded? ⇒ Boolean
258 259 260 |
# File 'activerecord/lib/active_record/session_store.rb', line 258 def loaded? @data end |
#save ⇒ Object
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 |
# File 'activerecord/lib/active_record/session_store.rb', line 262 def save return false unless loaded? marshaled_data = self.class.marshal(data) connect = connection if @new_record @new_record = false connect.update <<-end_sql, 'Create session' INSERT INTO #{table_name} ( #{connect.quote_column_name(session_id_column)}, #{connect.quote_column_name(data_column)} ) VALUES ( #{connect.quote(session_id)}, #{connect.quote(marshaled_data)} ) end_sql else connect.update <<-end_sql, 'Update session' UPDATE #{table_name} SET #{connect.quote_column_name(data_column)}=#{connect.quote(marshaled_data)} WHERE #{connect.quote_column_name(session_id_column)}=#{connect.quote(session_id)} end_sql end end |
#session_id_column ⇒ Object
:singleton-method: The session id field defaults to ‘session_id’.
195 |
# File 'activerecord/lib/active_record/session_store.rb', line 195 cattr_accessor :session_id_column |
#table_name ⇒ Object
:singleton-method: The table name defaults to ‘sessions’.
189 |
# File 'activerecord/lib/active_record/session_store.rb', line 189 cattr_accessor :table_name |