summaryrefslogtreecommitdiff
path: root/FS/FS/session.pm
diff options
context:
space:
mode:
authorivan <ivan>2001-04-09 23:05:16 +0000
committerivan <ivan>2001-04-09 23:05:16 +0000
commit15f65a0c56cbce6951d9cb4f71119725a2009f79 (patch)
treea167652e2d03e0da125dffb880f1542fb98e4e60 /FS/FS/session.pm
parent0281069f3cd7f8caab7768cd818b088991b62117 (diff)
Transactions Part I!!!
Diffstat (limited to 'FS/FS/session.pm')
-rw-r--r--FS/FS/session.pm39
1 files changed, 32 insertions, 7 deletions
diff --git a/FS/FS/session.pm b/FS/FS/session.pm
index 30d21d9..55bb678 100644
--- a/FS/FS/session.pm
+++ b/FS/FS/session.pm
@@ -2,6 +2,7 @@ package FS::session;
use strict;
use vars qw( @ISA $conf $start $stop );
+use FS::UID qw( dbh );
use FS::Record qw( qsearchs );
use FS::svc_acct;
use FS::port;
@@ -100,14 +101,24 @@ sub insert {
$error = $self->check;
return $error if $error;
- return "a session on that port is already open!"
- if qsearchs('session', { 'portnum' => $self->portnum, 'logout' => '' } );
+ my $oldAutoCommit = $FS::UID::AutoCommit;
+ local $FS::UID::AutoCommit = 0;
+ my $dbh = dbh;
+
+ if ( qsearchs('session', { 'portnum' => $self->portnum, 'logout' => '' } ) ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "a session on that port is already open!";
+ }
$self->setfield('login', time()) unless $self->getfield('login');
$error = $self->SUPER::insert;
- return $error if $error;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ #transactional accuracy not essential; just an indication of data freshness
$self->nas_heartbeat($self->getfield('login'));
#session-starting callback
@@ -117,7 +128,8 @@ sub insert {
#kcuy
my( $ip, $nasip, $nasfqdn ) = ( $port->ip, $nas->nasip, $nas->nasfqdn );
system( eval qq("$start") ) if $start;
-
+
+ $dbh->commit or die $dbh->errstr if $oldAutoCommit;
'';
}
@@ -149,14 +161,25 @@ sub replace {
local $SIG{TSTP} = 'IGNORE';
local $SIG{PIPE} = 'IGNORE';
+ my $oldAutoCommit = $FS::UID::AutoCommit;
+ local $FS::UID::AutoCommit = 0;
+ my $dbh = dbh;
+
$error = $self->check;
- return $error if $error;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
$self->setfield('logout', time()) unless $self->getfield('logout');
$error = $self->SUPER::replace($old);
- return $error if $error;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ #transactional accuracy not essential; just an indication of data freshness
$self->nas_heartbeat($self->getfield('logout'));
#session-ending callback
@@ -167,6 +190,8 @@ sub replace {
my( $ip, $nasip, $nasfqdn ) = ( $port->ip, $nas->nasip, $nas->nasfqdn );
system( eval qq("$stop") ) if $stop;
+ $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+
'';
}
@@ -224,7 +249,7 @@ sub svc_acct {
=head1 VERSION
-$Id: session.pm,v 1.5 2001-02-27 00:59:36 ivan Exp $
+$Id: session.pm,v 1.6 2001-04-09 23:05:15 ivan Exp $
=head1 BUGS