import torrus 1.0.9
[freeside.git] / FS / FS / session.pm
index 30d21d9..615c8ae 100644 (file)
@@ -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,13 +101,22 @@ 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;
+  }
 
   $self->nas_heartbeat($self->getfield('login'));
 
@@ -117,7 +127,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,13 +160,23 @@ 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;
+  }
 
   $self->nas_heartbeat($self->getfield('logout'));
 
@@ -167,6 +188,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;
+
   '';
 }
 
@@ -193,7 +216,7 @@ sub check {
   return $error if $error;
   return "Unknown svcnum"
     unless qsearchs('svc_acct', { 'svcnum' => $self->svcnum } );
-  '';
+  $self->SUPER::check;
 }
 
 =item nas_heartbeat
@@ -222,10 +245,6 @@ sub svc_acct {
 
 =back
 
-=head1 VERSION
-
-$Id: session.pm,v 1.5 2001-02-27 00:59:36 ivan Exp $
-
 =head1 BUGS
 
 Maybe you shouldn't be able to insert a session if there's currently an open