Dear Friends.

This is the script that running in for squid redirector program. From the list 
I got lots of help to properly coding it. But unfortunately that problem is 
stil there . Problem is after some times ( After 8-10 hours) , that redirect 
url doesn't functioning properly. Getting hang or crached. Meanwhile i checked 
the database status also .database is up and running.

Can somebody help me please ? where is the problem ? in the logic of the code 
or some where else ?
 


#!/usr/bin/perl
use DBI;
use strict;
use warnings;

## no buffered output, auto flush
$|=1;

my $dbh = DBI->connect("dbi:mysql:#####;localhost","####","####") || "Error 
Opening DataBase: $DBI::errstr\n";

if (!$dbh->err()) {

    while (<STDIN>) {
       chomp;
       my ($url, $x, $####) = split;
           ($###) = $### =~ /([0-9.]+)/;
       my $query = "SELECT * from ###### where ###### = '" . $#### ."' order by 
###### desc";
        my  $sth = $dbh->prepare($query);
           $sth->execute() or die "Unable to call execute $!\n\n";

       my ($####, $#####);

        next unless my $ref = $sth->fetchrow_hashref;
                       $##### = $ref->{'#####'};
                       $#### = $ref->{'####};

       if (!($url =~ m#######)) {
           if ($url =~ m#\?#) {
               $url .= "&#####=" . $##### . "-" . $#### . "-" . $#####;
           } else {
              $url .= "?#####=" .  $##### . "-" . $### . "-" . $#####;
           }
           print $url."\n";
       } else {
           print "\n";
       }
    }
}else {
    print "\n";
}
   my $sth->finish();
      $dbh->disconnect();

Thank you
Luke.




----- Original Message ----
From: Rob Dixon <[EMAIL PROTECTED]>
To: Perl <beginners@perl.org>
Cc: luke devon <[EMAIL PROTECTED]>
Sent: Monday, July 14, 2008 23:27:21
Subject: Re: Perl script doesnt behave well


luke devon wrote:
> 
> I am using perl script to handle some function of squid redirector program .
> Actually its working fine. But after some time , that functions goes off.
> That's meant VALUE-A doesnt comes in to the request.
> 
> I checked the DB , it also fine.
> CPU also nothing
> 
> Can some body help me please ? 
> 
> 
> 
> #!/usr/bin/perl
> use DBI;
> use strict;
> use warnings;
> 
> # no buffered output, auto flush
> $|=1;
> 
> my ($dbh,$sth,$dbargs,$VALUE-A,$VALUE-B,$query);

It is best to declare variables at their point of first use, unless a greater
scope is necessary, as for $VALUE-A and $VALUE-B, for which see below.

> $dbh = DBI->connect("dbi:mysql:List;localhost","root","") || "Error Opening 
> DataBase: $DBI::errstr\n";

my $dbh = DBI->connect("dbi:mysql:List;localhost","root","") or die "Error
Opening DataBase: $DBI::errstr"

> if (!$dbh->err()) {

If you test the success of the connect, above, then this test will always
succeed and there is no need for it. In any case if there is a problem then $dbh
will not be a valid database handle and so won't have an err method.


>     while (<STDIN>) {
>        chomp;
>        my ($url, $x, $ip) = split(/ /);

  my ($url, $x, $ip) = split;

is better.

>        $ip = substr($ip, 0, (length($ip)-2));

Having read your previous posts about how to extract an IP address from a
string, I believe this should be written

  ($ip) = $ip =~ /([0-9.]+)/;

and may be the source of your problem if there are not always two characters of
junk data after the IP address.

>        $query = "SELECT * from ACCOUNT where someField = '" . $ip ."' order 
> by xxx_yyy desc";
>        $sth = $dbh->prepare($query);
>        $sth->execute();


  my $query = "SELECT * from ACCOUNT where someField = ? order by xxx_yyy desc";
  my $sth = $dbh->prepare($query) or die $dbh->errstr;
  $sth->execute($ip) or die $dbh->errstr;

The scalar variables $VALUE-A and $VALUE-B should also be declared here, and
ideally have more descriptive names.

  my ($VALUE-A, $VALUE-B);

>        if (my $ref = $sth->fetchrow_hashref()) {
>            $VALUE-A = $ref->{'CallingStationId'};
>        $VALUE-B = $ref->{'AcctSessionId'};
>            
>        }else{
>            $VALUE-A = "NA";
>        }

At this point you may have a value of 'NA' for $VALUE-A and $VALUE-B could be
either undefined or, worse, have a value left over from the previous execution
of the read loop. I think you should just write

  next unless my $ref = $sth->fetchrow_hashref;
  $VALUE-A = $ref->{'CallingStationId'};
  $VALUE-B = $ref->{'AcctSessionId'};

>        if (!($url =~ m#xxxyyyy#)) {
>            if ($url =~ m#\?#) {
>               $url .= "&xxxyyyy=" . $VALUE-A . "-" . $ip . "-" . $VALUE-B;
>            } else {
>               $url .= "?xxxyyyy=" . $VALUE-A . "-" . $ip . "-" . $VALUE-B;
>            }
>            print $url."\n";
>        } else {
>            print "\n";
>        }
>     }
> }else {
>     print "\n";

It seems appropriate to do something more than just print a blank line if your
connection to the database failed.

> }
>    $sth->finish();
>    $dbh->commit();
>    
>    $dbh->disconnect();



HTH,

Rob

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/

Send instant messages to your online friends http://uk.messenger.yahoo.com 

Reply via email to