Apache-Session-Browseable

 view release on metacpan or  search on metacpan

lib/Apache/Session/Browseable/Store/SQLite.pm  view on Meta::CPAN

package Apache::Session::Browseable::Store::SQLite;

use strict;

use DBI;
use Apache::Session::Store::DBI;
use Apache::Session::Browseable::Store::DBI;

our @ISA     = qw(Apache::Session::Browseable::Store::DBI Apache::Session::Store::DBI);
our $VERSION = '1.2.7';

$Apache::Session::Browseable::Store::SQLite::DataSource = undef;

sub connection {
    my $self    = shift;
    my $session = shift;

    return if ( defined $self->{dbh} );
    $session->{args}->{Commit} =
      exists( $session->{args}->{Commit} ) ? $session->{args}->{Commit} : 1;

    $self->{'table_name'} = $session->{args}->{TableName}
      || $Apache::Session::Store::DBI::TableName;

    if ( exists $session->{args}->{Handle} ) {
        $self->{dbh}    = $session->{args}->{Handle};
        $self->{commit} = $session->{args}->{Commit};
        return;
    }

    my $datasource = $session->{args}->{DataSource}
      || $Apache::Session::Store::MySQL::DataSource;

    $self->{dbh} =
      DBI->connect( $datasource, '', '', { RaiseError => 1, AutoCommit => 0 } )
      || die $DBI::errstr;
    $self->{dbh}->{sqlite_unicode} = 1;

    #If we open the connection, we close the connection
    $self->{disconnect} = 1;

    #the programmer has to tell us what commit policy to use
    $self->{commit} = $session->{args}->{Commit};
}

sub materialize {
    my $self    = shift;
    my $session = shift;

    $self->connection($session);

    local $self->{dbh}->{RaiseError} = 1;

    if ( !defined $self->{materialize_sth} ) {
        $self->{materialize_sth} = $self->{dbh}->prepare_cached(
            qq{
                SELECT a_session FROM $self->{'table_name'} WHERE id = ?}
        );
    }

    $self->{materialize_sth}->bind_param( 1, $session->{data}->{_session_id} );

    $self->{materialize_sth}->execute;

    my $results = $self->{materialize_sth}->fetchrow_arrayref;

    if ( !( defined $results ) ) {
        $self->{materialize_sth}->finish;
        die "Object does not exist in the data store";
    }

    $self->{materialize_sth}->finish;

    $session->{serialized} = $results->[0];
}

sub DESTROY {
    my $self = shift;

    if ( $self->{commit} ) {
        $self->{dbh}->commit;
    }

    if ( $self->{disconnect} ) {
        $self->{dbh}->disconnect;
    }
}

1;

=pod

=head1 NAME

Apache::Session::Browseable::Store::SQLite - Store persistent data in a SQLite
database

=head1 SYNOPSIS

 use Apache::Session::Browseable::Store::SQLite;

 my $store = new Apache::Session::Browseable::Store::SQLite;

 $store->insert($ref);
 $store->update($ref);
 $store->materialize($ref);
 $store->remove($ref);

=head1 DESCRIPTION

Apache::Session::Browseable::Store::SQLite fulfills the storage interface of
Apache::Session. Session data is stored in a SQLite database.

=head1 SCHEMA

To use this module, you will need at least these columns in a table
called 'sessions', or another name if you supply the TableName parameter.

 id char(32)     # or however long your session IDs are.
 a_session text  # This has an ~8 KB limit :(



( run in 0.953 second using v1.01-cache-2.11-cpan-2398b32b56e )