NAME
Catalyst::Plugin::Session::Store::DBIC - Store your sessions via DBIx::Class
SYNOPSIS
# Create a table in your database for sessions
CREATE TABLE sessions (
id CHAR(72) PRIMARY KEY,
session_data TEXT,
expires INTEGER
);
# Create the corresponding table class
package MyApp::Schema::Session;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/Core/);
__PACKAGE__->table('sessions');
__PACKAGE__->add_columns(qw/id session_data expires/);
__PACKAGE__->set_primary_key('id');
1;
# In your application
use Catalyst qw/Session Session::Store::DBIC Session::State::Cookie/;
__PACKAGE__->config(
# ... other items ...
'Plugin::Session' => {
dbic_class => 'DBIC::Session', # Assuming MyApp::Model::DBIC
expires => 3600,
},
);
# Later, in a controller action
$c->session->{foo} = 'bar';
DESCRIPTION
This Catalyst::Plugin::Session storage module saves session data in your database via DBIx::Class. It's actually just a wrapper around Catalyst::Plugin::Session::Store::Delegate; if you need complete control over how your sessions are stored, you probably want to use that instead.
METHODS
setup_finished
Hook into the configured session class.
session_store_dbic_class
Return the DBIx::Class class name to be passed to $c->model
. Defaults to DBIC::Session
.
session_store_dbic_id_field
Return the configured ID field name. Defaults to id
.
session_store_dbic_data_field
Return the configured data field name. Defaults to session_data
.
session_store_dbic_expires_field
Return the configured expires field name. Defaults to expires
.
session_store_model
Return the model used to find a session.
get_session_store_delegate
Load the row corresponding to the specified session ID. If none is found, one is automatically created.
session_store_delegate_key_to_accessor
Match the specified key and operation to the session ID and field name.
delete_session_data
Delete the specified session from the backend store.
delete_expired_sessions
Delete all expired sessions.
CONFIGURATION
The following parameters should be placed in your application configuration under the Plugin::Session
key.
dbic_class
(Required) The name of the DBIx::Class that represents a session in the database. It is recommended that you provide only the part after MyApp::Model
, e.g. DBIC::Session
.
If you are using Catalyst::Model::DBIC::Schema, the following layout is recommended:
MyApp::Schema
- your DBIx::Class::Schema classMyApp::Schema::Session
- your session table classMyApp::Model::DBIC
- your Catalyst::Model::DBIC::Schema class
This module will then use $c->model
to access the appropriate result source from the composed schema matching the dbic_class
name.
For more information, please see Catalyst::Model::DBIC::Schema.
expires
Number of seconds for which sessions are active.
Note that no automatic cleanup is done on your session data. To delete expired sessions, you can use the "delete_expired_sessions" method with Catalyst::Plugin::Scheduler.
id_field
The name of the field on your sessions table which stores the session ID. Defaults to id
.
data_field
The name of the field on your sessions table which stores session data. Defaults to session_data
for compatibility with Catalyst::Plugin::Session::Store::DBI.
expires_field
The name of the field on your sessions table which stores the expiration time of the session. Defaults to expires
.
SCHEMA
Your sessions table should contain the following columns:
id CHAR(72) PRIMARY KEY
session_data TEXT
expires INTEGER
The id
column should probably be 72 characters. It needs to handle the longest string that can be returned by "generate_session_id" in Catalyst::Plugin::Session, plus another eight characters for internal use. This is less than 72 characters when SHA-1 or MD5 is used, but SHA-256 will need all 72 characters.
The session_data
column should be a long text field. Session data is encoded using MIME::Base64 before being stored in the database.
Note that MySQL TEXT
fields only store 64 kB, so if your session data will exceed that size you'll want to use MEDIUMTEXT
, MEDIUMBLOB
, or larger. If you configure your DBIx::Class::ResultSource to include the size of the column, you will receive warnings for this problem:
This session requires 1180 bytes of storage, but your database
column 'session_data' can only store 200 bytes. Storing this
session may not be reliable; increase the size of your data field
See "add_columns" in DBIx::Class::ResultSource for more information.
The expires
column stores the future expiration time of the session. This may be null for per-user and flash sessions.
Note that you can change the column names using the "id_field", "data_field", and "expires_field" configuration parameters. However, the column types must match the above.
AUTHOR
Daniel Westermann-Clark <danieltwc@cpan.org>
ACKNOWLEDGMENTS
Andy Grundman, for Catalyst::Plugin::Session::Store::DBI
David Kamholz, for most of the testing code (from Catalyst::Plugin::Authentication::Store::DBIC)
Yuval Kogman, for assistance in converting to Catalyst::Plugin::Session::Store::Delegate
Jay Hannah, for tests and warning when session size exceeds DBIx::Class storage size.
COPYRIGHT
Copyright (c) 2006 - 2009 the Catalyst::Plugin::Session::Store::DBIC "AUTHOR" as listed above.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.