Egg-Plugin-SessionKit

 view release on metacpan or  search on metacpan

lib/Egg/Model/Session/Base/DBIC.pm  view on Meta::CPAN

	no strict 'refs';  ## no critic.
	no warnings 'redefine';
	if ($e->isa('Egg::Plugin::DBIC')) {
		$e->is_model($s_label) || die qq{'$s_label' model is not found.};
		my $s_name= $s_label=~m{^dbic\:+(.+)} ? $1: $s_label;
		*{"${class}::_begin"}= sub {
			&{"${project}::begin_$s_name"}($_[0]->e);
		  };
		*{"${class}::_commit"}= sub {
			&{"${project}::commit_ok"}($_[0]->e, $s_name, 1) if $_[1];
		  };
	} else {
		my $schema= $e->model($s_label)
		    || die qq{'$s_label' model is not found.};
		if ($schema->storage->dbh->{AutoCommit}) {
			*{"${class}::_begin"} = sub { $_[0]->e->model($s_label) };
			*{"${class}::_commit"}= sub { 1 };
		} else {
			*{"${class}::_begin"}= sub {
				my $context= $_[0]->e->model($s_label);
				$context->txn_begin;
				$context;
			  };
			*{"${class}::_commit"}= sub {
				$_[1] ? $_[0]->_schema->txn_commit
				      : $_[0]->_schema->txn_rollback;
			  };
		}
	}
	*{"${class}::moniker"}= sub {
		$_[0]->attr->{dbic_moniker} ||= $_[0]->e->model($moniker);
	  };
	*{"${class}::result"}= sub {
		my $self= shift;
		return ($self->attr->{result} || 0) unless @_;
		$self->attr->{result}= shift;
	  };
	*{"${class}::id_col"}   = sub { $idcol   };
	*{"${class}::data_col"} = sub { $datacol };
	*{"${class}::time_col"} = sub { $timecol };
	$class->next::method($e);
}
sub restore {
	my $self= shift;
	my $id  = shift || $self->session_id || croak q{I want session id.};
	my $result = $self->moniker->find($id) || return 0;
	my $datacol= $self->data_col;
	\$self->result($result)->$datacol;
}
sub insert {
	my $self= shift;
	my $data= shift || croak q{I want session data.};
	my $id  = shift || $self->session_id || croak q{I want session id.};
#	$self->result(undef) if $self->result;
	$self->moniker->create({
	  $self->id_col   => $id,
	  $self->data_col => $$data,
	  $self->time_col => localtime(time)->mysql_datetime,
	  });
}
sub update {
	my $self= shift;
	my $data= shift || croak q{I want session data.};
	my $id  = shift || $self->session_id || croak q{I want session id.};
	return $self->insert($data, $id) unless $self->result;
	my($datacol, $timecol)= ($self->data_col, $self->time_col);
	$self->result->$timecol( localtime(time)->mysql_datetime );
	$self->result->$datacol( $$data );
	$self->result->update;
}
sub close {
	my($self)= @_;
	my $update_ok= $self->is_update;
	$self->next::method;
	$self->_commit($update_ok);
	$self;
}

1;

__END__

=head1 NAME

Egg::Model::Session::Base::DBIC - Session management by DBIC.

=head1 SYNOPSIS

  package MyApp::Model::Sesion;
  
  __PACKAGE__->config(
   dbic => {
     label_schema  => 'dbic_schma_label',
     label_source  => 'dbic_moniker_label',
     id_field      => 'id',
     data_field    => 'a_session',
     time_field    => 'lastmod',
     },
   );
  
  __PACKAGE__->startup(
   Base::DBIC
   Store::Base64
   ID::SHA1
   Bind::Cookie
   );

=head1 DESCRIPTION

The session data is preserved by using DBIC.

'L<Egg::Model::DBIC>' should be able to be used for use.

And, 'Base::DBIC' is added to startup of the component module generated with 
L<Egg::Helper::Model::Session>. Base::FileCache of default's It is not possible
to cooperate and delete it, please.

Moreover, it is necessary to load Store system module to treat the session data 
appropriately.

  __PACKAGE__->startup(



( run in 1.140 second using v1.01-cache-2.11-cpan-39bf76dae61 )