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.
77 78 79 80 81 82 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 77 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
51 52 53 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 51 def connection @connection ||= ActiveRecord::Base.connection end |
.connection_pool ⇒ Object
55 56 57 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 55 def connection_pool @connection_pool ||= ActiveRecord::Base.connection_pool end |
Instance Attribute Details
#data ⇒ Object
Lazy-unmarshal session state.
90 91 92 93 94 95 96 97 98 99 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 90 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.
69 70 71 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 69 def new_record @new_record end |
#session_id ⇒ Object (readonly)
Returns the value of attribute session_id.
69 70 71 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 69 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.
60 61 62 63 64 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 60 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’.
39 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 39 cattr_accessor :data_column |
#destroy ⇒ Object
129 130 131 132 133 134 135 136 137 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 129 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
101 102 103 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 101 def loaded? @data end |
#persisted? ⇒ Boolean
Returns true if the record is persisted, i.e. it’s not a new record
85 86 87 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 85 def persisted? !@new_record end |
#save ⇒ Object
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 105 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’.
33 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 33 cattr_accessor :session_id_column |
#table_name ⇒ Object
:singleton-method: The table name defaults to ‘sessions’.
27 |
# File 'lib/active_record/session_store/sql_bypass.rb', line 27 cattr_accessor :table_name |