Parent

Files

Class/Module 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

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.

Attributes

data[W]
session_id[R]

Public Class Methods

connection click to toggle source

Use the ActiveRecord::Base.connection by default.

# File lib/active_record/session_store.rb, line 160
cattr_accessor :connection
create_table!() click to toggle source
# 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
data_column click to toggle source

The data field defaults to ‘data’.

# File lib/active_record/session_store.rb, line 177
cattr_accessor :data_column
drop_table!() click to toggle source
# File lib/active_record/session_store.rb, line 210
def drop_table!
  @@connection.execute "DROP TABLE #{table_name}"
end
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 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
marshal(data) click to toggle source
# File lib/active_record/session_store.rb, line 192
def marshal(data)
  ActiveSupport::Base64.encode64(Marshal.dump(data)) if data
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 221
def initialize(attributes)
  @session_id, @data, @marshaled_data = attributes[:session_id], attributes[:data], attributes[:marshaled_data]
  @new_record = @marshaled_data.nil?
end
session_id_column click to toggle source

The session id field defaults to ‘session_id’.

# File lib/active_record/session_store.rb, line 171
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 165
cattr_accessor :table_name
unmarshal(data) click to toggle source
# File lib/active_record/session_store.rb, line 196
def unmarshal(data)
  Marshal.load(ActiveSupport::Base64.decode64(data)) if data
end

Public Instance Methods

data() click to toggle source

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
destroy() click to toggle source
# 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
loaded?() click to toggle source
# File lib/active_record/session_store.rb, line 242
def loaded?
  !!@data
end
new_record?() click to toggle source
# File lib/active_record/session_store.rb, line 226
def new_record?
  @new_record
end
save() click to toggle source
# 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

[Validate]

Generated with the Darkfish Rdoc Generator 2.