Class: ActiveRecord::SessionStore::SqlBypass
- Inherits:
-
Object
- Object
- ActiveRecord::SessionStore::SqlBypass
- Extended by:
- ClassMethods
- Defined in:
- lib/active_record/session_store/sql_bypass.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
-
#persisted? ⇒ Boolean
Returns true if the record is persisted, i.e.
- #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.
79 80 81 82 83 84 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 79 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
53 54 55 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 53 def connection @connection ||= ActiveRecord::Base.connection end |
.connection_pool ⇒ Object
57 58 59 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 57 def connection_pool @connection_pool ||= ActiveRecord::Base.connection_pool end |
Instance Attribute Details
#data ⇒ Object
Lazy-unmarshal session state.
92 93 94 95 96 97 98 99 100 101 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 92 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.
71 72 73 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 71 def new_record @new_record end |
#session_id ⇒ Object (readonly)
Returns the value of attribute session_id.
71 72 73 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 71 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.
62 63 64 65 66 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 62 def find_by_session_id(session_id) if record = connection.select_one("SELECT #{connection.quote_column_name(data_column)} AS data FROM #{@@table_name} WHERE #{connection.quote_column_name(@@session_id_column)}=#{connection.quote(session_id.to_s)}") 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’.
41 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 41 cattr_accessor :data_column |
#destroy ⇒ Object
131 132 133 134 135 136 137 138 139 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 131 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.to_s)} end_sql end |
#loaded? ⇒ Boolean
103 104 105 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 103 def loaded? @data end |
#persisted? ⇒ Boolean
Returns true if the record is persisted, i.e. it’s not a new record
87 88 89 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 87 def persisted? !@new_record end |
#save ⇒ Object
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 107 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’.
35 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 35 cattr_accessor :session_id_column |
#table_name ⇒ Object
:singleton-method: The table name defaults to ‘sessions’.
29 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 29 cattr_accessor :table_name |