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 160 cattr_accessor :connection
# File lib/active_record/session_store.rb, line 200 def create_table! @@connection.execute CREATE TABLE #{table_name} ( id INTEGER PRIMARY KEY, #{@@connection.quote_column_name(session_id_column)} TEXT UNIQUE, #{@@connection.quote_column_name(data_column)} TEXT ) end
The data field defaults to 'data'.
# File lib/active_record/session_store.rb, line 177 cattr_accessor :data_column
# File lib/active_record/session_store.rb, line 210 def drop_table! @@connection.execute "DROP TABLE #{table_name}" end
Look up a session by id and unmarshal its data if found.
# File lib/active_record/session_store.rb, line 186 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
# File lib/active_record/session_store.rb, line 192 def marshal(data) ActiveSupport::Base64.encode64(Marshal.dump(data)) if data 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 221 def initialize(attributes) @session_id, @data, @marshaled_data = attributes[:session_id], attributes[:data], attributes[:marshaled_data] @new_record = @marshaled_data.nil? end
The session id field defaults to 'session_id'.
# File lib/active_record/session_store.rb, line 171 cattr_accessor :session_id_column
Lazy-unmarshal session state.
# File lib/active_record/session_store.rb, line 231 def data unless @data if @marshaled_data @data, @marshaled_data = self.class.unmarshal(@marshaled_data) || {}, nil else @data = {} end end @data end
# File lib/active_record/session_store.rb, line 269 def destroy unless @new_record @@connection.delete DELETE FROM #{@@table_name} WHERE #{@@connection.quote_column_name(@@session_id_column)}=#{@@connection.quote(session_id)}, 'Destroy session' end end
# File lib/active_record/session_store.rb, line 242 def loaded? !!@data end
# File lib/active_record/session_store.rb, line 226 def new_record? @new_record end
# File lib/active_record/session_store.rb, line 246 def save return false if !loaded? marshaled_data = self.class.marshal(data) if @new_record @new_record = false @@connection.update INSERT INTO #{@@table_name} ( #{@@connection.quote_column_name(@@session_id_column)}, #{@@connection.quote_column_name(@@data_column)} ) VALUES ( #{@@connection.quote(session_id)}, #{@@connection.quote(marshaled_data)} ), 'Create session' else @@connection.update UPDATE #{@@table_name} SET #{@@connection.quote_column_name(@@data_column)}=#{@@connection.quote(marshaled_data)} WHERE #{@@connection.quote_column_name(@@session_id_column)}=#{@@connection.quote(session_id)}, 'Update session' end end
Generated with the Darkfish Rdoc Generator 2.