Parent

Files

Class Index [+]

Quicksearch

ActiveRecord::SessionStore::SqlBypass

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.

Attributes

connection[W]

Use the ActiveRecord::Base.connection by default.

connection_pool[W]

Use the ActiveRecord::Base.connection_pool by default.

session_id[R]
new_record[R]
data[W]

Public Class Methods

connection() click to toggle source
     # File lib/active_record/session_store.rb, line 211
211:         def connection
212:           @connection ||= ActiveRecord::Base.connection
213:         end
connection_pool() click to toggle source
     # File lib/active_record/session_store.rb, line 215
215:         def connection_pool
216:           @connection_pool ||= ActiveRecord::Base.connection_pool
217:         end
data_column click to toggle source

The data field defaults to ‘data’.

     # File lib/active_record/session_store.rb, line 199
199:       cattr_accessor :data_column
find_by_session_id(session_id) click to toggle source

Look up a session by id and unmarshal its data if found.

     # File lib/active_record/session_store.rb, line 220
220:         def find_by_session_id(session_id)
221:           if record = connection.select_one("SELECT * FROM #{@@table_name} WHERE #{@@session_id_column}=#{connection.quote(session_id)}")
222:             new(:session_id => session_id, :marshaled_data => record['data'])
223:           end
224:         end
new(attributes) click to toggle source

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 237
237:       def initialize(attributes)
238:         @session_id     = attributes[:session_id]
239:         @data           = attributes[:data]
240:         @marshaled_data = attributes[:marshaled_data]
241:         @new_record     = @marshaled_data.nil?
242:       end
session_id_column click to toggle source

The session id field defaults to ‘session_id’.

     # File lib/active_record/session_store.rb, line 193
193:       cattr_accessor :session_id_column
table_name click to toggle source

The table name defaults to ‘sessions’.

     # File lib/active_record/session_store.rb, line 187
187:       cattr_accessor :table_name

Public Instance Methods

data() click to toggle source

Lazy-unmarshal session state.

     # File lib/active_record/session_store.rb, line 245
245:       def data
246:         unless @data
247:           if @marshaled_data
248:             @data, @marshaled_data = self.class.unmarshal(@marshaled_data) || {}, nil
249:           else
250:             @data = {}
251:           end
252:         end
253:         @data
254:       end
destroy() click to toggle source
     # File lib/active_record/session_store.rb, line 284
284:       def destroy
285:         return if @new_record
286: 
287:         connect = connection
288:         connect.delete           DELETE FROM #{table_name}          WHERE #{connect.quote_column_name(session_id_column)}=#{connect.quote(session_id)}, 'Destroy session'
289:       end
loaded?() click to toggle source
     # File lib/active_record/session_store.rb, line 256
256:       def loaded?
257:         @data
258:       end
save() click to toggle source
     # File lib/active_record/session_store.rb, line 260
260:       def save
261:         return false unless loaded?
262:         marshaled_data = self.class.marshal(data)
263:         connect        = connection
264: 
265:         if @new_record
266:           @new_record = false
267:           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'
268:         else
269:           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'
270:         end
271:       end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.