unsubscribe sifat@spnetctg.com

Md .Sifat Ullah Patwary sifat at spnetctg.com
Tue May 14 02:58:21 PDT 2002


-----Original Message-----
From: ivan <ivan at 420.am>
To: ivan-freeside-devel at sisd.com <ivan-freeside-devel at sisd.com>
Date: Tuesday, May 14, 2002 1:36 PM
Subject: Re: [freeside-devel] FS::part_export::sqlradius::_export_replace


>
>On Mon, May 13, 2002 at 08:42:35PM -0700, Kristian Hoffmann wrote:
>> On Mon, 13 May 2002, ivan wrote:
>>
>> > It shouldn't do that.  Although, admittedly, the naming of the `insert'
>> > subroutine is confusing, take an actual look at the code - it's
supposed
>> > to attempt to update an existing value before inserting a new one:
>>
>> When it does and UPDATE on any of the items that haven't changed, the
>> return value is 0 because nothing was changed.  It then falls through to
>> the INSERT and adds a duplicate row.  If you specify
>> "mysql_client_found_rows=1" in the datasrc, DBD::mysql::execute returns
>> the number of rows that were matched, not updated, when doing an UPDATE.
>>
>> Soooo, update TFM or TFS?
>
>Hmm, I think it was a bad idea to use the return value of the update
>command in the first place.  Maybe try this (or grab sqlradius.pm from
>CVS) and let me know if it fixes the problem:
>
>Index: sqlradius.pm
>===================================================================
>RCS file: /home/cvs/cvsroot/freeside/FS/FS/part_export/sqlradius.pm,v
>retrieving revision 1.2
>diff -u -r1.2 sqlradius.pm
>--- sqlradius.pm        2002/04/17 20:43:45     1.2
>+++ sqlradius.pm        2002/05/14 07:30:24
>@@ -108,18 +108,34 @@
>
> sub sqlradius_insert { #subroutine, not method
>   my $dbh = sqlradius_connect(shift, shift, shift);
>-  my( $replycheck, $username, %attributes ) = @_;
>+  my( $table, $username, %attributes ) = @_;
>
>   foreach my $attribute ( keys %attributes ) {
>-    my $u_sth = $dbh->prepare(
>-      "UPDATE rad$replycheck SET Value = ? WHERE UserName = ? AND
Attribute = ?"    ) or die $dbh->errstr;
>-    my $i_sth = $dbh->prepare(
>-      "INSERT INTO rad$replycheck ( id, UserName, Attribute, Value ) ".
>-        "VALUES ( ?, ?, ?, ? )"
>+
>+    my $s_sth = $dbh->prepare(
>+      "SELECT COUNT(*) FROM rad$table WHERE UserName = ? AND Attribute =
?"
>     ) or die $dbh->errstr;
>-    $u_sth->execute($attributes{$attribute}, $username, $attribute) > 0
>-      or $i_sth->execute( '', $username, $attribute,
$attributes{$attribute} )
>-        or die "can't insert into rad$replycheck table: ". $i_sth->errstr;
>+    $s_sth->execute( $username, $attribute ) or die $s_sth->errstr;
>+
>+    if ( $s_sth->fetchrow_arrayref->[0] ) {
>+
>+      my $u_sth = $dbh->prepare(
>+        "UPDATE rad$table SET Value = ? WHERE UserName = ? AND Attribute =
?"
>+      ) or die $dbh->errstr;
>+      $u_sth->execute($attributes{$attribute}, $username, $attribute)
>+        or die $u_sth->errstr;
>+
>+    } else {
>+
>+      my $i_sth = $dbh->prepare(
>+        "INSERT INTO rad$table ( id, UserName, Attribute, Value ) ".
>+          "VALUES ( ?, ?, ?, ? )"
>+      ) or die $dbh->errstr;
>+      $i_sth->execute( '', $username, $attribute, $attributes{$attribute}
>)
>+        or die $i_sth->errstr;
>+
>+    }
>+
>   }
>   $dbh->disconnect;
> }
>
>--
>_ivan
>




More information about the freeside-devel mailing list