+#note: implementation here, POD in FS::svc_acct
+# false laziness w/above
+sub attribute_last_sqlradacct {
+ my($self, $attrib) = @_;
+
+ my $mes = "$me attribute_last_sqlradacct:";
+
+ my $svc_x = $self->svc_x;
+
+ my @part_export = $self->part_svc->part_export_usage;
+ die "no accounting-capable exports are enabled for ". $self->part_svc->svc.
+ " service definition"
+ unless @part_export;
+ #or return undef;
+
+ my $value = '';
+ my $AcctStartTime = 0;
+
+ foreach my $part_export ( @part_export ) {
+
+ next if $part_export->option('ignore_accounting');
+
+ warn "$mes connecting to sqlradius database\n"
+ if $DEBUG;
+
+ my $dbh = FS::DBI->connect( map { $part_export->option($_) }
+ qw(datasrc username password) )
+ or die "can't connect to sqlradius database: ". $FS::DBI::errstr;
+
+ warn "$mes connected to sqlradius database\n"
+ if $DEBUG;
+
+ #select a unix time conversion function based on database type
+ my $str2time = str2time_sql( $dbh->{Driver}->{Name} );
+ my $closing = str2time_sql_closing( $dbh->{Driver}->{Name} );
+
+ my $username = $part_export->export_username($svc_x);
+
+ warn "$mes finding most-recent $attrib\n"
+ if $DEBUG;
+
+ my $realm = '';
+ my $realmparam = '';
+ if ($part_export->option('process_single_realm')) {
+ $realm = 'AND Realm = ?';
+ $realmparam = $part_export->option('realm');
+ }
+
+ my $sth = $dbh->prepare("SELECT $attrib, $str2time AcctStartTime $closing
+ FROM radacct
+ WHERE UserName = ?
+ $realm
+ ORDER BY AcctStartTime DESC LIMIT 1
+ ") or die $dbh->errstr;
+ $sth->execute($username, ($realm ? $realmparam : ()) )
+ or die $sth->errstr;
+
+ my $row = $sth->fetchrow_arrayref;
+ if ( defined($row->[0]) && $row->[1] > $AcctStartTime ) {
+ $value = $row->[0];
+ $AcctStartTime = $row->[1];
+ }
+
+ warn "$mes done\n"
+ if $DEBUG;
+
+ }
+
+ $value;
+
+}
+