Object
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
ActiveSupport::Base64.encode64(Marshal.dump(data))
and unmarshaling data is
Marshal.load(ActiveSupport::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.
Use the ActiveRecord::Base.connection by default.
# File lib/active_record/session_store.rb, line 183
183: cattr_accessor :connection
# File lib/active_record/session_store.rb, line 207
207: def connection
208: @@connection ||= ActiveRecord::Base.connection
209: end
The data field defaults to ‘data’.
# File lib/active_record/session_store.rb, line 200
200: cattr_accessor :data_column
Look up a session by id and unmarshal its data if found.
# File lib/active_record/session_store.rb, line 212
212: def find_by_session_id(session_id)
213: if record = connection.select_one("SELECT * FROM #{@@table_name} WHERE #{@@session_id_column}=#{connection.quote(session_id)}")
214: new(:session_id => session_id, :marshaled_data => record['data'])
215: end
216: end
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.
# File lib/active_record/session_store.rb, line 227
227: def initialize(attributes)
228: @session_id = attributes[:session_id]
229: @data = attributes[:data]
230: @marshaled_data = attributes[:marshaled_data]
231: @persisted = !@marshaled_data.nil?
232: end
The session id field defaults to ‘session_id’.
# File lib/active_record/session_store.rb, line 194
194: cattr_accessor :session_id_column
Lazy-unmarshal session state.
# File lib/active_record/session_store.rb, line 235
235: def data
236: unless @data
237: if @marshaled_data
238: @data, @marshaled_data = self.class.unmarshal(@marshaled_data) || {}, nil
239: else
240: @data = {}
241: end
242: end
243: @data
244: end
# File lib/active_record/session_store.rb, line 274
274: def destroy
275: return unless @persisted
276:
277: connect = connection
278: connect.delete DELETE FROM #{table_name} WHERE #{connect.quote_column_name(session_id_column)}=#{connect.quote(session_id)}, 'Destroy session'
279: end
# File lib/active_record/session_store.rb, line 246
246: def loaded?
247: @data
248: end
# File lib/active_record/session_store.rb, line 250
250: def save
251: return false unless loaded?
252: marshaled_data = self.class.marshal(data)
253: connect = connection
254:
255: unless @persisted
256: @persisted = true
257: connect.update 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)} ), 'Create session'
258: else
259: connect.update 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)}, 'Update session'
260: end
261: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.