Apache-Session-DBMS

 view release on metacpan or  search on metacpan

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

			$datasource = $3;
		} elsif( $session->{data}->{_session_id} =~ m|^\s*dbms://([^/]+)/([^\s]+)| ) {
			$host = $1;
			$port = $session->{args}->{Port} ||
				$Apache::Session::Store::DBMS::Port;
			$datasource = $2;
		} else {
			die "Invalid session identifier ".$session->{data}->{_session_id};
			};
	} elsif(	( exists $session->{args}->{DataSource} ) &&
			( $session->{args}->{DataSource} =~ m|^\s*dbms://| ) ) {
		if( $session->{args}->{DataSource} =~ m|^\s*dbms://([^:]+):(\d+)/([^\s]+)| ) {
			$host = $1;
			$port = $2;
			$datasource = $3;
		} elsif( $session->{args}->{DataSource} =~ m|^\s*dbms://([^/]+)/([^\s]+)| ) {
			$host = $1;
			$port = $session->{args}->{Port} ||
				$Apache::Session::Store::DBMS::Port;
			$datasource = $2;
		} else {
			die "Invalid session identifier ".$session->{data}->{_session_id};
			};
	} else {
		$datasource = $session->{args}->{DataSource} ||
        		$Apache::Session::Store::DBMS::DataSource;
		$host = $session->{args}->{Host} ||
			$Apache::Session::Store::DBMS::Host;
		$port = $session->{args}->{Port} ||
			$Apache::Session::Store::DBMS::Port;
		};

#print "TIE: $datasource, $mode, $bt_compare, $host, $port (session_id=".$session->{data}->{_session_id}.")\n";

	$self->{dbh} = tie %{$self->{dbms}}, 'DBMS', $datasource, $mode, $bt_compare, $host, $port
		or die $DBMS::ERROR."\n";
	};

sub new {
	my $class = shift;

	return bless {dbms => {}}, $class;
	};

sub insert {
	my $self    = shift;
	my $session = shift;
    
	return
		if( $session->{isObjectPerKey} );

	$self->connection($session);

	if (exists $self->{dbms}->{$session->{data}->{_session_id}}) {
		die "Object already exists in the data store";
		};

	$self->{dbms}->{$session->{data}->{_session_id}} = $session->{serialized}; # single session-id object
	};

sub update {
	my $self = shift;
	my $session = shift;
    
	return
		if( $session->{isObjectPerKey} );

	$self->connection($session);

	$self->{dbms}->{$session->{data}->{_session_id}} = $session->{serialized}
		if(defined $session->{data}->{_session_id});
	};

sub materialize {
	my $self = shift;
	my $session = shift;
    
	return
		if( $session->{isObjectPerKey} );

	$self->connection($session);

	$session->{serialized} = $self->{dbms}->{$session->{data}->{_session_id}};

	if (!defined $session->{serialized}) {
		die "Object does not exist in data store";
		};
	};

sub remove {
	my $self = shift;
	my $session = shift;
    
	return
		if( $session->{isObjectPerKey} );

	$self->connection($session);

	delete $self->{dbms}->{$session->{data}->{_session_id}};
	};

sub DESTROY {
	my $self = shift;

	if(defined $self->{dbh}) {
		delete $self->{dbh};
		untie %{$self->{dbms}};
		};
	};

1;

=pod

=head1 NAME

Apache::Session::Store::DBMS - Use DBMS to store persistent objects

=head1 SYNOPSIS

 use Apache::Session::Store::DBMS;



( run in 0.673 second using v1.01-cache-2.11-cpan-9581c071862 )